@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.
@@ -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
- ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚══════╝${c.reset}
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 Guardrail Fix Engine.
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, "..", "..", "..", "guardrail.js");
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, "..", "..", "..", "guardrail.js");
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, "..", "..", "..", "guardrail.js");
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({ repoRoot } = {}) {
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);
@@ -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
- async function runProve({
58
- repoRoot,
59
- url,
60
- auth,
61
- storageState,
62
- fastifyEntry,
63
- maxFixRounds = 3,
64
- maxMissions = 8,
65
- maxSteps = 10,
66
- skipReality = false,
67
- skipFix = false,
68
- headed = false,
69
- danger = false,
70
- maxPages = 18,
71
- maxDepth = 2,
72
- timeoutMs = 15000
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
- async function runReality({
375
- repoRoot,
376
- url,
377
- auth,
378
- storageState,
379
- saveStorageState,
380
- truthpack,
381
- verifyAuth = false,
382
- headed = false,
383
- maxPages = 18,
384
- maxDepth = 2,
385
- danger = false,
386
- timeoutMs = 15000
387
- } = {}) {
388
- if (!url) throw new Error("--url is required");
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"
@@ -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)} ██████╗ ██╗ ██╗ █████╗ ██████╗ ██████╗ ██████╗ █████╗ ██╗██╗ ${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}
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}
@@ -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
- async function runShare({ repoRoot, missionDir, outputDir, prComment } = {}) {
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
- const resolvedMissionDir = missionDir
10
- ? (path.isAbsolute(missionDir) ? missionDir : path.join(root, missionDir))
11
- : findLatestMissionDir(root);
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,
@@ -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
- return lastShip?.meta?.verdict === "SHIP" ? 0 : lastShip?.meta?.verdict === "BLOCK" ? 2 : 1;
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({ ...context, url: getArgValue(cmdArgs, ["--url", "-u"]), auth: getArgValue(cmdArgs, ["--auth"]), storageState: getArgValue(cmdArgs, ["--storage-state"]), fastifyEntry: getArgValue(cmdArgs, ["--fastify-entry"]), maxFixRounds: parseInt(getArgValue(cmdArgs, ["--max-fix-rounds"]) || "3", 10), skipReality: cmdArgs.includes("--skip-reality"), skipFix: cmdArgs.includes("--skip-fix"), headed: cmdArgs.includes("--headed"), danger: cmdArgs.includes("--danger") }); break;
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(context); break;
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({ ...context, missionDir: getArgValue(cmdArgs, ["--mission-dir"]), outputDir: getArgValue(cmdArgs, ["--output-dir"]), prComment: cmdArgs.includes("--pr-comment") }); break;
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.7",
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",