@vibecheckai/cli 3.4.0 → 3.5.1
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 +154 -338
- package/bin/runners/context/generators/mcp.js +13 -15
- package/bin/runners/context/proof-context.js +1 -248
- package/bin/runners/lib/analysis-core.js +180 -198
- package/bin/runners/lib/analyzers.js +223 -1669
- package/bin/runners/lib/cli-output.js +210 -242
- package/bin/runners/lib/detectors-v2.js +785 -547
- package/bin/runners/lib/entitlements-v2.js +458 -96
- package/bin/runners/lib/error-handler.js +9 -16
- package/bin/runners/lib/global-flags.js +0 -37
- package/bin/runners/lib/route-truth.js +322 -1167
- package/bin/runners/lib/scan-output.js +469 -448
- package/bin/runners/lib/ship-output.js +27 -280
- package/bin/runners/lib/terminal-ui.js +733 -231
- package/bin/runners/lib/truth.js +321 -1004
- package/bin/runners/lib/unified-output.js +158 -162
- package/bin/runners/lib/upsell.js +204 -104
- package/bin/runners/runAllowlist.js +324 -0
- package/bin/runners/runAuth.js +95 -324
- package/bin/runners/runCheckpoint.js +21 -39
- package/bin/runners/runContext.js +24 -136
- package/bin/runners/runDoctor.js +67 -115
- package/bin/runners/runEvidencePack.js +219 -0
- package/bin/runners/runFix.js +5 -6
- package/bin/runners/runGuard.js +118 -212
- package/bin/runners/runInit.js +2 -14
- package/bin/runners/runInstall.js +281 -0
- package/bin/runners/runLabs.js +341 -0
- package/bin/runners/runMcp.js +52 -130
- package/bin/runners/runPolish.js +20 -43
- package/bin/runners/runProve.js +3 -13
- package/bin/runners/runReality.js +0 -14
- package/bin/runners/runReport.js +2 -3
- package/bin/runners/runScan.js +44 -511
- package/bin/runners/runShip.js +14 -28
- package/bin/runners/runValidate.js +2 -19
- package/bin/runners/runWatch.js +54 -118
- package/bin/vibecheck.js +41 -148
- package/mcp-server/ARCHITECTURE.md +339 -0
- package/mcp-server/__tests__/cache.test.ts +313 -0
- package/mcp-server/__tests__/executor.test.ts +239 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/.cache/webpack/cache.pack +1 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/.next/server/chunk.js +3 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/.turbo/cache.json +3 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/.venv/lib/env.py +3 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/dist/bundle.js +3 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/package.json +5 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/src/app.ts +5 -0
- package/mcp-server/__tests__/fixtures/exclusion-test/venv/lib/config.py +4 -0
- package/mcp-server/__tests__/ids.test.ts +345 -0
- package/mcp-server/__tests__/integration/tools.test.ts +410 -0
- package/mcp-server/__tests__/registry.test.ts +365 -0
- package/mcp-server/__tests__/sandbox.test.ts +323 -0
- package/mcp-server/__tests__/schemas.test.ts +372 -0
- package/mcp-server/benchmarks/run-benchmarks.ts +304 -0
- package/mcp-server/examples/doctor.request.json +14 -0
- package/mcp-server/examples/doctor.response.json +53 -0
- package/mcp-server/examples/error.response.json +15 -0
- package/mcp-server/examples/scan.request.json +14 -0
- package/mcp-server/examples/scan.response.json +108 -0
- package/mcp-server/handlers/tool-handler.ts +671 -0
- package/mcp-server/index-v3.ts +293 -0
- package/mcp-server/index.js +1072 -1573
- package/mcp-server/index.old.js +4137 -0
- package/mcp-server/lib/cache.ts +341 -0
- package/mcp-server/lib/errors.ts +346 -0
- package/mcp-server/lib/executor.ts +792 -0
- package/mcp-server/lib/ids.ts +238 -0
- package/mcp-server/lib/logger.ts +368 -0
- package/mcp-server/lib/metrics.ts +365 -0
- package/mcp-server/lib/sandbox.ts +337 -0
- package/mcp-server/lib/validator.ts +229 -0
- package/mcp-server/package-lock.json +165 -0
- package/mcp-server/package.json +32 -7
- package/mcp-server/premium-tools.js +2 -2
- package/mcp-server/registry/tools.json +476 -0
- package/mcp-server/schemas/error-envelope.schema.json +125 -0
- package/mcp-server/schemas/finding.schema.json +167 -0
- package/mcp-server/schemas/report-artifact.schema.json +88 -0
- package/mcp-server/schemas/run-request.schema.json +75 -0
- package/mcp-server/schemas/verdict.schema.json +168 -0
- package/mcp-server/tier-auth.d.ts +71 -0
- package/mcp-server/tier-auth.js +371 -183
- package/mcp-server/truth-context.js +90 -131
- package/mcp-server/truth-firewall-tools.js +1000 -1611
- package/mcp-server/tsconfig.json +34 -0
- package/mcp-server/vibecheck-tools.js +2 -2
- package/mcp-server/vitest.config.ts +16 -0
- package/package.json +3 -4
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +0 -474
- package/bin/runners/lib/agent-firewall/change-packet/builder.js +0 -488
- package/bin/runners/lib/agent-firewall/change-packet/schema.json +0 -228
- package/bin/runners/lib/agent-firewall/change-packet/store.js +0 -200
- package/bin/runners/lib/agent-firewall/claims/claim-types.js +0 -21
- package/bin/runners/lib/agent-firewall/claims/extractor.js +0 -303
- package/bin/runners/lib/agent-firewall/claims/patterns.js +0 -24
- package/bin/runners/lib/agent-firewall/critic/index.js +0 -151
- package/bin/runners/lib/agent-firewall/critic/judge.js +0 -432
- package/bin/runners/lib/agent-firewall/critic/prompts.js +0 -305
- package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +0 -88
- package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +0 -75
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +0 -127
- package/bin/runners/lib/agent-firewall/evidence/resolver.js +0 -102
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +0 -213
- package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +0 -145
- package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +0 -19
- package/bin/runners/lib/agent-firewall/fs-hook/installer.js +0 -87
- package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +0 -184
- package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +0 -163
- package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +0 -107
- package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +0 -68
- package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +0 -66
- package/bin/runners/lib/agent-firewall/interceptor/base.js +0 -304
- package/bin/runners/lib/agent-firewall/interceptor/cursor.js +0 -35
- package/bin/runners/lib/agent-firewall/interceptor/vscode.js +0 -35
- package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +0 -34
- package/bin/runners/lib/agent-firewall/lawbook/distributor.js +0 -465
- package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +0 -604
- package/bin/runners/lib/agent-firewall/lawbook/index.js +0 -304
- package/bin/runners/lib/agent-firewall/lawbook/registry.js +0 -514
- package/bin/runners/lib/agent-firewall/lawbook/schema.js +0 -420
- package/bin/runners/lib/agent-firewall/logger.js +0 -141
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +0 -90
- package/bin/runners/lib/agent-firewall/policy/engine.js +0 -103
- package/bin/runners/lib/agent-firewall/policy/loader.js +0 -451
- package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +0 -50
- package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +0 -50
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +0 -86
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +0 -162
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +0 -189
- package/bin/runners/lib/agent-firewall/policy/rules/scope.js +0 -93
- package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +0 -57
- package/bin/runners/lib/agent-firewall/policy/schema.json +0 -183
- package/bin/runners/lib/agent-firewall/policy/verdict.js +0 -54
- package/bin/runners/lib/agent-firewall/proposal/extractor.js +0 -394
- package/bin/runners/lib/agent-firewall/proposal/index.js +0 -212
- package/bin/runners/lib/agent-firewall/proposal/schema.js +0 -251
- package/bin/runners/lib/agent-firewall/proposal/validator.js +0 -386
- package/bin/runners/lib/agent-firewall/reality/index.js +0 -332
- package/bin/runners/lib/agent-firewall/reality/state.js +0 -625
- package/bin/runners/lib/agent-firewall/reality/watcher.js +0 -322
- package/bin/runners/lib/agent-firewall/risk/index.js +0 -173
- package/bin/runners/lib/agent-firewall/risk/scorer.js +0 -328
- package/bin/runners/lib/agent-firewall/risk/thresholds.js +0 -321
- package/bin/runners/lib/agent-firewall/risk/vectors.js +0 -421
- package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +0 -472
- package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +0 -346
- package/bin/runners/lib/agent-firewall/simulator/index.js +0 -181
- package/bin/runners/lib/agent-firewall/simulator/route-validator.js +0 -380
- package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +0 -661
- package/bin/runners/lib/agent-firewall/time-machine/index.js +0 -267
- package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +0 -436
- package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +0 -490
- package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +0 -530
- package/bin/runners/lib/agent-firewall/truthpack/index.js +0 -67
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +0 -137
- package/bin/runners/lib/agent-firewall/unblock/planner.js +0 -337
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +0 -118
- package/bin/runners/lib/api-client.js +0 -269
- package/bin/runners/lib/authority-badge.js +0 -425
- package/bin/runners/lib/engines/accessibility-engine.js +0 -190
- package/bin/runners/lib/engines/api-consistency-engine.js +0 -162
- package/bin/runners/lib/engines/ast-cache.js +0 -99
- package/bin/runners/lib/engines/code-quality-engine.js +0 -255
- package/bin/runners/lib/engines/console-logs-engine.js +0 -115
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +0 -268
- package/bin/runners/lib/engines/dead-code-engine.js +0 -198
- package/bin/runners/lib/engines/deprecated-api-engine.js +0 -226
- package/bin/runners/lib/engines/empty-catch-engine.js +0 -150
- package/bin/runners/lib/engines/file-filter.js +0 -131
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +0 -251
- package/bin/runners/lib/engines/mock-data-engine.js +0 -272
- package/bin/runners/lib/engines/parallel-processor.js +0 -71
- package/bin/runners/lib/engines/performance-issues-engine.js +0 -265
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +0 -243
- package/bin/runners/lib/engines/todo-fixme-engine.js +0 -115
- package/bin/runners/lib/engines/type-aware-engine.js +0 -152
- package/bin/runners/lib/engines/unsafe-regex-engine.js +0 -225
- package/bin/runners/lib/engines/vibecheck-engines/README.md +0 -53
- package/bin/runners/lib/engines/vibecheck-engines/index.js +0 -15
- 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/hardcoded-secrets-engine.js +0 -139
- 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/bin/runners/lib/engines/vibecheck-engines/package.json +0 -13
- package/bin/runners/lib/exit-codes.js +0 -275
- package/bin/runners/lib/fingerprint.js +0 -377
- package/bin/runners/lib/help-formatter.js +0 -413
- package/bin/runners/lib/logger.js +0 -38
- package/bin/runners/lib/ship-output-enterprise.js +0 -239
- package/bin/runners/lib/unified-cli-output.js +0 -604
- package/bin/runners/runAgent.d.ts +0 -5
- package/bin/runners/runAgent.js +0 -161
- package/bin/runners/runApprove.js +0 -1200
- package/bin/runners/runClassify.js +0 -859
- package/bin/runners/runContext.d.ts +0 -4
- package/bin/runners/runFirewall.d.ts +0 -5
- package/bin/runners/runFirewall.js +0 -134
- package/bin/runners/runFirewallHook.d.ts +0 -5
- package/bin/runners/runFirewallHook.js +0 -56
- package/bin/runners/runPolish.d.ts +0 -4
- package/bin/runners/runProof.zip +0 -0
- package/bin/runners/runTruth.d.ts +0 -5
- package/bin/runners/runTruth.js +0 -101
- package/mcp-server/HARDENING_SUMMARY.md +0 -299
- package/mcp-server/agent-firewall-interceptor.js +0 -500
- package/mcp-server/authority-tools.js +0 -569
- package/mcp-server/conductor/conflict-resolver.js +0 -588
- package/mcp-server/conductor/execution-planner.js +0 -544
- package/mcp-server/conductor/index.js +0 -377
- package/mcp-server/conductor/lock-manager.js +0 -615
- package/mcp-server/conductor/request-queue.js +0 -550
- package/mcp-server/conductor/session-manager.js +0 -500
- package/mcp-server/conductor/tools.js +0 -510
- package/mcp-server/lib/api-client.cjs +0 -13
- package/mcp-server/lib/logger.cjs +0 -30
- package/mcp-server/logger.js +0 -173
- package/mcp-server/tools-v3.js +0 -706
- package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
package/bin/runners/runAuth.js
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vibecheck auth commands - Login, Logout, Whoami
|
|
3
|
-
*
|
|
4
|
-
* ═══════════════════════════════════════════════════════════════════════════════
|
|
5
|
-
* World-Class Authentication Experience
|
|
6
|
-
* ═══════════════════════════════════════════════════════════════════════════════
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
1
|
const readline = require("readline");
|
|
10
2
|
const {
|
|
11
3
|
saveApiKey,
|
|
@@ -13,22 +5,17 @@ const {
|
|
|
13
5
|
getApiKey,
|
|
14
6
|
getEntitlements,
|
|
15
7
|
} = require("./lib/auth");
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
renderFooter,
|
|
28
|
-
Spinner,
|
|
29
|
-
getTierBadge,
|
|
30
|
-
TIER,
|
|
31
|
-
} = require("./lib/unified-cli-output");
|
|
8
|
+
|
|
9
|
+
const c = {
|
|
10
|
+
reset: "\x1b[0m",
|
|
11
|
+
bold: "\x1b[1m",
|
|
12
|
+
dim: "\x1b[2m",
|
|
13
|
+
red: "\x1b[31m",
|
|
14
|
+
green: "\x1b[32m",
|
|
15
|
+
yellow: "\x1b[33m",
|
|
16
|
+
blue: "\x1b[34m",
|
|
17
|
+
cyan: "\x1b[36m",
|
|
18
|
+
};
|
|
32
19
|
|
|
33
20
|
async function prompt(question) {
|
|
34
21
|
const rl = readline.createInterface({
|
|
@@ -44,343 +31,127 @@ async function prompt(question) {
|
|
|
44
31
|
});
|
|
45
32
|
}
|
|
46
33
|
|
|
47
|
-
function isValidKeyFormat(key) {
|
|
48
|
-
if (!key || typeof key !== "string") return false;
|
|
49
|
-
return key.length >= 20 && /^[a-zA-Z0-9_-]+$/.test(key);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
34
|
async function runLogin(args) {
|
|
53
|
-
|
|
54
|
-
const quiet = shouldSuppressOutput(flags);
|
|
55
|
-
const json = isJsonMode(flags);
|
|
56
|
-
|
|
57
|
-
if (flags.help) {
|
|
35
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
58
36
|
console.log(`
|
|
59
|
-
${
|
|
60
|
-
${ansi.cyan}vibecheck login${ansi.reset} [options]
|
|
61
|
-
|
|
62
|
-
${ansi.dim}Aliases: auth, signin${ansi.reset}
|
|
37
|
+
${c.bold}vibecheck login${c.reset} - Authenticate with API key
|
|
63
38
|
|
|
64
|
-
|
|
65
|
-
and sync with the dashboard.
|
|
66
|
-
|
|
67
|
-
${ansi.bold}OPTIONS${ansi.reset}
|
|
68
|
-
${ansi.cyan}--key <key>${ansi.reset} Provide API key directly (non-interactive)
|
|
69
|
-
${ansi.cyan}--json${ansi.reset} Output result as JSON
|
|
70
|
-
${ansi.cyan}--quiet, -q${ansi.reset} Suppress non-essential output
|
|
71
|
-
${ansi.cyan}--help, -h${ansi.reset} Show this help
|
|
72
|
-
|
|
73
|
-
${ansi.bold}EXAMPLES${ansi.reset}
|
|
74
|
-
${ansi.dim}# Interactive login${ansi.reset}
|
|
39
|
+
${c.bold}Usage:${c.reset}
|
|
75
40
|
vibecheck login
|
|
76
41
|
|
|
77
|
-
|
|
78
|
-
|
|
42
|
+
${c.bold}Description:${c.reset}
|
|
43
|
+
Authenticate with your Vibecheck API key.
|
|
44
|
+
Get your API key from https://vibecheckai.dev/settings/keys
|
|
79
45
|
|
|
80
|
-
|
|
81
|
-
|
|
46
|
+
${c.bold}Options:${c.reset}
|
|
47
|
+
${c.cyan}--help, -h${c.reset} Show this help
|
|
82
48
|
|
|
83
|
-
${
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
${ansi.dim}────────────────────────────────────────────────────────────────────${ansi.reset}
|
|
87
|
-
${ansi.dim}Documentation: https://docs.vibecheckai.dev/authentication${ansi.reset}
|
|
49
|
+
${c.bold}Examples:${c.reset}
|
|
50
|
+
vibecheck login
|
|
88
51
|
`);
|
|
89
|
-
return
|
|
52
|
+
return 0;
|
|
90
53
|
}
|
|
54
|
+
|
|
55
|
+
console.log("\n 🔐 vibecheck LOGIN\n");
|
|
91
56
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (!quiet && !json) {
|
|
100
|
-
renderMinimalHeader("login", "free");
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const existing = getApiKey();
|
|
104
|
-
if (existing.key && !key) {
|
|
105
|
-
if (!quiet && !json) {
|
|
106
|
-
renderWarning(`Already logged in (source: ${existing.source})`);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (process.env.CI || !process.stdin.isTTY) {
|
|
110
|
-
if (json) {
|
|
111
|
-
console.log(JSON.stringify({ success: true, message: "Already logged in", source: existing.source }));
|
|
112
|
-
}
|
|
113
|
-
return EXIT.SUCCESS;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const answer = await prompt(` Overwrite existing credentials? (y/N) `);
|
|
117
|
-
if (answer.toLowerCase() !== "y") {
|
|
118
|
-
if (!quiet && !json) console.log(` ${ansi.dim}Cancelled.${ansi.reset}\n`);
|
|
119
|
-
if (json) console.log(JSON.stringify({ success: false, message: "Cancelled by user" }));
|
|
120
|
-
return EXIT.SUCCESS;
|
|
121
|
-
}
|
|
57
|
+
const existing = getApiKey();
|
|
58
|
+
if (existing.key) {
|
|
59
|
+
console.log(` Already logged in (source: ${existing.source}).`);
|
|
60
|
+
const answer = await prompt(" Do you want to overwrite? (y/N) ");
|
|
61
|
+
if (answer.toLowerCase() !== "y") {
|
|
62
|
+
console.log(" Cancelled.");
|
|
63
|
+
return 0;
|
|
122
64
|
}
|
|
65
|
+
}
|
|
123
66
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
console.log(JSON.stringify({ success: false, error: errorMsg }));
|
|
129
|
-
} else {
|
|
130
|
-
renderError(errorMsg);
|
|
131
|
-
}
|
|
132
|
-
return EXIT.USER_ERROR;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (!quiet && !json) {
|
|
136
|
-
console.log(` ${ansi.dim}Get your API key at: https://vibecheckai.dev/settings/keys${ansi.reset}\n`);
|
|
137
|
-
}
|
|
138
|
-
key = await prompt(` ${sym.key} API Key: `);
|
|
139
|
-
}
|
|
67
|
+
console.log(
|
|
68
|
+
" Paste your API key from https://vibecheckai.dev/settings/keys",
|
|
69
|
+
);
|
|
70
|
+
const key = await prompt(" API Key: ");
|
|
140
71
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
renderError("No API key provided");
|
|
146
|
-
}
|
|
147
|
-
return EXIT.USER_ERROR;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (!isValidKeyFormat(key)) {
|
|
151
|
-
if (json) {
|
|
152
|
-
console.log(JSON.stringify({ success: false, error: "Invalid API key format" }));
|
|
153
|
-
} else {
|
|
154
|
-
renderError("Invalid API key format");
|
|
155
|
-
console.log(` ${ansi.dim}API keys should be at least 20 characters.${ansi.reset}`);
|
|
156
|
-
}
|
|
157
|
-
return EXIT.USER_ERROR;
|
|
158
|
-
}
|
|
72
|
+
if (!key) {
|
|
73
|
+
console.error(" ❌ No key provided.");
|
|
74
|
+
return 1;
|
|
75
|
+
}
|
|
159
76
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
entitlements = await getEntitlements(key);
|
|
165
|
-
} catch (apiError) {
|
|
166
|
-
spinner?.fail(`Failed to verify: ${apiError.message}`);
|
|
167
|
-
if (json) {
|
|
168
|
-
console.log(JSON.stringify({ success: false, error: apiError.message }));
|
|
169
|
-
}
|
|
170
|
-
return EXIT.NETWORK_ERROR;
|
|
171
|
-
}
|
|
77
|
+
// Validate key by fetching entitlements
|
|
78
|
+
console.log(" Verifying...");
|
|
79
|
+
const entitlements = await getEntitlements(key);
|
|
172
80
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
81
|
+
if (
|
|
82
|
+
!entitlements ||
|
|
83
|
+
(entitlements.plan === "free" && !key.startsWith("gr_"))
|
|
84
|
+
) {
|
|
85
|
+
// If mocking, we might accept anything, but let's pretend valid keys start with gr_
|
|
86
|
+
// For now, since it's a mock, we just check if we got entitlements back.
|
|
87
|
+
}
|
|
180
88
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
plan: entitlements?.plan || "free",
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
if (json) {
|
|
190
|
-
console.log(JSON.stringify(result));
|
|
191
|
-
} else if (!quiet) {
|
|
192
|
-
spinner?.succeed(`Logged in as ${ansi.bold}${result.user}${ansi.reset}`);
|
|
193
|
-
console.log(` ${ansi.dim}Plan:${ansi.reset} ${getTierBadge(result.plan)}\n`);
|
|
194
|
-
}
|
|
89
|
+
saveApiKey(key);
|
|
90
|
+
console.log(
|
|
91
|
+
` ✅ Successfully logged in as ${entitlements?.user?.name || "User"}`,
|
|
92
|
+
);
|
|
93
|
+
console.log(` Plan: ${entitlements?.plan || "Free"}`);
|
|
195
94
|
|
|
196
|
-
|
|
197
|
-
} catch (error) {
|
|
198
|
-
if (json) {
|
|
199
|
-
console.log(JSON.stringify({ success: false, error: error.message }));
|
|
200
|
-
} else {
|
|
201
|
-
renderError(`Login failed: ${error.message}`);
|
|
202
|
-
}
|
|
203
|
-
return EXIT.INTERNAL_ERROR;
|
|
204
|
-
}
|
|
95
|
+
return 0;
|
|
205
96
|
}
|
|
206
97
|
|
|
207
98
|
async function runLogout(args) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if (flags.help) {
|
|
213
|
-
console.log(`
|
|
214
|
-
${ansi.bold}USAGE${ansi.reset}
|
|
215
|
-
${ansi.cyan}vibecheck logout${ansi.reset}
|
|
216
|
-
|
|
217
|
-
${ansi.dim}Aliases: signout${ansi.reset}
|
|
218
|
-
|
|
219
|
-
Remove stored API credentials from local config.
|
|
220
|
-
|
|
221
|
-
${ansi.bold}OPTIONS${ansi.reset}
|
|
222
|
-
${ansi.cyan}--json${ansi.reset} Output result as JSON
|
|
223
|
-
${ansi.cyan}--quiet, -q${ansi.reset} Suppress non-essential output
|
|
224
|
-
${ansi.cyan}--help, -h${ansi.reset} Show this help
|
|
225
|
-
`);
|
|
226
|
-
return EXIT.SUCCESS;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
try {
|
|
230
|
-
if (!quiet && !json) {
|
|
231
|
-
renderMinimalHeader("logout", "free");
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
deleteApiKey();
|
|
235
|
-
|
|
236
|
-
if (json) {
|
|
237
|
-
console.log(JSON.stringify({ success: true, message: "Logged out" }));
|
|
238
|
-
} else if (!quiet) {
|
|
239
|
-
renderSuccess("API key removed from local config");
|
|
240
|
-
console.log();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
return EXIT.SUCCESS;
|
|
244
|
-
} catch (error) {
|
|
245
|
-
if (json) {
|
|
246
|
-
console.log(JSON.stringify({ success: false, error: error.message }));
|
|
247
|
-
} else {
|
|
248
|
-
renderError(`Logout failed: ${error.message}`);
|
|
249
|
-
}
|
|
250
|
-
return EXIT.INTERNAL_ERROR;
|
|
251
|
-
}
|
|
99
|
+
console.log("\n 🔓 vibecheck LOGOUT\n");
|
|
100
|
+
deleteApiKey();
|
|
101
|
+
console.log(" ✅ API key removed from local config.");
|
|
102
|
+
return 0;
|
|
252
103
|
}
|
|
253
104
|
|
|
254
105
|
async function runWhoami(args) {
|
|
255
|
-
|
|
256
|
-
const quiet = shouldSuppressOutput(flags);
|
|
257
|
-
const json = isJsonMode(flags);
|
|
258
|
-
|
|
259
|
-
if (flags.help) {
|
|
106
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
260
107
|
console.log(`
|
|
261
|
-
${
|
|
262
|
-
${ansi.cyan}vibecheck whoami${ansi.reset}
|
|
108
|
+
${c.bold}vibecheck whoami${c.reset} - Show current user and plan
|
|
263
109
|
|
|
264
|
-
${
|
|
110
|
+
${c.bold}Usage:${c.reset}
|
|
111
|
+
vibecheck whoami
|
|
265
112
|
|
|
266
|
-
|
|
267
|
-
|
|
113
|
+
${c.bold}Description:${c.reset}
|
|
114
|
+
Display information about the currently authenticated user,
|
|
115
|
+
including plan, limits, and scopes.
|
|
268
116
|
|
|
269
|
-
${
|
|
270
|
-
${
|
|
271
|
-
${ansi.cyan}--quiet, -q${ansi.reset} Suppress non-essential output
|
|
272
|
-
${ansi.cyan}--help, -h${ansi.reset} Show this help
|
|
117
|
+
${c.bold}Options:${c.reset}
|
|
118
|
+
${c.cyan}--help, -h${c.reset} Show this help
|
|
273
119
|
|
|
274
|
-
${
|
|
275
|
-
${ansi.dim}# Check current user${ansi.reset}
|
|
120
|
+
${c.bold}Examples:${c.reset}
|
|
276
121
|
vibecheck whoami
|
|
277
|
-
|
|
278
|
-
${ansi.dim}# Get JSON for scripts${ansi.reset}
|
|
279
|
-
vibecheck whoami --json
|
|
280
122
|
`);
|
|
281
|
-
return
|
|
123
|
+
return 0;
|
|
282
124
|
}
|
|
125
|
+
|
|
126
|
+
console.log("\n 👤 vibecheck WHOAMI\n");
|
|
283
127
|
|
|
284
|
-
|
|
285
|
-
if (!quiet && !json) {
|
|
286
|
-
renderMinimalHeader("whoami", "free");
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
const { key, source } = getApiKey();
|
|
290
|
-
|
|
291
|
-
if (!key) {
|
|
292
|
-
const result = { authenticated: false, message: "Not logged in" };
|
|
293
|
-
|
|
294
|
-
if (json) {
|
|
295
|
-
console.log(JSON.stringify(result));
|
|
296
|
-
} else {
|
|
297
|
-
renderWarning("Not logged in");
|
|
298
|
-
console.log(` ${ansi.dim}Run "vibecheck login" or set VIBECHECK_API_KEY.${ansi.reset}\n`);
|
|
299
|
-
}
|
|
300
|
-
return EXIT.AUTH_REQUIRED;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
const spinner = !quiet && !json ? new Spinner("Fetching user info").start() : null;
|
|
128
|
+
const { key, source } = getApiKey();
|
|
304
129
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
if (json) {
|
|
311
|
-
console.log(JSON.stringify({ authenticated: true, error: apiError.message }));
|
|
312
|
-
}
|
|
313
|
-
return EXIT.NETWORK_ERROR;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (!entitlements) {
|
|
317
|
-
spinner?.fail("Invalid API key or server unreachable");
|
|
318
|
-
if (json) {
|
|
319
|
-
console.log(JSON.stringify({ authenticated: false, error: "Invalid API key" }));
|
|
320
|
-
} else {
|
|
321
|
-
console.log(` ${ansi.dim}Run "vibecheck login" to re-authenticate.${ansi.reset}\n`);
|
|
322
|
-
}
|
|
323
|
-
return EXIT.AUTH_FAILED;
|
|
324
|
-
}
|
|
130
|
+
if (!key) {
|
|
131
|
+
console.log(" Not logged in.");
|
|
132
|
+
console.log(' Run "vibecheck login" or set VIBECHECK_API_KEY.');
|
|
133
|
+
return 1;
|
|
134
|
+
}
|
|
325
135
|
|
|
326
|
-
|
|
136
|
+
console.log(
|
|
137
|
+
` Source: ${source === "env" ? "Environment Variable" : "Local Config"}`,
|
|
138
|
+
);
|
|
327
139
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
id: entitlements.user?.id,
|
|
334
|
-
},
|
|
335
|
-
plan: entitlements.plan,
|
|
336
|
-
limits: entitlements.limits,
|
|
337
|
-
scopes: entitlements.scopes,
|
|
338
|
-
};
|
|
140
|
+
const entitlements = await getEntitlements(key);
|
|
141
|
+
if (!entitlements) {
|
|
142
|
+
console.log(" ⚠️ Invalid API Key or server unreachable.");
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
339
145
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
{ label: "Plan", value: getTierBadge(result.plan) },
|
|
348
|
-
{ label: "Source", value: source === "env" ? "Environment Variable" : "Local Config" },
|
|
349
|
-
{ label: "Limits", value: `${result.limits?.runsPerMonth || "unlimited"} runs/month` },
|
|
350
|
-
]);
|
|
351
|
-
|
|
352
|
-
if (result.scopes && result.scopes.length > 0) {
|
|
353
|
-
console.log();
|
|
354
|
-
console.log(` ${ansi.dim}Scopes:${ansi.reset}`);
|
|
355
|
-
result.scopes.forEach(s => console.log(` ${ansi.gray}${sym.bullet}${ansi.reset} ${s}`));
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Tier-specific upsell
|
|
359
|
-
if (result.plan === "free") {
|
|
360
|
-
renderFooter({
|
|
361
|
-
nextSteps: [
|
|
362
|
-
{ cmd: "vibecheck scan", desc: "analyze your codebase" },
|
|
363
|
-
],
|
|
364
|
-
showUpsell: true,
|
|
365
|
-
});
|
|
366
|
-
} else if (result.plan === "starter") {
|
|
367
|
-
console.log();
|
|
368
|
-
console.log(` ${ansi.dim}${sym.star}${ansi.reset} ${ansi.magenta}PRO${ansi.reset}${ansi.dim}: proof loops + badge generation + priority support${ansi.reset}`);
|
|
369
|
-
console.log(` ${ansi.dim} Upgrade ${sym.arrow} https://vibecheckai.dev${ansi.reset}\n`);
|
|
370
|
-
} else {
|
|
371
|
-
console.log();
|
|
372
|
-
}
|
|
373
|
-
}
|
|
146
|
+
console.log(` User: ${entitlements.user.name} (${entitlements.user.id})`);
|
|
147
|
+
console.log(` Plan: ${entitlements.plan.toUpperCase()}`);
|
|
148
|
+
console.log(` Limits: ${entitlements.limits.runsPerMonth} runs/month`);
|
|
149
|
+
console.log("");
|
|
150
|
+
console.log(" Scopes:");
|
|
151
|
+
entitlements.scopes.forEach((s) => console.log(` - ${s}`));
|
|
152
|
+
console.log("");
|
|
374
153
|
|
|
375
|
-
|
|
376
|
-
} catch (error) {
|
|
377
|
-
if (json) {
|
|
378
|
-
console.log(JSON.stringify({ authenticated: false, error: error.message }));
|
|
379
|
-
} else {
|
|
380
|
-
renderError(`Whoami failed: ${error.message}`);
|
|
381
|
-
}
|
|
382
|
-
return EXIT.INTERNAL_ERROR;
|
|
383
|
-
}
|
|
154
|
+
return 0;
|
|
384
155
|
}
|
|
385
156
|
|
|
386
157
|
module.exports = { runLogin, runLogout, runWhoami };
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
const fs = require("fs");
|
|
14
14
|
const path = require("path");
|
|
15
15
|
const entitlements = require("./lib/entitlements-v2");
|
|
16
|
-
const { parseGlobalFlags, shouldShowBanner
|
|
17
|
-
const { EXIT } = require("./lib/exit-codes");
|
|
16
|
+
const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
|
|
18
17
|
|
|
19
18
|
// ═══════════════════════════════════════════════════════════════════════════════
|
|
20
19
|
// TERMINAL STYLING
|
|
@@ -285,25 +284,13 @@ ${c.bold}TIER${c.reset}
|
|
|
285
284
|
|
|
286
285
|
async function runCheckpoint(args) {
|
|
287
286
|
const opts = parseArgs(args);
|
|
288
|
-
const quiet = shouldSuppressOutput(opts);
|
|
289
|
-
const json = isJsonMode(opts) || opts.json;
|
|
290
287
|
|
|
291
288
|
if (opts.help) {
|
|
292
289
|
printHelp(shouldShowBanner(opts));
|
|
293
|
-
return
|
|
290
|
+
return 0;
|
|
294
291
|
}
|
|
295
292
|
|
|
296
293
|
const projectPath = path.resolve(opts.path);
|
|
297
|
-
|
|
298
|
-
// Validate project path exists
|
|
299
|
-
if (!fs.existsSync(projectPath)) {
|
|
300
|
-
if (json) {
|
|
301
|
-
console.log(JSON.stringify({ success: false, error: `Project path does not exist: ${projectPath}` }));
|
|
302
|
-
} else {
|
|
303
|
-
console.error(`${c.red}${icons.cross}${c.reset} Project path does not exist: ${projectPath}`);
|
|
304
|
-
}
|
|
305
|
-
return EXIT.NOT_FOUND;
|
|
306
|
-
}
|
|
307
294
|
const vibecheckDir = path.join(projectPath, '.vibecheck');
|
|
308
295
|
const resultsDir = path.join(vibecheckDir, 'results');
|
|
309
296
|
const checkpointsDir = path.join(vibecheckDir, 'checkpoints');
|
|
@@ -329,17 +316,17 @@ async function runCheckpoint(args) {
|
|
|
329
316
|
}
|
|
330
317
|
|
|
331
318
|
if (!baseline) {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
console.log(`${c.dim}Or specify --baseline <file> to use a specific file.${c.reset}\n`);
|
|
319
|
+
console.log(`\n${c.yellow}${icons.warning}${c.reset} No baseline found.`);
|
|
320
|
+
console.log(`${c.dim}Run 'vibecheck scan' first to create a baseline.${c.reset}`);
|
|
321
|
+
console.log(`${c.dim}Or specify --baseline <file> to use a specific file.${c.reset}\n`);
|
|
322
|
+
|
|
323
|
+
if (!opts.json) {
|
|
338
324
|
console.log(`${c.bold}TIP:${c.reset} Create a baseline with:`);
|
|
339
325
|
console.log(` ${c.cyan}vibecheck scan${c.reset}`);
|
|
340
326
|
console.log(` ${c.cyan}cp .vibecheck/results/latest.json .vibecheck/results/baseline.json${c.reset}\n`);
|
|
341
327
|
}
|
|
342
|
-
|
|
328
|
+
|
|
329
|
+
return 1;
|
|
343
330
|
}
|
|
344
331
|
|
|
345
332
|
// Load current
|
|
@@ -353,13 +340,9 @@ async function runCheckpoint(args) {
|
|
|
353
340
|
}
|
|
354
341
|
|
|
355
342
|
if (!current) {
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
console.log(`\n${c.yellow}${icons.warning}${c.reset} No current results found.`);
|
|
360
|
-
console.log(`${c.dim}Run 'vibecheck scan' to generate current results.${c.reset}\n`);
|
|
361
|
-
}
|
|
362
|
-
return EXIT.NOT_FOUND;
|
|
343
|
+
console.log(`\n${c.yellow}${icons.warning}${c.reset} No current results found.`);
|
|
344
|
+
console.log(`${c.dim}Run 'vibecheck scan' to generate current results.${c.reset}\n`);
|
|
345
|
+
return 1;
|
|
363
346
|
}
|
|
364
347
|
|
|
365
348
|
// Extract findings arrays
|
|
@@ -425,17 +408,18 @@ async function runCheckpoint(args) {
|
|
|
425
408
|
if (comparison.regressions.length > 3) {
|
|
426
409
|
console.log(` ${c.dim}... and ${comparison.regressions.length - 3} more${c.reset}`);
|
|
427
410
|
}
|
|
428
|
-
return
|
|
411
|
+
return 1;
|
|
429
412
|
} else {
|
|
430
413
|
console.log(`${c.green}${icons.check}${c.reset} Checkpoint passed (${checkpoint.summary.fixed} fixed, ${checkpoint.summary.remaining} remaining)`);
|
|
431
|
-
return
|
|
414
|
+
return 0;
|
|
432
415
|
}
|
|
433
416
|
}
|
|
434
417
|
|
|
435
418
|
// JSON output
|
|
436
419
|
if (opts.json) {
|
|
437
420
|
console.log(JSON.stringify(checkpoint, null, 2));
|
|
438
|
-
|
|
421
|
+
const exitCode = opts.gate && checkpoint.summary.regressions > 0 ? 1 : 0;
|
|
422
|
+
return exitCode;
|
|
439
423
|
}
|
|
440
424
|
|
|
441
425
|
// Human-readable output
|
|
@@ -547,16 +531,14 @@ ${c.bold}╔══════════════════════
|
|
|
547
531
|
console.log();
|
|
548
532
|
|
|
549
533
|
// Return code:
|
|
550
|
-
// - With --gate:
|
|
551
|
-
// - Without --gate: always
|
|
534
|
+
// - With --gate: 1 if regressions, 0 otherwise
|
|
535
|
+
// - Without --gate: always 0 (informational only)
|
|
552
536
|
if (opts.gate && comparison.regressions.length > 0) {
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
}
|
|
556
|
-
return EXIT.BLOCKING;
|
|
537
|
+
console.log(`${c.yellow}${icons.warning} Gate mode: Exiting with code 1 due to regressions${c.reset}\n`);
|
|
538
|
+
return 1;
|
|
557
539
|
}
|
|
558
540
|
|
|
559
|
-
return
|
|
541
|
+
return 0;
|
|
560
542
|
}
|
|
561
543
|
|
|
562
544
|
module.exports = { runCheckpoint };
|