@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.
- package/bin/runners/lib/report-html.js +378 -1
- package/bin/runners/runBadge.js +823 -116
- package/bin/runners/runCtx.js +602 -119
- package/bin/runners/runDoctor.js +329 -42
- package/bin/runners/runFix.js +544 -85
- package/bin/runners/runGraph.js +231 -74
- package/bin/runners/runInit.js +647 -88
- package/bin/runners/runInstall.js +207 -46
- package/bin/runners/runPR.js +123 -32
- package/bin/runners/runProve.js +818 -97
- package/bin/runners/runReality.js +812 -92
- package/bin/runners/runReport.js +68 -2
- package/bin/runners/runShare.js +156 -38
- package/bin/runners/runShip.js +920 -889
- package/bin/runners/runWatch.js +175 -55
- package/mcp-server/package.json +1 -1
- package/package.json +1 -1
package/bin/runners/runInit.js
CHANGED
|
@@ -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,
|
|
29
|
-
compliance: false,
|
|
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,
|
|
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
|
-
//
|
|
118
|
-
|
|
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
|
-
|
|
756
|
+
printSetupStep('.vibecheckrc', 'success', 'configuration created');
|
|
757
|
+
filesCreated.push('.vibecheckrc');
|
|
134
758
|
} else {
|
|
135
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
804
|
+
printSetupStep('.gitignore', 'success', 'added .vibecheck/');
|
|
805
|
+
} else {
|
|
806
|
+
printSetupStep('.gitignore', 'skipped', 'already configured');
|
|
177
807
|
}
|
|
178
808
|
}
|
|
179
809
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
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 };
|