@vibecheckai/cli 3.0.9 → 3.0.10

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.
@@ -1,3 +1,14 @@
1
+ /**
2
+ * vibecheck init - Enterprise Project Setup
3
+ *
4
+ * ═══════════════════════════════════════════════════════════════════════════════
5
+ * ENTERPRISE EDITION - World-Class Terminal Experience
6
+ * ═══════════════════════════════════════════════════════════════════════════════
7
+ *
8
+ * Configure your project for production-grade verification.
9
+ * Interactive wizard or quick setup for any project type.
10
+ */
11
+
1
12
  const fs = require("fs");
2
13
  const path = require("path");
3
14
 
@@ -17,6 +28,580 @@ try {
17
28
  EnterpriseInit = null;
18
29
  }
19
30
 
31
+ // ═══════════════════════════════════════════════════════════════════════════════
32
+ // ADVANCED TERMINAL - ANSI CODES & UTILITIES
33
+ // ═══════════════════════════════════════════════════════════════════════════════
34
+
35
+ const c = {
36
+ reset: '\x1b[0m',
37
+ bold: '\x1b[1m',
38
+ dim: '\x1b[2m',
39
+ italic: '\x1b[3m',
40
+ underline: '\x1b[4m',
41
+ blink: '\x1b[5m',
42
+ inverse: '\x1b[7m',
43
+ hidden: '\x1b[8m',
44
+ strike: '\x1b[9m',
45
+ // Colors
46
+ black: '\x1b[30m',
47
+ red: '\x1b[31m',
48
+ green: '\x1b[32m',
49
+ yellow: '\x1b[33m',
50
+ blue: '\x1b[34m',
51
+ magenta: '\x1b[35m',
52
+ cyan: '\x1b[36m',
53
+ white: '\x1b[37m',
54
+ // Bright colors
55
+ gray: '\x1b[90m',
56
+ brightRed: '\x1b[91m',
57
+ brightGreen: '\x1b[92m',
58
+ brightYellow: '\x1b[93m',
59
+ brightBlue: '\x1b[94m',
60
+ brightMagenta: '\x1b[95m',
61
+ brightCyan: '\x1b[96m',
62
+ brightWhite: '\x1b[97m',
63
+ // Background
64
+ bgBlack: '\x1b[40m',
65
+ bgRed: '\x1b[41m',
66
+ bgGreen: '\x1b[42m',
67
+ bgYellow: '\x1b[43m',
68
+ bgBlue: '\x1b[44m',
69
+ bgMagenta: '\x1b[45m',
70
+ bgCyan: '\x1b[46m',
71
+ bgWhite: '\x1b[47m',
72
+ // Cursor control
73
+ cursorUp: (n = 1) => `\x1b[${n}A`,
74
+ cursorDown: (n = 1) => `\x1b[${n}B`,
75
+ cursorRight: (n = 1) => `\x1b[${n}C`,
76
+ cursorLeft: (n = 1) => `\x1b[${n}D`,
77
+ clearLine: '\x1b[2K',
78
+ clearScreen: '\x1b[2J',
79
+ saveCursor: '\x1b[s',
80
+ restoreCursor: '\x1b[u',
81
+ hideCursor: '\x1b[?25l',
82
+ showCursor: '\x1b[?25h',
83
+ };
84
+
85
+ // True color support
86
+ const rgb = (r, g, b) => `\x1b[38;2;${r};${g};${b}m`;
87
+ const bgRgb = (r, g, b) => `\x1b[48;2;${r};${g};${b}m`;
88
+
89
+ // Premium color palette (gold/amber theme for "init/setup")
90
+ const colors = {
91
+ // Gradient for banner
92
+ gradient1: rgb(255, 215, 100), // Gold
93
+ gradient2: rgb(255, 200, 80), // Light gold
94
+ gradient3: rgb(255, 180, 60), // Amber
95
+ gradient4: rgb(255, 160, 40), // Deep amber
96
+ gradient5: rgb(255, 140, 20), // Orange-amber
97
+ gradient6: rgb(255, 120, 0), // Deep orange
98
+
99
+ // Category colors
100
+ framework: rgb(100, 200, 255), // Blue
101
+ database: rgb(200, 150, 255), // Purple
102
+ auth: rgb(100, 255, 180), // Green
103
+ payment: rgb(255, 200, 100), // Gold
104
+ ci: rgb(255, 150, 100), // Coral
105
+ deploy: rgb(150, 200, 255), // Light blue
106
+ testing: rgb(200, 255, 150), // Lime
107
+
108
+ // Status colors
109
+ success: rgb(0, 255, 150),
110
+ warning: rgb(255, 200, 0),
111
+ error: rgb(255, 80, 80),
112
+ info: rgb(100, 200, 255),
113
+
114
+ // UI colors
115
+ accent: rgb(255, 200, 100),
116
+ muted: rgb(140, 130, 100),
117
+ subtle: rgb(100, 90, 70),
118
+ highlight: rgb(255, 255, 255),
119
+
120
+ // Enterprise
121
+ enterprise: rgb(200, 150, 255),
122
+ compliance: rgb(100, 200, 150),
123
+ team: rgb(150, 180, 255),
124
+ };
125
+
126
+ // ═══════════════════════════════════════════════════════════════════════════════
127
+ // PREMIUM BANNER
128
+ // ═══════════════════════════════════════════════════════════════════════════════
129
+
130
+ const INIT_BANNER = `
131
+ ${rgb(255, 220, 120)} ██╗███╗ ██╗██╗████████╗${c.reset}
132
+ ${rgb(255, 200, 100)} ██║████╗ ██║██║╚══██╔══╝${c.reset}
133
+ ${rgb(255, 180, 80)} ██║██╔██╗ ██║██║ ██║ ${c.reset}
134
+ ${rgb(255, 160, 60)} ██║██║╚██╗██║██║ ██║ ${c.reset}
135
+ ${rgb(255, 140, 40)} ██║██║ ╚████║██║ ██║ ${c.reset}
136
+ ${rgb(255, 120, 20)} ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ${c.reset}
137
+ `;
138
+
139
+ const BANNER_FULL = `
140
+ ${rgb(255, 220, 120)} ██╗ ██╗██╗██████╗ ███████╗ ██████╗██╗ ██╗███████╗ ██████╗██╗ ██╗${c.reset}
141
+ ${rgb(255, 200, 100)} ██║ ██║██║██╔══██╗██╔════╝██╔════╝██║ ██║██╔════╝██╔════╝██║ ██╔╝${c.reset}
142
+ ${rgb(255, 180, 80)} ██║ ██║██║██████╔╝█████╗ ██║ ███████║█████╗ ██║ █████╔╝ ${c.reset}
143
+ ${rgb(255, 160, 60)} ╚██╗ ██╔╝██║██╔══██╗██╔══╝ ██║ ██╔══██║██╔══╝ ██║ ██╔═██╗ ${c.reset}
144
+ ${rgb(255, 140, 40)} ╚████╔╝ ██║██████╔╝███████╗╚██████╗██║ ██║███████╗╚██████╗██║ ██╗${c.reset}
145
+ ${rgb(255, 120, 20)} ╚═══╝ ╚═╝╚═════╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═════╝╚═╝ ╚═╝${c.reset}
146
+
147
+ ${c.dim} ┌─────────────────────────────────────────────────────────────────────┐${c.reset}
148
+ ${c.dim} │${c.reset} ${rgb(255, 200, 100)}⚡${c.reset} ${c.bold}INIT${c.reset} ${c.dim}•${c.reset} ${rgb(200, 200, 200)}Project Setup${c.reset} ${c.dim}•${c.reset} ${rgb(150, 150, 150)}Enterprise Ready${c.reset} ${c.dim}│${c.reset}
149
+ ${c.dim} └─────────────────────────────────────────────────────────────────────┘${c.reset}
150
+ `;
151
+
152
+ // ═══════════════════════════════════════════════════════════════════════════════
153
+ // ICONS & SYMBOLS
154
+ // ═══════════════════════════════════════════════════════════════════════════════
155
+
156
+ const ICONS = {
157
+ // Main
158
+ init: '⚡',
159
+ setup: '🔧',
160
+ config: '⚙️',
161
+ wizard: '🧙',
162
+
163
+ // Status
164
+ check: '✓',
165
+ cross: '✗',
166
+ warning: '⚠',
167
+ info: 'ℹ',
168
+ arrow: '→',
169
+ bullet: '•',
170
+
171
+ // Categories
172
+ framework: '🏗️',
173
+ database: '🗄️',
174
+ auth: '🔐',
175
+ payment: '💳',
176
+ ci: '🔄',
177
+ deploy: '🚀',
178
+ testing: '🧪',
179
+
180
+ // Actions
181
+ create: '📝',
182
+ update: '✏️',
183
+ skip: '⏭️',
184
+ detect: '🔍',
185
+
186
+ // Objects
187
+ file: '📄',
188
+ folder: '📁',
189
+ git: '🌿',
190
+ lock: '🔒',
191
+ shield: '🛡️',
192
+ team: '👥',
193
+ clock: '⏱',
194
+ lightning: '⚡',
195
+ sparkle: '✨',
196
+ star: '★',
197
+
198
+ // Enterprise
199
+ enterprise: '🏢',
200
+ compliance: '📋',
201
+ mcp: '🤖',
202
+ };
203
+
204
+ // ═══════════════════════════════════════════════════════════════════════════════
205
+ // BOX DRAWING
206
+ // ═══════════════════════════════════════════════════════════════════════════════
207
+
208
+ const BOX = {
209
+ topLeft: '╭', topRight: '╮', bottomLeft: '╰', bottomRight: '╯',
210
+ horizontal: '─', vertical: '│',
211
+ teeRight: '├', teeLeft: '┤', teeDown: '┬', teeUp: '┴',
212
+ cross: '┼',
213
+ // Double line
214
+ dTopLeft: '╔', dTopRight: '╗', dBottomLeft: '╚', dBottomRight: '╝',
215
+ dHorizontal: '═', dVertical: '║',
216
+ // Heavy
217
+ hTopLeft: '┏', hTopRight: '┓', hBottomLeft: '┗', hBottomRight: '┛',
218
+ hHorizontal: '━', hVertical: '┃',
219
+ };
220
+
221
+ // ═══════════════════════════════════════════════════════════════════════════════
222
+ // SPINNER & PROGRESS
223
+ // ═══════════════════════════════════════════════════════════════════════════════
224
+
225
+ const SPINNER_DOTS = ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'];
226
+ const SPINNER_SETUP = ['⚡', '✨', '⚡', '✨'];
227
+
228
+ let spinnerIndex = 0;
229
+ let spinnerInterval = null;
230
+ let spinnerStartTime = null;
231
+
232
+ function formatDuration(ms) {
233
+ if (ms < 1000) return `${ms}ms`;
234
+ if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;
235
+ const mins = Math.floor(ms / 60000);
236
+ const secs = Math.floor((ms % 60000) / 1000);
237
+ return `${mins}m ${secs}s`;
238
+ }
239
+
240
+ function truncate(str, len) {
241
+ if (!str) return '';
242
+ if (str.length <= len) return str;
243
+ return str.slice(0, len - 3) + '...';
244
+ }
245
+
246
+ function padCenter(str, width) {
247
+ const padding = Math.max(0, width - str.length);
248
+ const left = Math.floor(padding / 2);
249
+ const right = padding - left;
250
+ return ' '.repeat(left) + str + ' '.repeat(right);
251
+ }
252
+
253
+ function startSpinner(message, color = colors.accent) {
254
+ spinnerStartTime = Date.now();
255
+ process.stdout.write(c.hideCursor);
256
+
257
+ spinnerInterval = setInterval(() => {
258
+ const elapsed = formatDuration(Date.now() - spinnerStartTime);
259
+ process.stdout.write(`\r${c.clearLine} ${color}${SPINNER_DOTS[spinnerIndex]}${c.reset} ${message} ${c.dim}${elapsed}${c.reset}`);
260
+ spinnerIndex = (spinnerIndex + 1) % SPINNER_DOTS.length;
261
+ }, 80);
262
+ }
263
+
264
+ function stopSpinner(message, success = true) {
265
+ if (spinnerInterval) {
266
+ clearInterval(spinnerInterval);
267
+ spinnerInterval = null;
268
+ }
269
+ const elapsed = spinnerStartTime ? formatDuration(Date.now() - spinnerStartTime) : '';
270
+ const icon = success ? `${colors.success}${ICONS.check}${c.reset}` : `${colors.error}${ICONS.cross}${c.reset}`;
271
+ process.stdout.write(`\r${c.clearLine} ${icon} ${message} ${c.dim}${elapsed}${c.reset}\n`);
272
+ process.stdout.write(c.showCursor);
273
+ spinnerStartTime = null;
274
+ }
275
+
276
+ // ═══════════════════════════════════════════════════════════════════════════════
277
+ // SECTION HEADERS
278
+ // ═══════════════════════════════════════════════════════════════════════════════
279
+
280
+ function printBanner() {
281
+ console.log(BANNER_FULL);
282
+ }
283
+
284
+ function printCompactBanner() {
285
+ console.log(INIT_BANNER);
286
+ }
287
+
288
+ function printDivider(char = '─', width = 69, color = c.dim) {
289
+ console.log(`${color} ${char.repeat(width)}${c.reset}`);
290
+ }
291
+
292
+ function printSection(title, icon = '◆') {
293
+ console.log();
294
+ console.log(` ${colors.accent}${icon}${c.reset} ${c.bold}${title}${c.reset}`);
295
+ printDivider();
296
+ }
297
+
298
+ // ═══════════════════════════════════════════════════════════════════════════════
299
+ // DETECTION DISPLAY
300
+ // ═══════════════════════════════════════════════════════════════════════════════
301
+
302
+ function printDetectionResults(detection) {
303
+ printSection('PROJECT DETECTION', ICONS.detect);
304
+ console.log();
305
+
306
+ const categories = [
307
+ { key: 'frameworks', label: 'Frameworks', icon: ICONS.framework, color: colors.framework },
308
+ { key: 'databases', label: 'Databases', icon: ICONS.database, color: colors.database },
309
+ { key: 'auth', label: 'Authentication', icon: ICONS.auth, color: colors.auth },
310
+ { key: 'payments', label: 'Payments', icon: ICONS.payment, color: colors.payment },
311
+ { key: 'ci', label: 'CI/CD', icon: ICONS.ci, color: colors.ci },
312
+ { key: 'deploy', label: 'Deployment', icon: ICONS.deploy, color: colors.deploy },
313
+ { key: 'testing', label: 'Testing', icon: ICONS.testing, color: colors.testing },
314
+ ];
315
+
316
+ for (const cat of categories) {
317
+ const items = detection[cat.key] || [];
318
+ if (items.length === 0) continue;
319
+
320
+ const itemList = items.slice(0, 4).join(', ');
321
+ const more = items.length > 4 ? ` +${items.length - 4} more` : '';
322
+
323
+ console.log(` ${cat.color}${cat.icon}${c.reset} ${c.bold}${cat.label.padEnd(16)}${c.reset} ${itemList}${c.dim}${more}${c.reset}`);
324
+ }
325
+
326
+ // Show detected package manager
327
+ if (detection.packageManager) {
328
+ console.log();
329
+ console.log(` ${c.dim}Package manager:${c.reset} ${colors.info}${detection.packageManager}${c.reset}`);
330
+ }
331
+
332
+ // Show Node version if detected
333
+ if (detection.nodeVersion) {
334
+ console.log(` ${c.dim}Node version:${c.reset} ${colors.info}${detection.nodeVersion}${c.reset}`);
335
+ }
336
+ }
337
+
338
+ // ═══════════════════════════════════════════════════════════════════════════════
339
+ // SETUP PROGRESS DISPLAY
340
+ // ═══════════════════════════════════════════════════════════════════════════════
341
+
342
+ function printSetupStep(step, status, detail = null) {
343
+ let icon, color;
344
+
345
+ switch (status) {
346
+ case 'creating':
347
+ icon = ICONS.create;
348
+ color = colors.accent;
349
+ break;
350
+ case 'updating':
351
+ icon = ICONS.update;
352
+ color = colors.info;
353
+ break;
354
+ case 'success':
355
+ icon = ICONS.check;
356
+ color = colors.success;
357
+ break;
358
+ case 'skipped':
359
+ icon = ICONS.skip;
360
+ color = colors.muted;
361
+ break;
362
+ case 'exists':
363
+ icon = ICONS.warning;
364
+ color = colors.warning;
365
+ break;
366
+ case 'error':
367
+ icon = ICONS.cross;
368
+ color = colors.error;
369
+ break;
370
+ default:
371
+ icon = ICONS.bullet;
372
+ color = colors.muted;
373
+ }
374
+
375
+ let line = ` ${color}${icon}${c.reset} ${step}`;
376
+ if (detail) {
377
+ line += ` ${c.dim}${detail}${c.reset}`;
378
+ }
379
+ console.log(line);
380
+ }
381
+
382
+ // ═══════════════════════════════════════════════════════════════════════════════
383
+ // FILES CREATED DISPLAY
384
+ // ═══════════════════════════════════════════════════════════════════════════════
385
+
386
+ function printFilesCreated(files) {
387
+ printSection('FILES CREATED', ICONS.file);
388
+ console.log();
389
+
390
+ const fileIcons = {
391
+ 'config.json': ICONS.config,
392
+ 'invariants.yml': ICONS.shield,
393
+ 'security-policy.json': ICONS.lock,
394
+ 'team.json': ICONS.team,
395
+ 'mcp.json': ICONS.mcp,
396
+ '.vibecheckrc': ICONS.config,
397
+ 'vibecheck.yml': ICONS.ci,
398
+ };
399
+
400
+ for (const file of files) {
401
+ const basename = path.basename(file);
402
+ const icon = fileIcons[basename] || ICONS.file;
403
+ const displayPath = file.startsWith('.vibecheck/') ? file : `.vibecheck/${file}`;
404
+ console.log(` ${colors.success}${icon}${c.reset} ${c.dim}${displayPath}${c.reset}`);
405
+ }
406
+ }
407
+
408
+ // ═══════════════════════════════════════════════════════════════════════════════
409
+ // SUCCESS CARD
410
+ // ═══════════════════════════════════════════════════════════════════════════════
411
+
412
+ function printSuccessCard(projectName, mode, filesCreated) {
413
+ const w = 68;
414
+
415
+ console.log();
416
+ console.log();
417
+
418
+ // Top border
419
+ console.log(` ${colors.success}${BOX.dTopLeft}${BOX.dHorizontal.repeat(w)}${BOX.dTopRight}${c.reset}`);
420
+
421
+ // Empty line
422
+ console.log(` ${colors.success}${BOX.dVertical}${c.reset}${' '.repeat(w)}${colors.success}${BOX.dVertical}${c.reset}`);
423
+
424
+ // Headline
425
+ const headline = `${ICONS.sparkle} VIBECHECK INITIALIZED`;
426
+ const headlinePadded = padCenter(headline, w);
427
+ console.log(` ${colors.success}${BOX.dVertical}${c.reset}${colors.success}${c.bold}${headlinePadded}${c.reset}${colors.success}${BOX.dVertical}${c.reset}`);
428
+
429
+ // Project name
430
+ const projectLine = `Project: ${projectName}`;
431
+ const projectPadded = padCenter(projectLine, w);
432
+ console.log(` ${colors.success}${BOX.dVertical}${c.reset}${c.dim}${projectPadded}${c.reset}${colors.success}${BOX.dVertical}${c.reset}`);
433
+
434
+ // Mode
435
+ const modeLine = `Mode: ${mode}`;
436
+ const modePadded = padCenter(modeLine, w);
437
+ console.log(` ${colors.success}${BOX.dVertical}${c.reset}${c.dim}${modePadded}${c.reset}${colors.success}${BOX.dVertical}${c.reset}`);
438
+
439
+ // Empty line
440
+ console.log(` ${colors.success}${BOX.dVertical}${c.reset}${' '.repeat(w)}${colors.success}${BOX.dVertical}${c.reset}`);
441
+
442
+ // Files created count
443
+ const filesLine = `${filesCreated} files configured`;
444
+ const filesPadded = padCenter(filesLine, w);
445
+ console.log(` ${colors.success}${BOX.dVertical}${c.reset}${colors.accent}${filesPadded}${c.reset}${colors.success}${BOX.dVertical}${c.reset}`);
446
+
447
+ // Empty line
448
+ console.log(` ${colors.success}${BOX.dVertical}${c.reset}${' '.repeat(w)}${colors.success}${BOX.dVertical}${c.reset}`);
449
+
450
+ // Bottom border
451
+ console.log(` ${colors.success}${BOX.dBottomLeft}${BOX.dHorizontal.repeat(w)}${BOX.dBottomRight}${c.reset}`);
452
+
453
+ console.log();
454
+ }
455
+
456
+ // ═══════════════════════════════════════════════════════════════════════════════
457
+ // NEXT STEPS DISPLAY
458
+ // ═══════════════════════════════════════════════════════════════════════════════
459
+
460
+ function printNextSteps(options = {}) {
461
+ printSection('NEXT STEPS', ICONS.arrow);
462
+ console.log();
463
+
464
+ const steps = [
465
+ { num: 1, cmd: 'vibecheck scan', desc: 'Run your first scan' },
466
+ { num: 2, cmd: 'vibecheck ship', desc: 'Check if ready to ship' },
467
+ ];
468
+
469
+ if (options.hasCI) {
470
+ steps.push({ num: 3, cmd: 'git push', desc: 'CI will run automatically' });
471
+ } else {
472
+ steps.push({ num: 3, cmd: 'vibecheck init --gha', desc: 'Add CI/CD integration' });
473
+ }
474
+
475
+ for (const step of steps) {
476
+ console.log(` ${colors.accent}${step.num}.${c.reset} ${c.bold}${step.cmd}${c.reset}`);
477
+ console.log(` ${c.dim}${step.desc}${c.reset}`);
478
+ }
479
+
480
+ console.log();
481
+ console.log(` ${c.dim}Full docs:${c.reset} ${colors.info}https://docs.vibecheckai.dev${c.reset}`);
482
+ console.log();
483
+ }
484
+
485
+ // ═══════════════════════════════════════════════════════════════════════════════
486
+ // ENTERPRISE MODE HEADER
487
+ // ═══════════════════════════════════════════════════════════════════════════════
488
+
489
+ function printEnterpriseHeader(options) {
490
+ console.log();
491
+ console.log(` ${bgRgb(60, 40, 100)}${c.bold} ${ICONS.enterprise} ENTERPRISE MODE ${c.reset}`);
492
+ console.log();
493
+
494
+ const features = [];
495
+ if (options.ci) features.push(`${ICONS.ci} CI/CD`);
496
+ if (options.compliance) features.push(`${ICONS.compliance} Compliance`);
497
+ if (options.team) features.push(`${ICONS.team} Team`);
498
+ if (options.mcp) features.push(`${ICONS.mcp} MCP`);
499
+ if (options.strict) features.push(`${ICONS.shield} Strict`);
500
+
501
+ if (features.length > 0) {
502
+ console.log(` ${c.dim}Features:${c.reset} ${features.join(' ')}`);
503
+ console.log();
504
+ }
505
+ }
506
+
507
+ // ═══════════════════════════════════════════════════════════════════════════════
508
+ // COMPLIANCE DISPLAY
509
+ // ═══════════════════════════════════════════════════════════════════════════════
510
+
511
+ function printComplianceInfo(complianceType) {
512
+ const complianceInfo = {
513
+ soc2: { name: 'SOC 2 Type II', icon: '🔐', color: colors.compliance },
514
+ hipaa: { name: 'HIPAA', icon: '🏥', color: rgb(255, 100, 100) },
515
+ gdpr: { name: 'GDPR', icon: '🇪🇺', color: rgb(100, 150, 255) },
516
+ pci: { name: 'PCI-DSS', icon: '💳', color: rgb(255, 200, 100) },
517
+ };
518
+
519
+ const info = complianceInfo[complianceType] || { name: complianceType, icon: ICONS.compliance, color: colors.compliance };
520
+
521
+ console.log();
522
+ console.log(` ${info.color}${info.icon}${c.reset} ${c.bold}${info.name} Compliance${c.reset}`);
523
+ console.log(` ${c.dim}Generating baseline templates...${c.reset}`);
524
+ }
525
+
526
+ // ═══════════════════════════════════════════════════════════════════════════════
527
+ // HELP DISPLAY
528
+ // ═══════════════════════════════════════════════════════════════════════════════
529
+
530
+ function printHelp() {
531
+ console.log(BANNER_FULL);
532
+ console.log(`
533
+ ${c.bold}Usage:${c.reset} vibecheck init [options]
534
+
535
+ ${c.bold}Enterprise Project Setup${c.reset} — Configure for production-grade verification.
536
+
537
+ ${c.bold}Basic Options:${c.reset}
538
+ ${colors.accent}--path, -p <dir>${c.reset} Project path ${c.dim}(default: current directory)${c.reset}
539
+ ${colors.accent}--quick, -q${c.reset} Skip wizard, use defaults
540
+ ${colors.accent}--git-hooks${c.reset} Install git pre-push hook
541
+ ${colors.accent}--help, -h${c.reset} Show this help
542
+
543
+ ${colors.enterprise}${c.bold}Enterprise Options:${c.reset}
544
+ ${colors.accent}--enterprise, -e${c.reset} Enable enterprise mode
545
+ ${colors.accent}--full${c.reset} All features: CI + team + MCP
546
+ ${colors.accent}--detect${c.reset} Detection only (JSON output)
547
+
548
+ ${colors.ci}${c.bold}CI/CD Integration:${c.reset}
549
+ ${colors.accent}--ci [provider]${c.reset} Setup CI/CD (auto-detects)
550
+ ${colors.accent}--gha${c.reset} GitHub Actions workflow
551
+ ${colors.accent}--gitlab${c.reset} GitLab CI configuration
552
+ ${colors.accent}--fail-on-warn${c.reset} CI fails on WARN
553
+
554
+ ${colors.compliance}${c.bold}Compliance Templates:${c.reset}
555
+ ${colors.accent}--compliance [type]${c.reset} Generate compliance templates
556
+ ${colors.accent}--soc2${c.reset} SOC 2 Type II baseline
557
+ ${colors.accent}--hipaa${c.reset} HIPAA compliance baseline
558
+ ${colors.accent}--gdpr${c.reset} GDPR compliance baseline
559
+ ${colors.accent}--pci${c.reset} PCI-DSS compliance baseline
560
+
561
+ ${colors.team}${c.bold}Team & Security:${c.reset}
562
+ ${colors.accent}--team${c.reset} Generate team config (multi-env)
563
+ ${colors.accent}--mcp${c.reset} Generate MCP server config
564
+ ${colors.accent}--strict${c.reset} Enable strict mode
565
+
566
+ ${c.bold}Created Files:${c.reset}
567
+ ${c.dim}.vibecheck/config.json${c.reset} Main configuration
568
+ ${c.dim}.vibecheck/invariants.yml${c.reset} Ship killers & warnings
569
+ ${c.dim}.vibecheck/security-policy.json${c.reset} Security headers, CORS
570
+ ${c.dim}.vibecheck/team.json${c.reset} Team/environment config
571
+ ${c.dim}.vibecheck/mcp.json${c.reset} MCP server config
572
+ ${c.dim}.github/workflows/vibecheck.yml${c.reset} GitHub Actions
573
+
574
+ ${c.bold}Detection Includes:${c.reset}
575
+ ${colors.framework}Frameworks${c.reset} Next.js, Remix, Nuxt, SvelteKit, Fastify, Express
576
+ ${colors.database}Databases${c.reset} Prisma, Drizzle, Mongoose, Supabase, Firebase
577
+ ${colors.auth}Auth${c.reset} NextAuth, Clerk, Auth0, Lucia, Passport
578
+ ${colors.payment}Payments${c.reset} Stripe, Lemon Squeezy, Paddle
579
+ ${colors.ci}CI/CD${c.reset} GitHub Actions, GitLab CI, CircleCI
580
+ ${colors.deploy}Deploy${c.reset} Vercel, Netlify, Railway, Docker, K8s
581
+ ${colors.testing}Testing${c.reset} Jest, Vitest, Playwright, Cypress
582
+
583
+ ${c.bold}Examples:${c.reset}
584
+ ${c.dim}# Interactive wizard${c.reset}
585
+ vibecheck init
586
+
587
+ ${c.dim}# Quick setup with defaults${c.reset}
588
+ vibecheck init --quick
589
+
590
+ ${c.dim}# Enterprise with GitHub Actions${c.reset}
591
+ vibecheck init --enterprise --gha
592
+
593
+ ${c.dim}# SOC 2 compliance baseline${c.reset}
594
+ vibecheck init --soc2
595
+
596
+ ${c.dim}# Full enterprise setup${c.reset}
597
+ vibecheck init --full
598
+ `);
599
+ }
600
+
601
+ // ═══════════════════════════════════════════════════════════════════════════════
602
+ // ARGS PARSER
603
+ // ═══════════════════════════════════════════════════════════════════════════════
604
+
20
605
  function parseArgs(args) {
21
606
  const out = {
22
607
  path: ".",
@@ -25,13 +610,13 @@ function parseArgs(args) {
25
610
  quick: false,
26
611
  // Enterprise options
27
612
  enterprise: false,
28
- ci: false, // true or "github" | "gitlab"
29
- compliance: false, // true or "soc2" | "hipaa" | "gdpr" | "pci"
613
+ ci: false,
614
+ compliance: false,
30
615
  team: false,
31
616
  mcp: false,
32
617
  strict: false,
33
618
  failOnWarn: false,
34
- detect: false, // Just detect, don't write
619
+ detect: false,
35
620
  };
36
621
 
37
622
  for (let i = 0; i < args.length; i++) {
@@ -81,6 +666,10 @@ function parseArgs(args) {
81
666
  return out;
82
667
  }
83
668
 
669
+ // ═══════════════════════════════════════════════════════════════════════════════
670
+ // MAIN INIT FUNCTION
671
+ // ═══════════════════════════════════════════════════════════════════════════════
672
+
84
673
  async function runInit(args) {
85
674
  const opts = parseArgs(args);
86
675
 
@@ -90,20 +679,42 @@ async function runInit(args) {
90
679
  }
91
680
 
92
681
  const targetDir = path.resolve(opts.path);
682
+ const projectName = path.basename(targetDir);
93
683
 
94
684
  // Enterprise mode - comprehensive setup
95
685
  const useEnterprise = opts.enterprise || opts.ci || opts.compliance ||
96
686
  opts.team || opts.mcp || opts.detect || opts.full;
97
687
 
98
688
  if (EnterpriseInit && useEnterprise) {
689
+ printBanner();
690
+ printEnterpriseHeader(opts);
691
+
692
+ console.log(` ${c.dim}Project:${c.reset} ${c.bold}${projectName}${c.reset}`);
693
+ console.log(` ${c.dim}Path:${c.reset} ${targetDir}`);
694
+ console.log();
695
+
99
696
  const enterprise = new EnterpriseInit(targetDir, opts);
100
697
  return await enterprise.run();
101
698
  }
102
699
 
103
700
  // Detect-only mode (quick detection report)
104
701
  if (opts.detect) {
702
+ printBanner();
703
+
704
+ console.log(` ${c.dim}Project:${c.reset} ${c.bold}${projectName}${c.reset}`);
705
+ console.log(` ${c.dim}Path:${c.reset} ${targetDir}`);
706
+
707
+ startSpinner('Detecting project configuration...', colors.accent);
708
+
105
709
  const { detectAll } = require("./lib/enterprise-detect");
106
710
  const detection = detectAll(targetDir);
711
+
712
+ stopSpinner('Detection complete', true);
713
+
714
+ printDetectionResults(detection);
715
+
716
+ console.log();
717
+ console.log(` ${c.dim}Full JSON output:${c.reset}`);
107
718
  console.log(JSON.stringify(detection, null, 2));
108
719
  return 0;
109
720
  }
@@ -114,9 +725,21 @@ async function runInit(args) {
114
725
  return await wizard.run();
115
726
  }
116
727
 
117
- // Quick mode - legacy behavior
118
- console.log("\n 🚀 vibecheck INIT\n");
119
-
728
+ // ═══════════════════════════════════════════════════════════════════════════
729
+ // QUICK MODE - Enhanced Legacy Behavior
730
+ // ═══════════════════════════════════════════════════════════════════════════
731
+
732
+ printBanner();
733
+
734
+ console.log(` ${c.dim}Project:${c.reset} ${c.bold}${projectName}${c.reset}`);
735
+ console.log(` ${c.dim}Path:${c.reset} ${targetDir}`);
736
+ console.log(` ${c.dim}Mode:${c.reset} ${colors.accent}Quick Setup${c.reset}`);
737
+
738
+ printSection('SETUP', ICONS.setup);
739
+ console.log();
740
+
741
+ const filesCreated = [];
742
+
120
743
  // Create config file
121
744
  const configPath = path.join(targetDir, ".vibecheckrc");
122
745
  if (!fs.existsSync(configPath)) {
@@ -130,16 +753,20 @@ async function runInit(args) {
130
753
  },
131
754
  };
132
755
  fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2));
133
- console.log(" ✅ Created .vibecheckrc");
756
+ printSetupStep('.vibecheckrc', 'success', 'configuration created');
757
+ filesCreated.push('.vibecheckrc');
134
758
  } else {
135
- console.log(" ⚠️ .vibecheckrc already exists");
759
+ printSetupStep('.vibecheckrc', 'exists', 'already exists');
136
760
  }
137
761
 
138
762
  // Create output directory
139
763
  const outputDir = path.join(targetDir, ".vibecheck");
140
764
  if (!fs.existsSync(outputDir)) {
141
765
  fs.mkdirSync(outputDir, { recursive: true });
142
- console.log(" ✅ Created .vibecheck/");
766
+ printSetupStep('.vibecheck/', 'success', 'output directory created');
767
+ filesCreated.push('.vibecheck/');
768
+ } else {
769
+ printSetupStep('.vibecheck/', 'exists', 'already exists');
143
770
  }
144
771
 
145
772
  // Install git hooks if requested
@@ -163,7 +790,8 @@ fi
163
790
  fs.writeFileSync(path.join(huskyDir, "pre-push"), prePushHook, {
164
791
  mode: 0o755,
165
792
  });
166
- console.log(" ✅ Installed git pre-push hook");
793
+ printSetupStep('.husky/pre-push', 'success', 'git hook installed');
794
+ filesCreated.push('.husky/pre-push');
167
795
  }
168
796
 
169
797
  // Add to .gitignore
@@ -173,88 +801,19 @@ fi
173
801
  if (!gitignore.includes(".vibecheck/")) {
174
802
  gitignore += "\n# vibecheck\n.vibecheck/\n";
175
803
  fs.writeFileSync(gitignorePath, gitignore);
176
- console.log(" ✅ Added .vibecheck/ to .gitignore");
804
+ printSetupStep('.gitignore', 'success', 'added .vibecheck/');
805
+ } else {
806
+ printSetupStep('.gitignore', 'skipped', 'already configured');
177
807
  }
178
808
  }
179
809
 
180
- console.log("\n ✅ vibecheck initialized!\n");
181
- console.log(" Next steps:");
182
- console.log(" 1. Run: vibecheck scan");
183
- console.log(" 2. Review: .vibecheck/report.html");
184
- console.log(" 3. Fix issues and re-scan\n");
810
+ // Success card
811
+ printSuccessCard(projectName, 'Quick Setup', filesCreated.length);
812
+
813
+ // Next steps
814
+ printNextSteps({ hasCI: false });
185
815
 
186
816
  return 0;
187
817
  }
188
818
 
189
- function printHelp() {
190
- console.log(`
191
- \x1b[1m\x1b[36m⚡ vibecheck init\x1b[0m — Enterprise Project Setup
192
-
193
- \x1b[2mConfigure your project for production-grade verification.\x1b[0m
194
-
195
- \x1b[1mUSAGE\x1b[0m
196
- vibecheck init Interactive setup wizard
197
- vibecheck init --enterprise Full enterprise configuration
198
- vibecheck init --full Everything: CI, team, MCP, security
199
-
200
- \x1b[1mBASIC OPTIONS\x1b[0m
201
- --path, -p <dir> Project path (default: current directory)
202
- --quick, -q Skip wizard, use defaults
203
- --git-hooks Install git pre-push hook
204
- --help, -h Show this help
205
-
206
- \x1b[1m\x1b[35mENTERPRISE OPTIONS\x1b[0m
207
- --enterprise, -e Enable enterprise mode (detection + config)
208
- --full All enterprise features (CI + team + MCP)
209
- --detect Detection only (JSON output, no writes)
210
-
211
- \x1b[1m\x1b[33mCI/CD INTEGRATION\x1b[0m
212
- --ci [provider] Setup CI/CD (auto-detects if no provider)
213
- --gha GitHub Actions workflow
214
- --gitlab GitLab CI configuration
215
- --fail-on-warn CI fails on WARN (default: only BLOCK)
216
-
217
- \x1b[1m\x1b[32mCOMPLIANCE TEMPLATES\x1b[0m
218
- --compliance [type] Generate compliance templates
219
- --soc2 SOC 2 Type II baseline
220
- --hipaa HIPAA compliance baseline
221
- --gdpr GDPR compliance baseline
222
- --pci PCI-DSS compliance baseline
223
-
224
- \x1b[1m\x1b[34mTEAM & SECURITY\x1b[0m
225
- --team Generate team configuration (multi-env)
226
- --mcp Generate MCP server config (AI agents)
227
- --strict Enable strict mode (zero tolerance)
228
-
229
- \x1b[1mCREATED FILES\x1b[0m
230
- .vibecheck/config.json Main configuration
231
- .vibecheck/invariants.yml Ship killers & warnings
232
- .vibecheck/security-policy.json Security headers, CORS, rate limits
233
- .vibecheck/schemas/ JSON validation schemas
234
- .vibecheck/team.json Team/environment config (--team)
235
- .vibecheck/mcp.json MCP server config (--mcp)
236
- .vibecheck/compliance/ Compliance templates (--compliance)
237
- .github/workflows/vibecheck.yml GitHub Actions (--gha)
238
-
239
- \x1b[1mEXAMPLES\x1b[0m
240
- vibecheck init # Interactive wizard
241
- vibecheck init --enterprise # Enterprise config
242
- vibecheck init --full # Everything
243
- vibecheck init --gha # + GitHub Actions
244
- vibecheck init --gha --fail-on-warn # Strict CI
245
- vibecheck init --soc2 # + SOC 2 compliance
246
- vibecheck init --enterprise --team # + Team environments
247
- vibecheck init --detect # Detection report only
248
-
249
- \x1b[1mDETECTION INCLUDES\x1b[0m
250
- Frameworks Next.js, Remix, Nuxt, SvelteKit, React, Vue, Fastify, Express, NestJS, Hono
251
- Databases Prisma, Drizzle, Mongoose, Supabase, Firebase, Redis
252
- Auth NextAuth, Clerk, Auth0, Lucia, Passport
253
- Payments Stripe, Lemon Squeezy, Paddle
254
- CI/CD GitHub Actions, GitLab CI, CircleCI, Jenkins
255
- Deploy Vercel, Netlify, Railway, Render, Fly.io, Docker, Kubernetes
256
- Testing Jest, Vitest, Playwright, Cypress
257
- `);
258
- }
259
-
260
- module.exports = { runInit };
819
+ module.exports = { runInit };