@vibecheckai/cli 3.2.3 → 3.2.5
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/.generated +25 -25
- package/bin/dev/run-v2-torture.js +30 -30
- package/bin/runners/ENHANCEMENT_GUIDE.md +121 -121
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -295
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +117 -28
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +23 -14
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +72 -1
- package/bin/runners/lib/agent-firewall/interceptor/base.js +2 -2
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +6 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +34 -3
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +29 -4
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +12 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +21 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/analyzers.js +606 -325
- package/bin/runners/lib/auth-truth.js +193 -193
- package/bin/runners/lib/backup.js +62 -62
- package/bin/runners/lib/billing.js +107 -107
- package/bin/runners/lib/claims.js +118 -118
- package/bin/runners/lib/cli-ui.js +540 -540
- package/bin/runners/lib/contracts/auth-contract.js +202 -202
- package/bin/runners/lib/contracts/env-contract.js +181 -181
- package/bin/runners/lib/contracts/external-contract.js +206 -206
- package/bin/runners/lib/contracts/guard.js +168 -168
- package/bin/runners/lib/contracts/index.js +89 -89
- package/bin/runners/lib/contracts/plan-validator.js +311 -311
- package/bin/runners/lib/contracts/route-contract.js +199 -199
- package/bin/runners/lib/contracts.js +804 -804
- package/bin/runners/lib/detect.js +89 -89
- package/bin/runners/lib/doctor/autofix.js +254 -254
- package/bin/runners/lib/doctor/index.js +37 -37
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -325
- package/bin/runners/lib/doctor/modules/index.js +46 -46
- package/bin/runners/lib/doctor/modules/network.js +250 -250
- package/bin/runners/lib/doctor/modules/project.js +312 -312
- package/bin/runners/lib/doctor/modules/runtime.js +224 -224
- package/bin/runners/lib/doctor/modules/security.js +348 -348
- package/bin/runners/lib/doctor/modules/system.js +213 -213
- package/bin/runners/lib/doctor/modules/vibecheck.js +394 -394
- package/bin/runners/lib/doctor/reporter.js +262 -262
- package/bin/runners/lib/doctor/service.js +262 -262
- package/bin/runners/lib/doctor/types.js +113 -113
- package/bin/runners/lib/doctor/ui.js +263 -263
- package/bin/runners/lib/doctor-v2.js +608 -608
- package/bin/runners/lib/drift.js +425 -425
- package/bin/runners/lib/enforcement.js +72 -72
- package/bin/runners/lib/engines/accessibility-engine.js +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
- package/bin/runners/lib/enterprise-detect.js +603 -603
- package/bin/runners/lib/enterprise-init.js +942 -942
- package/bin/runners/lib/env-resolver.js +417 -417
- package/bin/runners/lib/env-template.js +66 -66
- package/bin/runners/lib/env.js +189 -189
- package/bin/runners/lib/extractors/client-calls.js +990 -990
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -573
- package/bin/runners/lib/extractors/fastify-routes.js +426 -426
- package/bin/runners/lib/extractors/index.js +363 -363
- package/bin/runners/lib/extractors/next-routes.js +524 -524
- package/bin/runners/lib/extractors/proof-graph.js +431 -431
- package/bin/runners/lib/extractors/route-matcher.js +451 -451
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -377
- package/bin/runners/lib/extractors/ui-bindings.js +547 -547
- package/bin/runners/lib/findings-schema.js +281 -281
- package/bin/runners/lib/firewall-prompt.js +50 -50
- package/bin/runners/lib/global-flags.js +213 -213
- package/bin/runners/lib/graph/graph-builder.js +265 -265
- package/bin/runners/lib/graph/html-renderer.js +413 -413
- package/bin/runners/lib/graph/index.js +32 -32
- package/bin/runners/lib/graph/runtime-collector.js +215 -215
- package/bin/runners/lib/graph/static-extractor.js +518 -518
- package/bin/runners/lib/html-report.js +650 -650
- package/bin/runners/lib/interactive-menu.js +1496 -1496
- package/bin/runners/lib/llm.js +75 -75
- package/bin/runners/lib/meter.js +61 -61
- package/bin/runners/lib/missions/evidence.js +126 -126
- package/bin/runners/lib/patch.js +40 -40
- package/bin/runners/lib/permissions/auth-model.js +213 -213
- package/bin/runners/lib/permissions/idor-prover.js +205 -205
- package/bin/runners/lib/permissions/index.js +45 -45
- package/bin/runners/lib/permissions/matrix-builder.js +198 -198
- package/bin/runners/lib/pkgjson.js +28 -28
- package/bin/runners/lib/policy.js +295 -295
- package/bin/runners/lib/preflight.js +142 -142
- package/bin/runners/lib/reality/correlation-detectors.js +359 -359
- package/bin/runners/lib/reality/index.js +318 -318
- package/bin/runners/lib/reality/request-hashing.js +416 -416
- package/bin/runners/lib/reality/request-mapper.js +453 -453
- package/bin/runners/lib/reality/safety-rails.js +463 -463
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -408
- package/bin/runners/lib/reality/toast-detector.js +393 -393
- package/bin/runners/lib/reality-findings.js +84 -84
- package/bin/runners/lib/receipts.js +179 -179
- package/bin/runners/lib/redact.js +29 -29
- package/bin/runners/lib/replay/capsule-manager.js +154 -154
- package/bin/runners/lib/replay/index.js +263 -263
- package/bin/runners/lib/replay/player.js +348 -348
- package/bin/runners/lib/replay/recorder.js +331 -331
- package/bin/runners/lib/report-output.js +187 -187
- package/bin/runners/lib/report.js +135 -135
- package/bin/runners/lib/route-detection.js +1140 -1140
- package/bin/runners/lib/sandbox/index.js +59 -59
- package/bin/runners/lib/sandbox/proof-chain.js +399 -399
- package/bin/runners/lib/sandbox/sandbox-runner.js +205 -205
- package/bin/runners/lib/sandbox/worktree.js +174 -174
- package/bin/runners/lib/scan-output.js +525 -190
- package/bin/runners/lib/schema-validator.js +350 -350
- package/bin/runners/lib/schemas/contracts.schema.json +160 -160
- package/bin/runners/lib/schemas/finding.schema.json +100 -100
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -206
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -176
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -162
- package/bin/runners/lib/schemas/share-pack.schema.json +180 -180
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -117
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -303
- package/bin/runners/lib/schemas/validator.js +438 -438
- package/bin/runners/lib/score-history.js +282 -282
- package/bin/runners/lib/share-pack.js +239 -239
- package/bin/runners/lib/snippets.js +67 -67
- package/bin/runners/lib/status-output.js +253 -253
- package/bin/runners/lib/terminal-ui.js +350 -350
- package/bin/runners/lib/upsell.js +510 -510
- package/bin/runners/lib/usage.js +153 -153
- package/bin/runners/lib/validate-patch.js +156 -156
- package/bin/runners/lib/verdict-engine.js +628 -628
- package/bin/runners/reality/engine.js +917 -917
- package/bin/runners/reality/flows.js +122 -122
- package/bin/runners/reality/report.js +378 -378
- package/bin/runners/reality/session.js +193 -193
- package/bin/runners/runGuard.js +168 -168
- package/bin/runners/runProof.zip +0 -0
- package/bin/runners/runProve.js +8 -0
- package/bin/runners/runReality.js +14 -0
- package/bin/runners/runScan.js +17 -1
- package/bin/runners/runTruth.js +15 -3
- package/bin/vibecheck.js +45 -20
- package/mcp-server/package.json +1 -1
- package/mcp-server/tier-auth.js +71 -16
- package/mcp-server/tools/index.js +72 -72
- package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
- package/package.json +1 -1
package/bin/runners/runGuard.js
CHANGED
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vibecheck guard - Unified trust boundary enforcement
|
|
3
|
-
*
|
|
4
|
-
* Combines: validate + claim-verifier + prompt-firewall
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* vibecheck guard # Run all checks
|
|
8
|
-
* vibecheck guard --claims # Verify AI claims against truthpack
|
|
9
|
-
* vibecheck guard --prompts # Check for prompt injection
|
|
10
|
-
* vibecheck guard --hallucinations # Detect AI hallucination patterns
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const path = require("path");
|
|
14
|
-
const fs = require("fs");
|
|
15
|
-
|
|
16
|
-
// Import underlying implementations
|
|
17
|
-
const { runValidate } = require("./runValidate");
|
|
18
|
-
const { runPromptFirewall } = require("./runPromptFirewall");
|
|
19
|
-
|
|
20
|
-
// ANSI colors
|
|
21
|
-
const c = {
|
|
22
|
-
reset: "\x1b[0m",
|
|
23
|
-
dim: "\x1b[2m",
|
|
24
|
-
bold: "\x1b[1m",
|
|
25
|
-
cyan: "\x1b[36m",
|
|
26
|
-
green: "\x1b[32m",
|
|
27
|
-
yellow: "\x1b[33m",
|
|
28
|
-
red: "\x1b[31m",
|
|
29
|
-
magenta: "\x1b[35m",
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
function printHelp() {
|
|
33
|
-
console.log(`
|
|
34
|
-
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
35
|
-
${c.bold}vibecheck guard${c.reset} - Trust boundary enforcement for AI outputs
|
|
36
|
-
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
37
|
-
|
|
38
|
-
${c.green}USAGE${c.reset}
|
|
39
|
-
vibecheck guard [options]
|
|
40
|
-
|
|
41
|
-
${c.yellow}OPTIONS${c.reset}
|
|
42
|
-
--claims Verify AI claims against truthpack (route_exists, auth_enforced, etc.)
|
|
43
|
-
--prompts Check code for prompt injection vulnerabilities
|
|
44
|
-
--hallucinations Detect AI hallucination patterns in generated code
|
|
45
|
-
--file <path> Check specific file(s)
|
|
46
|
-
--json Output JSON for CI integration
|
|
47
|
-
--strict Fail on warnings (default: fail on errors only)
|
|
48
|
-
|
|
49
|
-
${c.magenta}EXAMPLES${c.reset}
|
|
50
|
-
vibecheck guard # Run all checks
|
|
51
|
-
vibecheck guard --claims --file api.ts # Verify claims in specific file
|
|
52
|
-
vibecheck guard --prompts # Prompt injection scan
|
|
53
|
-
vibecheck guard --json # CI-friendly output
|
|
54
|
-
|
|
55
|
-
${c.dim}This command unifies trust boundary checks for AI-generated code.${c.reset}
|
|
56
|
-
`);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async function runGuard(args = []) {
|
|
60
|
-
// Parse arguments
|
|
61
|
-
if (args.includes("--help") || args.includes("-h")) {
|
|
62
|
-
printHelp();
|
|
63
|
-
return 0;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const runClaims = args.includes("--claims") || (!args.includes("--prompts") && !args.includes("--hallucinations"));
|
|
67
|
-
const runPrompts = args.includes("--prompts") || (!args.includes("--claims") && !args.includes("--hallucinations"));
|
|
68
|
-
const runHallucinations = args.includes("--hallucinations") || (!args.includes("--claims") && !args.includes("--prompts"));
|
|
69
|
-
const jsonOutput = args.includes("--json");
|
|
70
|
-
const strict = args.includes("--strict");
|
|
71
|
-
|
|
72
|
-
const results = {
|
|
73
|
-
claims: null,
|
|
74
|
-
prompts: null,
|
|
75
|
-
hallucinations: null,
|
|
76
|
-
verdict: "PASS",
|
|
77
|
-
errors: 0,
|
|
78
|
-
warnings: 0,
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
console.log(`
|
|
82
|
-
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
83
|
-
${c.bold}🛡️ VIBECHECK GUARD${c.reset} - Trust Boundary Enforcement
|
|
84
|
-
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
85
|
-
`);
|
|
86
|
-
|
|
87
|
-
// Run claims verification (validates AI claims against truthpack)
|
|
88
|
-
if (runClaims) {
|
|
89
|
-
console.log(`${c.dim}▸ Verifying AI claims against truthpack...${c.reset}`);
|
|
90
|
-
try {
|
|
91
|
-
const validateArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
|
|
92
|
-
const exitCode = await runValidate(validateArgs);
|
|
93
|
-
results.claims = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
94
|
-
if (exitCode !== 0) {
|
|
95
|
-
results.errors++;
|
|
96
|
-
results.verdict = "FAIL";
|
|
97
|
-
}
|
|
98
|
-
console.log(exitCode === 0
|
|
99
|
-
? ` ${c.green}✓${c.reset} Claims verified`
|
|
100
|
-
: ` ${c.red}✗${c.reset} Claim verification failed`);
|
|
101
|
-
} catch (e) {
|
|
102
|
-
results.claims = { error: e.message };
|
|
103
|
-
console.log(` ${c.yellow}⚠${c.reset} Claims check skipped: ${e.message}`);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Run prompt injection detection
|
|
108
|
-
if (runPrompts) {
|
|
109
|
-
console.log(`${c.dim}▸ Scanning for prompt injection vulnerabilities...${c.reset}`);
|
|
110
|
-
try {
|
|
111
|
-
const firewallArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
|
|
112
|
-
const exitCode = await runPromptFirewall(firewallArgs);
|
|
113
|
-
results.prompts = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
114
|
-
if (exitCode !== 0) {
|
|
115
|
-
results.warnings++;
|
|
116
|
-
if (strict) results.verdict = "FAIL";
|
|
117
|
-
}
|
|
118
|
-
console.log(exitCode === 0
|
|
119
|
-
? ` ${c.green}✓${c.reset} No prompt injection risks`
|
|
120
|
-
: ` ${c.yellow}⚠${c.reset} Prompt injection risks detected`);
|
|
121
|
-
} catch (e) {
|
|
122
|
-
results.prompts = { error: e.message };
|
|
123
|
-
console.log(` ${c.yellow}⚠${c.reset} Prompt check skipped: ${e.message}`);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Run hallucination detection
|
|
128
|
-
if (runHallucinations) {
|
|
129
|
-
console.log(`${c.dim}▸ Detecting hallucination patterns...${c.reset}`);
|
|
130
|
-
// Use validate with hallucination focus
|
|
131
|
-
try {
|
|
132
|
-
const validateArgs = ["--hallucinations", ...args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a))];
|
|
133
|
-
const exitCode = await runValidate(validateArgs);
|
|
134
|
-
results.hallucinations = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
135
|
-
if (exitCode !== 0) {
|
|
136
|
-
results.warnings++;
|
|
137
|
-
if (strict) results.verdict = "FAIL";
|
|
138
|
-
}
|
|
139
|
-
console.log(exitCode === 0
|
|
140
|
-
? ` ${c.green}✓${c.reset} No hallucination patterns`
|
|
141
|
-
: ` ${c.yellow}⚠${c.reset} Potential hallucinations detected`);
|
|
142
|
-
} catch (e) {
|
|
143
|
-
results.hallucinations = { error: e.message };
|
|
144
|
-
console.log(` ${c.yellow}⚠${c.reset} Hallucination check skipped: ${e.message}`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Summary
|
|
149
|
-
console.log(`
|
|
150
|
-
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}`);
|
|
151
|
-
|
|
152
|
-
if (results.verdict === "PASS") {
|
|
153
|
-
console.log(` ${c.green}${c.bold}✓ GUARD PASS${c.reset} - All trust boundaries intact`);
|
|
154
|
-
} else {
|
|
155
|
-
console.log(` ${c.red}${c.bold}✗ GUARD FAIL${c.reset} - Trust boundary violations detected`);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
console.log(`${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
159
|
-
`);
|
|
160
|
-
|
|
161
|
-
if (jsonOutput) {
|
|
162
|
-
console.log(JSON.stringify(results, null, 2));
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return results.verdict === "PASS" ? 0 : (results.errors > 0 ? 2 : 1);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
module.exports = { runGuard };
|
|
1
|
+
/**
|
|
2
|
+
* vibecheck guard - Unified trust boundary enforcement
|
|
3
|
+
*
|
|
4
|
+
* Combines: validate + claim-verifier + prompt-firewall
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* vibecheck guard # Run all checks
|
|
8
|
+
* vibecheck guard --claims # Verify AI claims against truthpack
|
|
9
|
+
* vibecheck guard --prompts # Check for prompt injection
|
|
10
|
+
* vibecheck guard --hallucinations # Detect AI hallucination patterns
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const path = require("path");
|
|
14
|
+
const fs = require("fs");
|
|
15
|
+
|
|
16
|
+
// Import underlying implementations
|
|
17
|
+
const { runValidate } = require("./runValidate");
|
|
18
|
+
const { runPromptFirewall } = require("./runPromptFirewall");
|
|
19
|
+
|
|
20
|
+
// ANSI colors
|
|
21
|
+
const c = {
|
|
22
|
+
reset: "\x1b[0m",
|
|
23
|
+
dim: "\x1b[2m",
|
|
24
|
+
bold: "\x1b[1m",
|
|
25
|
+
cyan: "\x1b[36m",
|
|
26
|
+
green: "\x1b[32m",
|
|
27
|
+
yellow: "\x1b[33m",
|
|
28
|
+
red: "\x1b[31m",
|
|
29
|
+
magenta: "\x1b[35m",
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
function printHelp() {
|
|
33
|
+
console.log(`
|
|
34
|
+
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
35
|
+
${c.bold}vibecheck guard${c.reset} - Trust boundary enforcement for AI outputs
|
|
36
|
+
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
37
|
+
|
|
38
|
+
${c.green}USAGE${c.reset}
|
|
39
|
+
vibecheck guard [options]
|
|
40
|
+
|
|
41
|
+
${c.yellow}OPTIONS${c.reset}
|
|
42
|
+
--claims Verify AI claims against truthpack (route_exists, auth_enforced, etc.)
|
|
43
|
+
--prompts Check code for prompt injection vulnerabilities
|
|
44
|
+
--hallucinations Detect AI hallucination patterns in generated code
|
|
45
|
+
--file <path> Check specific file(s)
|
|
46
|
+
--json Output JSON for CI integration
|
|
47
|
+
--strict Fail on warnings (default: fail on errors only)
|
|
48
|
+
|
|
49
|
+
${c.magenta}EXAMPLES${c.reset}
|
|
50
|
+
vibecheck guard # Run all checks
|
|
51
|
+
vibecheck guard --claims --file api.ts # Verify claims in specific file
|
|
52
|
+
vibecheck guard --prompts # Prompt injection scan
|
|
53
|
+
vibecheck guard --json # CI-friendly output
|
|
54
|
+
|
|
55
|
+
${c.dim}This command unifies trust boundary checks for AI-generated code.${c.reset}
|
|
56
|
+
`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function runGuard(args = []) {
|
|
60
|
+
// Parse arguments
|
|
61
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
62
|
+
printHelp();
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const runClaims = args.includes("--claims") || (!args.includes("--prompts") && !args.includes("--hallucinations"));
|
|
67
|
+
const runPrompts = args.includes("--prompts") || (!args.includes("--claims") && !args.includes("--hallucinations"));
|
|
68
|
+
const runHallucinations = args.includes("--hallucinations") || (!args.includes("--claims") && !args.includes("--prompts"));
|
|
69
|
+
const jsonOutput = args.includes("--json");
|
|
70
|
+
const strict = args.includes("--strict");
|
|
71
|
+
|
|
72
|
+
const results = {
|
|
73
|
+
claims: null,
|
|
74
|
+
prompts: null,
|
|
75
|
+
hallucinations: null,
|
|
76
|
+
verdict: "PASS",
|
|
77
|
+
errors: 0,
|
|
78
|
+
warnings: 0,
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
console.log(`
|
|
82
|
+
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
83
|
+
${c.bold}🛡️ VIBECHECK GUARD${c.reset} - Trust Boundary Enforcement
|
|
84
|
+
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
85
|
+
`);
|
|
86
|
+
|
|
87
|
+
// Run claims verification (validates AI claims against truthpack)
|
|
88
|
+
if (runClaims) {
|
|
89
|
+
console.log(`${c.dim}▸ Verifying AI claims against truthpack...${c.reset}`);
|
|
90
|
+
try {
|
|
91
|
+
const validateArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
|
|
92
|
+
const exitCode = await runValidate(validateArgs);
|
|
93
|
+
results.claims = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
94
|
+
if (exitCode !== 0) {
|
|
95
|
+
results.errors++;
|
|
96
|
+
results.verdict = "FAIL";
|
|
97
|
+
}
|
|
98
|
+
console.log(exitCode === 0
|
|
99
|
+
? ` ${c.green}✓${c.reset} Claims verified`
|
|
100
|
+
: ` ${c.red}✗${c.reset} Claim verification failed`);
|
|
101
|
+
} catch (e) {
|
|
102
|
+
results.claims = { error: e.message };
|
|
103
|
+
console.log(` ${c.yellow}⚠${c.reset} Claims check skipped: ${e.message}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Run prompt injection detection
|
|
108
|
+
if (runPrompts) {
|
|
109
|
+
console.log(`${c.dim}▸ Scanning for prompt injection vulnerabilities...${c.reset}`);
|
|
110
|
+
try {
|
|
111
|
+
const firewallArgs = args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a));
|
|
112
|
+
const exitCode = await runPromptFirewall(firewallArgs);
|
|
113
|
+
results.prompts = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
114
|
+
if (exitCode !== 0) {
|
|
115
|
+
results.warnings++;
|
|
116
|
+
if (strict) results.verdict = "FAIL";
|
|
117
|
+
}
|
|
118
|
+
console.log(exitCode === 0
|
|
119
|
+
? ` ${c.green}✓${c.reset} No prompt injection risks`
|
|
120
|
+
: ` ${c.yellow}⚠${c.reset} Prompt injection risks detected`);
|
|
121
|
+
} catch (e) {
|
|
122
|
+
results.prompts = { error: e.message };
|
|
123
|
+
console.log(` ${c.yellow}⚠${c.reset} Prompt check skipped: ${e.message}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Run hallucination detection
|
|
128
|
+
if (runHallucinations) {
|
|
129
|
+
console.log(`${c.dim}▸ Detecting hallucination patterns...${c.reset}`);
|
|
130
|
+
// Use validate with hallucination focus
|
|
131
|
+
try {
|
|
132
|
+
const validateArgs = ["--hallucinations", ...args.filter(a => !["--claims", "--prompts", "--hallucinations"].includes(a))];
|
|
133
|
+
const exitCode = await runValidate(validateArgs);
|
|
134
|
+
results.hallucinations = { exitCode, status: exitCode === 0 ? "pass" : "fail" };
|
|
135
|
+
if (exitCode !== 0) {
|
|
136
|
+
results.warnings++;
|
|
137
|
+
if (strict) results.verdict = "FAIL";
|
|
138
|
+
}
|
|
139
|
+
console.log(exitCode === 0
|
|
140
|
+
? ` ${c.green}✓${c.reset} No hallucination patterns`
|
|
141
|
+
: ` ${c.yellow}⚠${c.reset} Potential hallucinations detected`);
|
|
142
|
+
} catch (e) {
|
|
143
|
+
results.hallucinations = { error: e.message };
|
|
144
|
+
console.log(` ${c.yellow}⚠${c.reset} Hallucination check skipped: ${e.message}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Summary
|
|
149
|
+
console.log(`
|
|
150
|
+
${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}`);
|
|
151
|
+
|
|
152
|
+
if (results.verdict === "PASS") {
|
|
153
|
+
console.log(` ${c.green}${c.bold}✓ GUARD PASS${c.reset} - All trust boundaries intact`);
|
|
154
|
+
} else {
|
|
155
|
+
console.log(` ${c.red}${c.bold}✗ GUARD FAIL${c.reset} - Trust boundary violations detected`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
console.log(`${c.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${c.reset}
|
|
159
|
+
`);
|
|
160
|
+
|
|
161
|
+
if (jsonOutput) {
|
|
162
|
+
console.log(JSON.stringify(results, null, 2));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return results.verdict === "PASS" ? 0 : (results.errors > 0 ? 2 : 1);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
module.exports = { runGuard };
|
|
Binary file
|
package/bin/runners/runProve.js
CHANGED
|
@@ -31,6 +31,7 @@ const {
|
|
|
31
31
|
saveArtifact
|
|
32
32
|
} = require("./lib/cli-output");
|
|
33
33
|
const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
|
|
34
|
+
const upsell = require("./lib/upsell");
|
|
34
35
|
|
|
35
36
|
let runReality;
|
|
36
37
|
try {
|
|
@@ -1410,6 +1411,13 @@ async function runProve(argsOrOpts = {}, context = {}) {
|
|
|
1410
1411
|
console.log(` ${colors.accent}vibecheck ship --fix${c.reset} ${c.dim}Manual fix mode${c.reset}`);
|
|
1411
1412
|
console.log();
|
|
1412
1413
|
}
|
|
1414
|
+
|
|
1415
|
+
// Upsell for upgrade
|
|
1416
|
+
console.log(upsell.formatNextSteps("prove", finalVerdict, "free"));
|
|
1417
|
+
console.log();
|
|
1418
|
+
console.log(` ${c.dim}${upsell.sym.star} Upgrade for unlimited prove runs + video artifacts${c.reset}`);
|
|
1419
|
+
console.log(` ${c.dim}${upsell.sym.arrow} ${upsell.PRICING_URL}${c.reset}`);
|
|
1420
|
+
console.log();
|
|
1413
1421
|
} else if (ci) {
|
|
1414
1422
|
// CI mode - structured output for easy parsing
|
|
1415
1423
|
console.log(`::group::vibecheck prove summary`);
|
|
@@ -32,6 +32,7 @@ const { parseGlobalFlags, shouldShowBanner } = require("./lib/global-flags");
|
|
|
32
32
|
|
|
33
33
|
// Entitlements enforcement
|
|
34
34
|
const entitlements = require("./lib/entitlements-v2");
|
|
35
|
+
const upsell = require("./lib/upsell");
|
|
35
36
|
|
|
36
37
|
let chromium;
|
|
37
38
|
let playwrightError = null;
|
|
@@ -2076,6 +2077,19 @@ async function runReality(argsOrOpts = {}) {
|
|
|
2076
2077
|
console.log();
|
|
2077
2078
|
}
|
|
2078
2079
|
|
|
2080
|
+
// Upsell for free tier users running in preview mode
|
|
2081
|
+
const currentTier = entitlements.getCurrentTierSync ? entitlements.getCurrentTierSync() : 'free';
|
|
2082
|
+
if (currentTier === 'free') {
|
|
2083
|
+
console.log(upsell.formatEarnedUpsell({
|
|
2084
|
+
cmd: "reality",
|
|
2085
|
+
why: "cap_hit",
|
|
2086
|
+
topIssues: findings.slice(0, 5),
|
|
2087
|
+
upgradeTier: "starter",
|
|
2088
|
+
}));
|
|
2089
|
+
console.log(upsell.formatNextSteps("reality", blocks > 0 ? "BLOCK" : warns > 0 ? "WARN" : "SHIP", currentTier));
|
|
2090
|
+
console.log();
|
|
2091
|
+
}
|
|
2092
|
+
|
|
2079
2093
|
process.exitCode = blocks ? 2 : warns ? 1 : 0;
|
|
2080
2094
|
return process.exitCode;
|
|
2081
2095
|
}
|
package/bin/runners/runScan.js
CHANGED
|
@@ -763,6 +763,13 @@ async function runScan(args) {
|
|
|
763
763
|
findDeprecatedApis,
|
|
764
764
|
findEmptyCatch,
|
|
765
765
|
findUnsafeRegex,
|
|
766
|
+
findSecurityVulnerabilities,
|
|
767
|
+
findPerformanceIssues,
|
|
768
|
+
findCodeQualityIssues,
|
|
769
|
+
findCrossFileIssues,
|
|
770
|
+
findTypeSafetyIssues,
|
|
771
|
+
findAccessibilityIssues,
|
|
772
|
+
findAPIConsistencyIssues,
|
|
766
773
|
clearFileCache, // V3: Memory management
|
|
767
774
|
} = require('./lib/analyzers');
|
|
768
775
|
|
|
@@ -789,8 +796,17 @@ async function runScan(args) {
|
|
|
789
796
|
findings.push(...findEmptyCatch(projectPath));
|
|
790
797
|
findings.push(...findUnsafeRegex(projectPath));
|
|
791
798
|
|
|
792
|
-
//
|
|
799
|
+
// Enhanced analyzers (Security, Performance, Code Quality)
|
|
800
|
+
findings.push(...findSecurityVulnerabilities(projectPath));
|
|
801
|
+
findings.push(...findPerformanceIssues(projectPath));
|
|
802
|
+
findings.push(...findCodeQualityIssues(projectPath));
|
|
803
|
+
|
|
804
|
+
// V3: Clear file cache and AST cache to prevent memory leaks in large monorepos
|
|
793
805
|
clearFileCache();
|
|
806
|
+
const engines = require("./lib/engines/vibecheck-engines");
|
|
807
|
+
if (engines.clearASTCache) {
|
|
808
|
+
engines.clearASTCache();
|
|
809
|
+
}
|
|
794
810
|
|
|
795
811
|
// Convert to scan format matching TypeScript scanner output
|
|
796
812
|
const shipBlockers = findings.map((f, i) => ({
|
package/bin/runners/runTruth.js
CHANGED
|
@@ -37,10 +37,22 @@ async function runTruth(options = {}) {
|
|
|
37
37
|
// Write truthpack files based on scope
|
|
38
38
|
if (scope === "all" || scope === "routes") {
|
|
39
39
|
const routesFile = path.join(truthpackDir, "routes.json");
|
|
40
|
+
// Extract routes from truthpack structure: truthpack.truthpack.routes.server
|
|
41
|
+
const serverRoutes = truthpack.truthpack?.routes?.server || [];
|
|
42
|
+
const gaps = truthpack.truthpack?.routes?.gaps || [];
|
|
43
|
+
const stack = truthpack.truthpack?.project || {};
|
|
44
|
+
|
|
40
45
|
fs.writeFileSync(routesFile, JSON.stringify({
|
|
41
|
-
routes:
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
routes: serverRoutes.map(r => ({
|
|
47
|
+
path: r.path,
|
|
48
|
+
method: r.method,
|
|
49
|
+
handler: r.handler || r.source
|
|
50
|
+
})),
|
|
51
|
+
gaps: gaps,
|
|
52
|
+
stack: {
|
|
53
|
+
framework: stack.frameworks?.[0] || "unknown",
|
|
54
|
+
language: "typescript"
|
|
55
|
+
}
|
|
44
56
|
}, null, 2));
|
|
45
57
|
}
|
|
46
58
|
|
package/bin/vibecheck.js
CHANGED
|
@@ -1123,35 +1123,60 @@ async function main() {
|
|
|
1123
1123
|
process.env.VIBECHECK_LOCAL === '1';
|
|
1124
1124
|
|
|
1125
1125
|
// Auth check (unless skipAuth or offline mode)
|
|
1126
|
-
|
|
1126
|
+
// Only allow login, logout, whoami, and help without auth
|
|
1127
|
+
const authExemptCommands = ['login', 'logout', 'whoami', 'help', '--help', '-h', 'version', '--version'];
|
|
1128
|
+
const needsAuth = !authExemptCommands.includes(cmd) && !cmdDef.skipAuth && !isOffline;
|
|
1129
|
+
|
|
1130
|
+
if (needsAuth) {
|
|
1127
1131
|
const auth = getAuthModule();
|
|
1128
1132
|
const { key } = auth.getApiKey();
|
|
1129
1133
|
authInfo.key = key;
|
|
1130
1134
|
|
|
1135
|
+
// If no API key, prompt for login
|
|
1136
|
+
if (!key) {
|
|
1137
|
+
console.log(`\n ${c.red}❌ Authentication Required${c.reset}`);
|
|
1138
|
+
console.log(` Please log in to use vibecheck.\n`);
|
|
1139
|
+
console.log(` ${c.cyan}Options:${c.reset}`);
|
|
1140
|
+
console.log(` 1. Press ${c.yellow}Enter${c.reset} to open browser and sign up`);
|
|
1141
|
+
console.log(` 2. Visit ${c.underline}https://vibecheckai.dev${c.reset} directly`);
|
|
1142
|
+
console.log(` 3. Run ${c.cyan}vibecheck login${c.reset} after getting your API key\n`);
|
|
1143
|
+
|
|
1144
|
+
// Wait for Enter key
|
|
1145
|
+
const readline = getReadline();
|
|
1146
|
+
readline.createInterface({
|
|
1147
|
+
input: process.stdin,
|
|
1148
|
+
output: process.stdout
|
|
1149
|
+
}).question('', async () => {
|
|
1150
|
+
try {
|
|
1151
|
+
const https = getHttps();
|
|
1152
|
+
const url = 'https://vibecheckai.dev';
|
|
1153
|
+
console.log(`\n Opening ${c.underline}${url}${c.reset} in your browser...\n`);
|
|
1154
|
+
|
|
1155
|
+
// Try to open browser
|
|
1156
|
+
const start = process.platform === 'darwin' ? 'open' :
|
|
1157
|
+
process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
1158
|
+
require('child_process').exec(`${start} ${url}`);
|
|
1159
|
+
} catch (e) {
|
|
1160
|
+
console.log(` Could not open browser. Please visit: ${c.underline}https://vibecheckai.dev${c.reset}`);
|
|
1161
|
+
}
|
|
1162
|
+
process.exit(0);
|
|
1163
|
+
});
|
|
1164
|
+
|
|
1165
|
+
// Keep process alive
|
|
1166
|
+
return new Promise(() => {});
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1131
1169
|
const access = await checkCommandAccess(cmd, cmdArgs, authInfo);
|
|
1132
1170
|
|
|
1133
1171
|
if (!access.allowed) {
|
|
1134
1172
|
console.log(access.reason);
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
if (access.downgrade && !config.quiet) {
|
|
1140
|
-
const upsell = getUpsell();
|
|
1141
|
-
console.log(upsell.formatDowngrade(cmd, {
|
|
1142
|
-
currentTier: access.tier,
|
|
1143
|
-
effectiveMode: access.downgrade,
|
|
1144
|
-
caps: access.caps,
|
|
1145
|
-
}));
|
|
1146
|
-
}
|
|
1147
|
-
|
|
1148
|
-
// Tier badge
|
|
1149
|
-
if (!config.quiet && !config.noBanner) {
|
|
1150
|
-
if (access.tier === "pro") {
|
|
1151
|
-
console.log(`${c.magenta}${sym.arrowRight} PRO${c.reset} ${c.dim}feature${c.reset}`);
|
|
1152
|
-
} else if (access.tier === "complete") {
|
|
1153
|
-
console.log(`${c.yellow}${sym.arrowRight} COMPLETE${c.reset} ${c.dim}feature${c.reset}`);
|
|
1173
|
+
|
|
1174
|
+
// Show upgrade prompt if tier insufficient
|
|
1175
|
+
if (access.upgradeUrl) {
|
|
1176
|
+
console.log(`\n ${c.cyan}Upgrade:${c.reset} ${access.upgradeUrl}`);
|
|
1154
1177
|
}
|
|
1178
|
+
|
|
1179
|
+
return 1;
|
|
1155
1180
|
}
|
|
1156
1181
|
|
|
1157
1182
|
authInfo.access = access;
|
package/mcp-server/package.json
CHANGED