@vibecheckai/cli 3.0.7 → 3.0.8
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/runners/cli-utils.js +6 -6
- package/bin/runners/lib/firewall-prompt.js +1 -1
- package/bin/runners/lib/sandbox/proof-chain.js +3 -3
- package/bin/runners/runInstall.js +41 -1
- package/bin/runners/runProve.js +85 -27
- package/bin/runners/runReality.js +89 -15
- package/bin/runners/runScan.js +6 -6
- package/bin/runners/runShare.js +64 -4
- package/bin/runners/runStatus.js +3 -1
- package/bin/vibecheck.js +3 -3
- package/package.json +6 -2
package/bin/runners/cli-utils.js
CHANGED
|
@@ -38,12 +38,12 @@ const c = {
|
|
|
38
38
|
|
|
39
39
|
// ASCII Art Banner
|
|
40
40
|
const BANNER = `
|
|
41
|
-
${c.brightCyan}
|
|
42
|
-
|
|
43
|
-
██║
|
|
44
|
-
██║
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
${c.brightCyan} ██╗ ██╗██╗██████╗ ███████╗ ██████╗██╗ ██╗███████╗ ██████╗██╗ ██╗
|
|
42
|
+
██║ ██║██║██╔══██╗██╔════╝██╔════╝██║ ██║██╔════╝██╔════╝██║ ██╔╝
|
|
43
|
+
██║ ██║██║██████╔╝█████╗ ██║ ███████║█████╗ ██║ █████╔╝
|
|
44
|
+
╚██╗ ██╔╝██║██╔══██╗██╔══╝ ██║ ██╔══██║██╔══╝ ██║ ██╔═██╗
|
|
45
|
+
╚████╔╝ ██║██████╔╝███████╗╚██████╗██║ ██║███████╗╚██████╗██║ ██╗
|
|
46
|
+
╚═══╝ ╚═╝╚═════╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝${c.reset}
|
|
47
47
|
${c.dim} AI-Native Code Security Platform${c.reset}
|
|
48
48
|
`;
|
|
49
49
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// bin/runners/lib/firewall-prompt.js
|
|
2
2
|
function buildRealityFirewall({ truthpackSummary, mission, template, findings, fileSnippets, allowedFiles }) {
|
|
3
3
|
return `
|
|
4
|
-
You are
|
|
4
|
+
You are Vibecheck Fix Engine.
|
|
5
5
|
|
|
6
6
|
REALITY RULES (non-negotiable):
|
|
7
7
|
- Do NOT invent files, routes, env vars, middleware, or functions.
|
|
@@ -82,7 +82,7 @@ async function runStaticProof(sandboxPath, options) {
|
|
|
82
82
|
|
|
83
83
|
// Run vibecheck ship in sandbox
|
|
84
84
|
try {
|
|
85
|
-
const vibecheckBin = path.join(__dirname, "..", "..", "..", "
|
|
85
|
+
const vibecheckBin = path.join(__dirname, "..", "..", "..", "vibecheck.js");
|
|
86
86
|
const output = execSync(`node "${vibecheckBin}" ship --json`, {
|
|
87
87
|
cwd: sandboxPath,
|
|
88
88
|
encoding: "utf8",
|
|
@@ -120,7 +120,7 @@ async function runStaticProof(sandboxPath, options) {
|
|
|
120
120
|
const contractsDir = path.join(sandboxPath, ".vibecheck", "contracts");
|
|
121
121
|
if (fs.existsSync(contractsDir)) {
|
|
122
122
|
try {
|
|
123
|
-
const vibecheckBin = path.join(__dirname, "..", "..", "..", "
|
|
123
|
+
const vibecheckBin = path.join(__dirname, "..", "..", "..", "vibecheck.js");
|
|
124
124
|
const output = execSync(`node "${vibecheckBin}" ctx guard --json`, {
|
|
125
125
|
cwd: sandboxPath,
|
|
126
126
|
encoding: "utf8",
|
|
@@ -293,7 +293,7 @@ async function runRealityProof(sandboxPath, options) {
|
|
|
293
293
|
|
|
294
294
|
// Run vibecheck reality
|
|
295
295
|
try {
|
|
296
|
-
const vibecheckBin = path.join(__dirname, "..", "..", "..", "
|
|
296
|
+
const vibecheckBin = path.join(__dirname, "..", "..", "..", "vibecheck.js");
|
|
297
297
|
const cmd = `node "${vibecheckBin}" reality --url ${options.url} --max-pages 5 --max-depth 1`;
|
|
298
298
|
|
|
299
299
|
execSync(cmd, {
|
|
@@ -6,11 +6,51 @@ const { detectPackageManager, detectNext, detectFastify, detectFastifyEntry } =
|
|
|
6
6
|
const { readPkg, writePkg, upsertScripts } = require("./lib/pkgjson");
|
|
7
7
|
const { writeEnvTemplateFromTruthpack } = require("./lib/env-template");
|
|
8
8
|
|
|
9
|
+
function printHelp() {
|
|
10
|
+
console.log(`
|
|
11
|
+
vibecheck install - Zero-friction onboarding
|
|
12
|
+
|
|
13
|
+
USAGE
|
|
14
|
+
vibecheck install [options]
|
|
15
|
+
|
|
16
|
+
OPTIONS
|
|
17
|
+
--path, -p <dir> Project path (default: current directory)
|
|
18
|
+
--help, -h Show this help
|
|
19
|
+
|
|
20
|
+
WHAT IT DOES
|
|
21
|
+
1. Detects package manager (npm, yarn, pnpm)
|
|
22
|
+
2. Detects frameworks (Next.js, Fastify)
|
|
23
|
+
3. Builds initial truthpack
|
|
24
|
+
4. Creates .vibecheck/config.json
|
|
25
|
+
5. Generates env template from truthpack
|
|
26
|
+
6. Adds vibecheck scripts to package.json
|
|
27
|
+
|
|
28
|
+
CREATED FILES
|
|
29
|
+
.vibecheck/config.json - Local configuration
|
|
30
|
+
.vibecheck/truthpack.json - Ground truth for AI agents
|
|
31
|
+
.env.template - Env vars from truthpack
|
|
32
|
+
|
|
33
|
+
EXAMPLES
|
|
34
|
+
vibecheck install # Install in current directory
|
|
35
|
+
vibecheck install --path ./my-app # Install in specific directory
|
|
36
|
+
`);
|
|
37
|
+
}
|
|
38
|
+
|
|
9
39
|
function ensureDir(p) {
|
|
10
40
|
fs.mkdirSync(p, { recursive: true });
|
|
11
41
|
}
|
|
12
42
|
|
|
13
|
-
async function runInstall(
|
|
43
|
+
async function runInstall(argsOrContext = {}) {
|
|
44
|
+
// Handle array args from CLI
|
|
45
|
+
if (Array.isArray(argsOrContext)) {
|
|
46
|
+
if (argsOrContext.includes("--help") || argsOrContext.includes("-h")) {
|
|
47
|
+
printHelp();
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
argsOrContext = { repoRoot: process.cwd() };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const { repoRoot } = argsOrContext;
|
|
14
54
|
const root = repoRoot || process.cwd();
|
|
15
55
|
|
|
16
56
|
const { path: pkgPath, json: pkg } = readPkg(root);
|
package/bin/runners/runProve.js
CHANGED
|
@@ -33,16 +33,7 @@ try {
|
|
|
33
33
|
runFixCore = null;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
const c =
|
|
37
|
-
reset: "\x1b[0m",
|
|
38
|
-
bold: "\x1b[1m",
|
|
39
|
-
dim: "\x1b[2m",
|
|
40
|
-
red: "\x1b[31m",
|
|
41
|
-
green: "\x1b[32m",
|
|
42
|
-
yellow: "\x1b[33m",
|
|
43
|
-
cyan: "\x1b[36m",
|
|
44
|
-
blue: "\x1b[34m",
|
|
45
|
-
};
|
|
36
|
+
const { c, sym, Spinner, printHeader, printSection, printDivider, verdictBadge, formatDuration, box } = require("./lib/ui");
|
|
46
37
|
|
|
47
38
|
function ensureDir(p) {
|
|
48
39
|
fs.mkdirSync(p, { recursive: true });
|
|
@@ -54,23 +45,90 @@ function stamp() {
|
|
|
54
45
|
return `${d.getFullYear()}${z(d.getMonth() + 1)}${z(d.getDate())}_${z(d.getHours())}${z(d.getMinutes())}${z(d.getSeconds())}`;
|
|
55
46
|
}
|
|
56
47
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
48
|
+
function printHelp() {
|
|
49
|
+
console.log(`
|
|
50
|
+
${c.cyan}${c.bold}vibecheck prove${c.reset} - One Command Reality Proof
|
|
51
|
+
|
|
52
|
+
${c.bold}USAGE${c.reset}
|
|
53
|
+
vibecheck prove [options]
|
|
54
|
+
|
|
55
|
+
${c.bold}OPTIONS${c.reset}
|
|
56
|
+
--url, -u <url> Base URL for runtime testing
|
|
57
|
+
--auth <email:pass> Login credentials for auth verification
|
|
58
|
+
--storage-state <path> Playwright session state file
|
|
59
|
+
--fastify-entry <path> Fastify entry file for route extraction
|
|
60
|
+
--max-fix-rounds <n> Max auto-fix attempts (default: 3)
|
|
61
|
+
--skip-reality Skip runtime crawling (static only)
|
|
62
|
+
--skip-fix Don't auto-fix, just diagnose
|
|
63
|
+
--headed Run browser in headed mode
|
|
64
|
+
--danger Allow clicking destructive elements
|
|
65
|
+
--help, -h Show this help
|
|
66
|
+
|
|
67
|
+
${c.bold}WHAT IT DOES${c.reset}
|
|
68
|
+
1. ${c.cyan}ctx${c.reset} - Refresh truthpack (ground truth)
|
|
69
|
+
2. ${c.cyan}reality${c.reset} - Runtime UI proof (if --url provided)
|
|
70
|
+
3. ${c.cyan}ship${c.reset} - Static + runtime verdict
|
|
71
|
+
4. ${c.cyan}fix${c.reset} - Auto-fix if BLOCK (up to N rounds)
|
|
72
|
+
5. ${c.cyan}verify${c.reset} - Re-run to confirm SHIP
|
|
73
|
+
|
|
74
|
+
${c.bold}EXIT CODES${c.reset}
|
|
75
|
+
0 = SHIP (ready to deploy)
|
|
76
|
+
1 = WARN (warnings found)
|
|
77
|
+
2 = BLOCK (blockers found)
|
|
78
|
+
|
|
79
|
+
${c.bold}EXAMPLES${c.reset}
|
|
80
|
+
vibecheck prove --url http://localhost:3000
|
|
81
|
+
vibecheck prove --url http://localhost:3000 --auth user@test.com:pass
|
|
82
|
+
vibecheck prove --skip-reality
|
|
83
|
+
vibecheck prove --url http://localhost:3000 --max-fix-rounds 5
|
|
84
|
+
`);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function runProve(argsOrOpts = {}) {
|
|
88
|
+
// Handle array args from CLI
|
|
89
|
+
if (Array.isArray(argsOrOpts)) {
|
|
90
|
+
if (argsOrOpts.includes("--help") || argsOrOpts.includes("-h")) {
|
|
91
|
+
printHelp();
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
const getArg = (flags) => {
|
|
95
|
+
for (const f of flags) {
|
|
96
|
+
const idx = argsOrOpts.indexOf(f);
|
|
97
|
+
if (idx !== -1 && idx < argsOrOpts.length - 1) return argsOrOpts[idx + 1];
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
};
|
|
101
|
+
argsOrOpts = {
|
|
102
|
+
url: getArg(["--url", "-u"]),
|
|
103
|
+
auth: getArg(["--auth"]),
|
|
104
|
+
storageState: getArg(["--storage-state"]),
|
|
105
|
+
fastifyEntry: getArg(["--fastify-entry"]),
|
|
106
|
+
maxFixRounds: parseInt(getArg(["--max-fix-rounds"]) || "3", 10),
|
|
107
|
+
skipReality: argsOrOpts.includes("--skip-reality"),
|
|
108
|
+
skipFix: argsOrOpts.includes("--skip-fix"),
|
|
109
|
+
headed: argsOrOpts.includes("--headed"),
|
|
110
|
+
danger: argsOrOpts.includes("--danger"),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const {
|
|
115
|
+
repoRoot,
|
|
116
|
+
url,
|
|
117
|
+
auth,
|
|
118
|
+
storageState,
|
|
119
|
+
fastifyEntry,
|
|
120
|
+
maxFixRounds = 3,
|
|
121
|
+
maxMissions = 8,
|
|
122
|
+
maxSteps = 10,
|
|
123
|
+
skipReality = false,
|
|
124
|
+
skipFix = false,
|
|
125
|
+
headed = false,
|
|
126
|
+
danger = false,
|
|
127
|
+
maxPages = 18,
|
|
128
|
+
maxDepth = 2,
|
|
129
|
+
timeoutMs = 15000
|
|
130
|
+
} = argsOrOpts;
|
|
131
|
+
|
|
74
132
|
const root = repoRoot || process.cwd();
|
|
75
133
|
const startTime = Date.now();
|
|
76
134
|
|
|
@@ -371,21 +371,95 @@ function coverageFromTruthpack({ truthpack, visitedUrls }) {
|
|
|
371
371
|
return { total, hit, percent: total ? Math.round((hit / total) * 100) : 0, missed: Array.from(uiPaths).filter(p => !visitedPaths.has(p)).slice(0, 50) };
|
|
372
372
|
}
|
|
373
373
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
374
|
+
function printHelp() {
|
|
375
|
+
console.log(`
|
|
376
|
+
vibecheck reality - Runtime UI Verification
|
|
377
|
+
|
|
378
|
+
USAGE
|
|
379
|
+
vibecheck reality --url <url> [options]
|
|
380
|
+
|
|
381
|
+
OPTIONS
|
|
382
|
+
--url, -u <url> Base URL for runtime testing (required)
|
|
383
|
+
--auth <email:pass> Login credentials for auth verification
|
|
384
|
+
--storage-state <path> Playwright session state file
|
|
385
|
+
--save-storage-state <p> Save session state after login
|
|
386
|
+
--truthpack <path> Custom truthpack path
|
|
387
|
+
--verify-auth Enable two-pass auth verification
|
|
388
|
+
--headed Run browser in headed mode (visible)
|
|
389
|
+
--danger Allow clicking potentially destructive elements
|
|
390
|
+
--max-pages <n> Max pages to crawl (default: 18)
|
|
391
|
+
--max-depth <n> Max crawl depth (default: 2)
|
|
392
|
+
--timeout <ms> Page timeout (default: 15000)
|
|
393
|
+
--help, -h Show this help
|
|
394
|
+
|
|
395
|
+
WHAT IT DOES
|
|
396
|
+
1. Pass A (Anon): Crawls and clicks, records protected routes
|
|
397
|
+
2. Pass B (Auth): Re-crawls with auth, verifies access
|
|
398
|
+
3. Detects dead UI (clicks that do nothing)
|
|
399
|
+
4. Calculates route coverage stats
|
|
400
|
+
|
|
401
|
+
FINDINGS
|
|
402
|
+
- Dead UI → FIX_DEAD_UI mission
|
|
403
|
+
- Auth gaps → ADD_SERVER_AUTH mission
|
|
404
|
+
- HTTP errors → error findings
|
|
405
|
+
|
|
406
|
+
EXAMPLES
|
|
407
|
+
vibecheck reality --url http://localhost:3000
|
|
408
|
+
vibecheck reality --url http://localhost:3000 --verify-auth --auth user@test.com:pass123
|
|
409
|
+
vibecheck reality --url http://localhost:3000 --headed --danger
|
|
410
|
+
`);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
async function runReality(argsOrOpts = {}) {
|
|
414
|
+
// Handle array args from CLI
|
|
415
|
+
if (Array.isArray(argsOrOpts)) {
|
|
416
|
+
if (argsOrOpts.includes("--help") || argsOrOpts.includes("-h")) {
|
|
417
|
+
printHelp();
|
|
418
|
+
return 0;
|
|
419
|
+
}
|
|
420
|
+
// Parse args to options
|
|
421
|
+
const getArg = (flags) => {
|
|
422
|
+
for (const f of flags) {
|
|
423
|
+
const idx = argsOrOpts.indexOf(f);
|
|
424
|
+
if (idx !== -1 && idx < argsOrOpts.length - 1) return argsOrOpts[idx + 1];
|
|
425
|
+
}
|
|
426
|
+
return undefined;
|
|
427
|
+
};
|
|
428
|
+
argsOrOpts = {
|
|
429
|
+
url: getArg(["--url", "-u"]),
|
|
430
|
+
auth: getArg(["--auth"]),
|
|
431
|
+
storageState: getArg(["--storage-state"]),
|
|
432
|
+
saveStorageState: getArg(["--save-storage-state"]),
|
|
433
|
+
truthpack: getArg(["--truthpack"]),
|
|
434
|
+
verifyAuth: argsOrOpts.includes("--verify-auth"),
|
|
435
|
+
headed: argsOrOpts.includes("--headed"),
|
|
436
|
+
danger: argsOrOpts.includes("--danger"),
|
|
437
|
+
maxPages: parseInt(getArg(["--max-pages"]) || "18", 10),
|
|
438
|
+
maxDepth: parseInt(getArg(["--max-depth"]) || "2", 10),
|
|
439
|
+
timeoutMs: parseInt(getArg(["--timeout"]) || "15000", 10),
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
const {
|
|
444
|
+
repoRoot,
|
|
445
|
+
url,
|
|
446
|
+
auth,
|
|
447
|
+
storageState,
|
|
448
|
+
saveStorageState,
|
|
449
|
+
truthpack,
|
|
450
|
+
verifyAuth = false,
|
|
451
|
+
headed = false,
|
|
452
|
+
maxPages = 18,
|
|
453
|
+
maxDepth = 2,
|
|
454
|
+
danger = false,
|
|
455
|
+
timeoutMs = 15000
|
|
456
|
+
} = argsOrOpts;
|
|
457
|
+
|
|
458
|
+
if (!url) {
|
|
459
|
+
printHelp();
|
|
460
|
+
console.log("\n❌ Error: --url is required\n");
|
|
461
|
+
return 1;
|
|
462
|
+
}
|
|
389
463
|
if (!chromium) {
|
|
390
464
|
const hint = playwrightError?.includes("Cannot find module")
|
|
391
465
|
? "Run: npm i -D playwright && npx playwright install chromium"
|
package/bin/runners/runScan.js
CHANGED
|
@@ -88,12 +88,12 @@ const gradientPink = rgb(255, 105, 180);
|
|
|
88
88
|
const gradientOrange = rgb(255, 165, 0);
|
|
89
89
|
|
|
90
90
|
const BANNER = `
|
|
91
|
-
${rgb(0, 200, 255)}
|
|
92
|
-
${rgb(30, 180, 255)}
|
|
93
|
-
${rgb(60, 160, 255)} ██║
|
|
94
|
-
${rgb(90, 140, 255)} ██║
|
|
95
|
-
${rgb(120, 120, 255)}
|
|
96
|
-
${rgb(150, 100, 255)}
|
|
91
|
+
${rgb(0, 200, 255)} ██╗ ██╗██╗██████╗ ███████╗ ██████╗██╗ ██╗███████╗ ██████╗██╗ ██╗${c.reset}
|
|
92
|
+
${rgb(30, 180, 255)} ██║ ██║██║██╔══██╗██╔════╝██╔════╝██║ ██║██╔════╝██╔════╝██║ ██╔╝${c.reset}
|
|
93
|
+
${rgb(60, 160, 255)} ██║ ██║██║██████╔╝█████╗ ██║ ███████║█████╗ ██║ █████╔╝ ${c.reset}
|
|
94
|
+
${rgb(90, 140, 255)} ╚██╗ ██╔╝██║██╔══██╗██╔══╝ ██║ ██╔══██║██╔══╝ ██║ ██╔═██╗ ${c.reset}
|
|
95
|
+
${rgb(120, 120, 255)} ╚████╔╝ ██║██████╔╝███████╗╚██████╗██║ ██║███████╗╚██████╗██║ ██╗${c.reset}
|
|
96
|
+
${rgb(150, 100, 255)} ╚═══╝ ╚═╝╚═════╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝${c.reset}
|
|
97
97
|
|
|
98
98
|
${c.dim} ┌─────────────────────────────────────────────────────────────────────┐${c.reset}
|
|
99
99
|
${c.dim} │${c.reset} ${rgb(255, 255, 255)}${c.bold}Route Integrity${c.reset} ${c.dim}•${c.reset} ${rgb(200, 200, 200)}Security${c.reset} ${c.dim}•${c.reset} ${rgb(150, 150, 150)}Quality${c.reset} ${c.dim}•${c.reset} ${rgb(100, 100, 100)}Ship with Confidence${c.reset} ${c.dim}│${c.reset}
|
package/bin/runners/runShare.js
CHANGED
|
@@ -3,12 +3,72 @@ const fs = require("fs");
|
|
|
3
3
|
const path = require("path");
|
|
4
4
|
const { buildSharePack, findLatestMissionDir } = require("./lib/share-pack");
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
function printHelp() {
|
|
7
|
+
console.log(`
|
|
8
|
+
vibecheck share - Generate shareable proof bundles
|
|
9
|
+
|
|
10
|
+
USAGE
|
|
11
|
+
vibecheck share [options]
|
|
12
|
+
|
|
13
|
+
OPTIONS
|
|
14
|
+
--mission-dir <path> Specific mission directory to share
|
|
15
|
+
--output-dir <path> Output directory for share pack
|
|
16
|
+
--pr-comment Print PR comment to stdout
|
|
17
|
+
--help, -h Show this help
|
|
18
|
+
|
|
19
|
+
WHAT IT DOES
|
|
20
|
+
1. Finds latest mission pack from .vibecheck/missions/
|
|
21
|
+
2. Generates share bundle with:
|
|
22
|
+
- share.json (machine readable)
|
|
23
|
+
- share.md (human readable)
|
|
24
|
+
- pr_comment.md (GitHub ready)
|
|
25
|
+
|
|
26
|
+
OUTPUT FILES
|
|
27
|
+
.vibecheck/missions/<timestamp>/share/share.json
|
|
28
|
+
.vibecheck/missions/<timestamp>/share/share.md
|
|
29
|
+
.vibecheck/missions/<timestamp>/share/pr_comment.md
|
|
30
|
+
|
|
31
|
+
EXAMPLES
|
|
32
|
+
vibecheck share # Share latest mission
|
|
33
|
+
vibecheck share --pr-comment # Print PR comment body
|
|
34
|
+
vibecheck fix --autopilot --share # Fix then auto-share
|
|
35
|
+
`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function runShare(argsOrOpts = {}) {
|
|
39
|
+
// Handle array args from CLI
|
|
40
|
+
if (Array.isArray(argsOrOpts)) {
|
|
41
|
+
if (argsOrOpts.includes("--help") || argsOrOpts.includes("-h")) {
|
|
42
|
+
printHelp();
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
const getArg = (flags) => {
|
|
46
|
+
for (const f of flags) {
|
|
47
|
+
const idx = argsOrOpts.indexOf(f);
|
|
48
|
+
if (idx !== -1 && idx < argsOrOpts.length - 1) return argsOrOpts[idx + 1];
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
};
|
|
52
|
+
argsOrOpts = {
|
|
53
|
+
missionDir: getArg(["--mission-dir"]),
|
|
54
|
+
outputDir: getArg(["--output-dir"]),
|
|
55
|
+
prComment: argsOrOpts.includes("--pr-comment"),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const { repoRoot, missionDir, outputDir, prComment } = argsOrOpts;
|
|
7
60
|
const root = repoRoot || process.cwd();
|
|
8
61
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
62
|
+
let resolvedMissionDir;
|
|
63
|
+
try {
|
|
64
|
+
resolvedMissionDir = missionDir
|
|
65
|
+
? (path.isAbsolute(missionDir) ? missionDir : path.join(root, missionDir))
|
|
66
|
+
: findLatestMissionDir(root);
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.log(`\n❌ Error: ${e.message}\n`);
|
|
69
|
+
console.log(`Run 'vibecheck fix --autopilot' first to generate mission packs.\n`);
|
|
70
|
+
return 1;
|
|
71
|
+
}
|
|
12
72
|
|
|
13
73
|
const res = buildSharePack({
|
|
14
74
|
repoRoot: root,
|
package/bin/runners/runStatus.js
CHANGED
|
@@ -130,7 +130,9 @@ ${c.bold}Quick Actions${c.reset}
|
|
|
130
130
|
${lastShip?.meta?.verdict === "SHIP" ? `${c.green}✓ Ready to deploy!${c.reset}` : ""}
|
|
131
131
|
`);
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
// Exit 0 when showing status successfully (even if no ship yet)
|
|
134
|
+
// Only return non-zero if explicitly checking for BLOCK
|
|
135
|
+
return 0;
|
|
134
136
|
}
|
|
135
137
|
|
|
136
138
|
module.exports = { runStatus };
|
package/bin/vibecheck.js
CHANGED
|
@@ -447,7 +447,7 @@ async function main() {
|
|
|
447
447
|
const context = { repoRoot: process.cwd(), config, state, authInfo, version: VERSION, isCI: isCI() };
|
|
448
448
|
|
|
449
449
|
switch (cmd) {
|
|
450
|
-
case "prove": exitCode = await runner(
|
|
450
|
+
case "prove": exitCode = await runner(cmdArgs); break;
|
|
451
451
|
case "reality": exitCode = await runner({ ...context, url: getArgValue(cmdArgs, ["--url", "-u"]), auth: getArgValue(cmdArgs, ["--auth"]), storageState: getArgValue(cmdArgs, ["--storage-state"]), saveStorageState: getArgValue(cmdArgs, ["--save-storage-state"]), truthpack: getArgValue(cmdArgs, ["--truthpack"]), verifyAuth: cmdArgs.includes("--verify-auth"), headed: cmdArgs.includes("--headed"), danger: cmdArgs.includes("--danger") }); break;
|
|
452
452
|
case "watch": exitCode = await runner({ ...context, fastifyEntry: getArgValue(cmdArgs, ["--fastify-entry"]), debounceMs: parseInt(getArgValue(cmdArgs, ["--debounce"]) || "500", 10), clearScreen: !cmdArgs.includes("--no-clear") }); break;
|
|
453
453
|
case "ctx": case "truthpack":
|
|
@@ -457,10 +457,10 @@ async function main() {
|
|
|
457
457
|
else if (cmdArgs[0] === "search") { const { runContext } = require("./runners/runContext"); exitCode = await runContext(["--search", ...cmdArgs.slice(1)]); }
|
|
458
458
|
else { exitCode = await runner({ ...context, fastifyEntry: getArgValue(cmdArgs, ["--fastify-entry"]), print: cmdArgs.includes("--print") }); }
|
|
459
459
|
break;
|
|
460
|
-
case "install": exitCode = await runner(
|
|
460
|
+
case "install": exitCode = await runner(cmdArgs); break;
|
|
461
461
|
case "status": exitCode = await runner({ ...context, json: cmdArgs.includes("--json") }); break;
|
|
462
462
|
case "pr": exitCode = await runner({ ...context, fastifyEntry: getArgValue(cmdArgs, ["--fastify-entry"]), out: getArgValue(cmdArgs, ["--out"]), failOnWarn: cmdArgs.includes("--fail-on-warn"), maxFindings: parseInt(getArgValue(cmdArgs, ["--max-findings"]) || "12", 10) }); break;
|
|
463
|
-
case "share": exitCode = await runner(
|
|
463
|
+
case "share": exitCode = await runner(cmdArgs); break;
|
|
464
464
|
default: exitCode = await runner(cmdArgs);
|
|
465
465
|
}
|
|
466
466
|
} catch (error) { console.error(formatError(error, config)); exitCode = 1; }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibecheckai/cli",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.8",
|
|
4
4
|
"description": "Vibecheck CLI - Ship with confidence. One verdict: SHIP | WARN | BLOCK.",
|
|
5
5
|
"main": "bin/vibecheck.js",
|
|
6
6
|
"bin": {
|
|
@@ -18,7 +18,11 @@
|
|
|
18
18
|
"build:legacy": "node scripts/build.js",
|
|
19
19
|
"dev": "node ../../bin/vibecheck.js",
|
|
20
20
|
"start": "node bin/vibecheck.js",
|
|
21
|
-
"prepublishOnly": "npm run build"
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"vibecheck:ctx": "vibecheck ctx",
|
|
23
|
+
"vibecheck:ship": "vibecheck ship",
|
|
24
|
+
"vibecheck:fix": "vibecheck fix --apply",
|
|
25
|
+
"vibecheck:pr": "vibecheck pr"
|
|
22
26
|
},
|
|
23
27
|
"dependencies": {
|
|
24
28
|
"@babel/parser": "^7.23.0",
|