@vibecheckai/cli 3.0.2 → 3.0.3

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.
Files changed (68) hide show
  1. package/package.json +9 -1
  2. package/bin/cli-hygiene.js +0 -241
  3. package/bin/guardrail.js +0 -834
  4. package/bin/runners/cli-utils.js +0 -1070
  5. package/bin/runners/context/ai-task-decomposer.js +0 -337
  6. package/bin/runners/context/analyzer.js +0 -462
  7. package/bin/runners/context/api-contracts.js +0 -427
  8. package/bin/runners/context/context-diff.js +0 -342
  9. package/bin/runners/context/context-pruner.js +0 -291
  10. package/bin/runners/context/dependency-graph.js +0 -414
  11. package/bin/runners/context/generators/claude.js +0 -107
  12. package/bin/runners/context/generators/codex.js +0 -108
  13. package/bin/runners/context/generators/copilot.js +0 -119
  14. package/bin/runners/context/generators/cursor.js +0 -514
  15. package/bin/runners/context/generators/mcp.js +0 -151
  16. package/bin/runners/context/generators/windsurf.js +0 -180
  17. package/bin/runners/context/git-context.js +0 -302
  18. package/bin/runners/context/index.js +0 -1042
  19. package/bin/runners/context/insights.js +0 -173
  20. package/bin/runners/context/mcp-server/generate-rules.js +0 -337
  21. package/bin/runners/context/mcp-server/index.js +0 -1176
  22. package/bin/runners/context/mcp-server/package.json +0 -24
  23. package/bin/runners/context/memory.js +0 -200
  24. package/bin/runners/context/monorepo.js +0 -215
  25. package/bin/runners/context/multi-repo-federation.js +0 -404
  26. package/bin/runners/context/patterns.js +0 -253
  27. package/bin/runners/context/proof-context.js +0 -972
  28. package/bin/runners/context/security-scanner.js +0 -303
  29. package/bin/runners/context/semantic-search.js +0 -350
  30. package/bin/runners/context/shared.js +0 -264
  31. package/bin/runners/context/team-conventions.js +0 -310
  32. package/bin/runners/lib/ai-bridge.js +0 -416
  33. package/bin/runners/lib/analysis-core.js +0 -271
  34. package/bin/runners/lib/analyzers.js +0 -541
  35. package/bin/runners/lib/audit-bridge.js +0 -391
  36. package/bin/runners/lib/auth-truth.js +0 -193
  37. package/bin/runners/lib/auth.js +0 -215
  38. package/bin/runners/lib/backup.js +0 -62
  39. package/bin/runners/lib/billing.js +0 -107
  40. package/bin/runners/lib/claims.js +0 -118
  41. package/bin/runners/lib/cli-ui.js +0 -540
  42. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  43. package/bin/runners/lib/compliance-bridge.js +0 -165
  44. package/bin/runners/lib/contracts/auth-contract.js +0 -194
  45. package/bin/runners/lib/contracts/env-contract.js +0 -178
  46. package/bin/runners/lib/contracts/external-contract.js +0 -198
  47. package/bin/runners/lib/contracts/guard.js +0 -168
  48. package/bin/runners/lib/contracts/index.js +0 -89
  49. package/bin/runners/lib/contracts/plan-validator.js +0 -311
  50. package/bin/runners/lib/contracts/route-contract.js +0 -192
  51. package/bin/runners/lib/detect.js +0 -89
  52. package/bin/runners/lib/doctor/autofix.js +0 -254
  53. package/bin/runners/lib/doctor/index.js +0 -37
  54. package/bin/runners/lib/doctor/modules/dependencies.js +0 -325
  55. package/bin/runners/lib/doctor/modules/index.js +0 -46
  56. package/bin/runners/lib/doctor/modules/network.js +0 -250
  57. package/bin/runners/lib/doctor/modules/project.js +0 -312
  58. package/bin/runners/lib/doctor/modules/runtime.js +0 -224
  59. package/bin/runners/lib/doctor/modules/security.js +0 -348
  60. package/bin/runners/lib/doctor/modules/system.js +0 -213
  61. package/bin/runners/lib/doctor/modules/vibecheck.js +0 -394
  62. package/bin/runners/lib/doctor/reporter.js +0 -262
  63. package/bin/runners/lib/doctor/service.js +0 -262
  64. package/bin/runners/lib/doctor/types.js +0 -113
  65. package/bin/runners/lib/doctor/ui.js +0 -263
  66. package/bin/runners/lib/doctor-enhanced.js +0 -233
  67. package/bin/runners/lib/doctor-v2.js +0 -608
  68. package/bin/runners/lib/enforcement.js +0 -72
@@ -1,312 +0,0 @@
1
- /**
2
- * Project Diagnostics Module
3
- *
4
- * Checks project structure, configuration, and build capability
5
- */
6
-
7
- const fs = require('fs');
8
- const path = require('path');
9
- const { execSync } = require('child_process');
10
- const { SEVERITY, CATEGORY, FIX_TYPE } = require('../types');
11
-
12
- const MODULE_ID = 'project';
13
-
14
- function createDiagnostics(projectPath) {
15
- return [
16
- {
17
- id: `${MODULE_ID}.package_json`,
18
- name: 'package.json',
19
- category: CATEGORY.PROJECT,
20
- parallel: true,
21
- check: async () => {
22
- const pkgPath = path.join(projectPath, 'package.json');
23
-
24
- if (!fs.existsSync(pkgPath)) {
25
- return {
26
- severity: SEVERITY.ERROR,
27
- message: 'Not found',
28
- detail: 'This doesn\'t appear to be a Node.js project',
29
- fixes: [
30
- {
31
- type: FIX_TYPE.COMMAND,
32
- description: 'Initialize a new Node.js project',
33
- command: 'npm init -y',
34
- autoFixable: true,
35
- },
36
- ],
37
- };
38
- }
39
-
40
- try {
41
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
42
- const metadata = {
43
- name: pkg.name,
44
- version: pkg.version,
45
- hasScripts: !!pkg.scripts,
46
- hasDeps: !!(pkg.dependencies || pkg.devDependencies),
47
- };
48
-
49
- return {
50
- severity: SEVERITY.PASS,
51
- message: `${pkg.name || 'unnamed'}@${pkg.version || '0.0.0'}`,
52
- metadata,
53
- };
54
- } catch (err) {
55
- return {
56
- severity: SEVERITY.ERROR,
57
- message: 'Invalid JSON',
58
- detail: err.message,
59
- fixes: [{
60
- type: FIX_TYPE.MANUAL,
61
- description: 'Fix JSON syntax errors in package.json',
62
- autoFixable: false,
63
- }],
64
- };
65
- }
66
- },
67
- },
68
- {
69
- id: `${MODULE_ID}.node_modules`,
70
- name: 'Dependencies Installed',
71
- category: CATEGORY.PROJECT,
72
- parallel: true,
73
- dependsOn: [`${MODULE_ID}.package_json`],
74
- check: async () => {
75
- const nodeModulesPath = path.join(projectPath, 'node_modules');
76
-
77
- if (!fs.existsSync(nodeModulesPath)) {
78
- return {
79
- severity: SEVERITY.WARNING,
80
- message: 'node_modules not found',
81
- detail: 'Run your package manager install command',
82
- fixes: [
83
- {
84
- type: FIX_TYPE.COMMAND,
85
- description: 'Install dependencies with pnpm',
86
- command: 'pnpm install',
87
- autoFixable: true,
88
- },
89
- {
90
- type: FIX_TYPE.COMMAND,
91
- description: 'Install dependencies with npm',
92
- command: 'npm install',
93
- autoFixable: true,
94
- },
95
- ],
96
- };
97
- }
98
-
99
- try {
100
- const entries = fs.readdirSync(nodeModulesPath).filter(f => !f.startsWith('.'));
101
- const count = entries.length;
102
-
103
- // Check for common issues
104
- const lockFiles = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock']
105
- .filter(f => fs.existsSync(path.join(projectPath, f)));
106
-
107
- const metadata = { packageCount: count, lockFiles };
108
-
109
- if (lockFiles.length > 1) {
110
- return {
111
- severity: SEVERITY.WARNING,
112
- message: `${count} packages (multiple lock files detected)`,
113
- detail: `Found: ${lockFiles.join(', ')}`,
114
- metadata,
115
- fixes: [{
116
- type: FIX_TYPE.MANUAL,
117
- description: 'Remove extra lock files to avoid conflicts',
118
- autoFixable: false,
119
- }],
120
- };
121
- }
122
-
123
- return {
124
- severity: SEVERITY.PASS,
125
- message: `${count} packages installed`,
126
- metadata,
127
- };
128
- } catch {
129
- return {
130
- severity: SEVERITY.WARNING,
131
- message: 'Cannot read node_modules',
132
- };
133
- }
134
- },
135
- },
136
- {
137
- id: `${MODULE_ID}.typescript`,
138
- name: 'TypeScript',
139
- category: CATEGORY.PROJECT,
140
- parallel: true,
141
- check: async () => {
142
- const tsConfigPath = path.join(projectPath, 'tsconfig.json');
143
-
144
- if (!fs.existsSync(tsConfigPath)) {
145
- return {
146
- severity: SEVERITY.INFO,
147
- message: 'Not configured (JavaScript project)',
148
- };
149
- }
150
-
151
- try {
152
- const tsConfig = JSON.parse(fs.readFileSync(tsConfigPath, 'utf8'));
153
- const strict = tsConfig.compilerOptions?.strict === true;
154
-
155
- const metadata = {
156
- strict,
157
- target: tsConfig.compilerOptions?.target,
158
- module: tsConfig.compilerOptions?.module,
159
- };
160
-
161
- if (!strict) {
162
- return {
163
- severity: SEVERITY.INFO,
164
- message: 'Configured (strict mode disabled)',
165
- metadata,
166
- };
167
- }
168
-
169
- return {
170
- severity: SEVERITY.PASS,
171
- message: 'Configured with strict mode',
172
- metadata,
173
- };
174
- } catch {
175
- return {
176
- severity: SEVERITY.WARNING,
177
- message: 'Invalid tsconfig.json',
178
- fixes: [{
179
- type: FIX_TYPE.COMMAND,
180
- description: 'Regenerate TypeScript config',
181
- command: 'npx tsc --init',
182
- autoFixable: false,
183
- }],
184
- };
185
- }
186
- },
187
- },
188
- {
189
- id: `${MODULE_ID}.source_structure`,
190
- name: 'Source Structure',
191
- category: CATEGORY.PROJECT,
192
- parallel: true,
193
- check: async () => {
194
- const structures = [
195
- { dir: 'src', type: 'standard' },
196
- { dir: 'app', type: 'next-app-router' },
197
- { dir: 'pages', type: 'next-pages-router' },
198
- { dir: 'lib', type: 'library' },
199
- { dir: 'packages', type: 'monorepo' },
200
- ];
201
-
202
- const found = structures.filter(s =>
203
- fs.existsSync(path.join(projectPath, s.dir))
204
- );
205
-
206
- if (found.length === 0) {
207
- return {
208
- severity: SEVERITY.INFO,
209
- message: 'No standard source directory detected',
210
- detail: 'Consider organizing code in src/, app/, or pages/',
211
- };
212
- }
213
-
214
- const metadata = { structures: found.map(f => f.type) };
215
- const primary = found[0];
216
-
217
- return {
218
- severity: SEVERITY.PASS,
219
- message: `${primary.dir}/ (${primary.type})`,
220
- metadata,
221
- };
222
- },
223
- },
224
- {
225
- id: `${MODULE_ID}.framework`,
226
- name: 'Framework Detection',
227
- category: CATEGORY.PROJECT,
228
- parallel: true,
229
- dependsOn: [`${MODULE_ID}.package_json`],
230
- check: async () => {
231
- const pkgPath = path.join(projectPath, 'package.json');
232
-
233
- try {
234
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
235
- const deps = { ...pkg.dependencies, ...pkg.devDependencies };
236
-
237
- const frameworks = [
238
- { name: 'Next.js', packages: ['next'] },
239
- { name: 'Remix', packages: ['@remix-run/node', '@remix-run/react'] },
240
- { name: 'Fastify', packages: ['fastify'] },
241
- { name: 'Express', packages: ['express'] },
242
- { name: 'Hono', packages: ['hono'] },
243
- { name: 'NestJS', packages: ['@nestjs/core'] },
244
- { name: 'React', packages: ['react'] },
245
- { name: 'Vue', packages: ['vue'] },
246
- { name: 'Svelte', packages: ['svelte'] },
247
- ];
248
-
249
- const detected = frameworks.filter(fw =>
250
- fw.packages.some(p => deps[p])
251
- );
252
-
253
- if (detected.length === 0) {
254
- return {
255
- severity: SEVERITY.INFO,
256
- message: 'No known framework detected',
257
- };
258
- }
259
-
260
- const metadata = { frameworks: detected.map(f => f.name) };
261
-
262
- return {
263
- severity: SEVERITY.PASS,
264
- message: detected.map(f => f.name).join(' + '),
265
- metadata,
266
- };
267
- } catch {
268
- return {
269
- severity: SEVERITY.INFO,
270
- message: 'Could not detect framework',
271
- };
272
- }
273
- },
274
- },
275
- {
276
- id: `${MODULE_ID}.build`,
277
- name: 'Build Script',
278
- category: CATEGORY.PROJECT,
279
- parallel: true,
280
- dependsOn: [`${MODULE_ID}.package_json`],
281
- check: async () => {
282
- const pkgPath = path.join(projectPath, 'package.json');
283
-
284
- try {
285
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
286
-
287
- if (!pkg.scripts?.build) {
288
- return {
289
- severity: SEVERITY.INFO,
290
- message: 'No build script defined',
291
- };
292
- }
293
-
294
- const metadata = { buildCommand: pkg.scripts.build };
295
-
296
- return {
297
- severity: SEVERITY.PASS,
298
- message: `Defined: ${pkg.scripts.build.substring(0, 40)}${pkg.scripts.build.length > 40 ? '...' : ''}`,
299
- metadata,
300
- };
301
- } catch {
302
- return {
303
- severity: SEVERITY.INFO,
304
- message: 'Could not check build script',
305
- };
306
- }
307
- },
308
- },
309
- ];
310
- }
311
-
312
- module.exports = { MODULE_ID, createDiagnostics };
@@ -1,224 +0,0 @@
1
- /**
2
- * Runtime Diagnostics Module
3
- *
4
- * Checks Node.js, npm, package managers, and runtime environment
5
- */
6
-
7
- const { execSync } = require('child_process');
8
- const { SEVERITY, CATEGORY, FIX_TYPE } = require('../types');
9
-
10
- const MODULE_ID = 'runtime';
11
-
12
- function createDiagnostics(projectPath) {
13
- return [
14
- {
15
- id: `${MODULE_ID}.node_version`,
16
- name: 'Node.js Version',
17
- category: CATEGORY.RUNTIME,
18
- parallel: true,
19
- check: async () => {
20
- const version = process.version;
21
- const major = parseInt(version.slice(1).split('.')[0]);
22
- const minor = parseInt(version.split('.')[1]);
23
-
24
- const metadata = { version, major, minor };
25
-
26
- if (major < 18) {
27
- return {
28
- severity: SEVERITY.ERROR,
29
- message: `${version} — requires Node 18+`,
30
- detail: 'vibecheck uses modern JavaScript features that require Node 18+',
31
- metadata,
32
- fixes: [
33
- {
34
- type: FIX_TYPE.COMMAND,
35
- description: 'Install Node 20 via nvm',
36
- command: 'nvm install 20 && nvm use 20',
37
- autoFixable: false,
38
- },
39
- {
40
- type: FIX_TYPE.LINK,
41
- description: 'Download Node.js',
42
- url: 'https://nodejs.org/',
43
- },
44
- ],
45
- };
46
- }
47
-
48
- if (major < 20) {
49
- return {
50
- severity: SEVERITY.WARNING,
51
- message: `${version} — recommend Node 20+`,
52
- detail: 'Node 20+ has better performance and LTS support',
53
- metadata,
54
- fixes: [{
55
- type: FIX_TYPE.COMMAND,
56
- description: 'Upgrade to Node 20',
57
- command: 'nvm install 20 && nvm use 20',
58
- autoFixable: false,
59
- }],
60
- };
61
- }
62
-
63
- return {
64
- severity: SEVERITY.PASS,
65
- message: version,
66
- metadata,
67
- };
68
- },
69
- },
70
- {
71
- id: `${MODULE_ID}.npm_version`,
72
- name: 'npm Version',
73
- category: CATEGORY.RUNTIME,
74
- parallel: true,
75
- check: async () => {
76
- try {
77
- const version = execSync('npm --version', {
78
- encoding: 'utf8',
79
- timeout: 10000,
80
- stdio: ['pipe', 'pipe', 'pipe'],
81
- }).trim();
82
-
83
- const major = parseInt(version.split('.')[0]);
84
- const metadata = { version, major };
85
-
86
- if (major < 8) {
87
- return {
88
- severity: SEVERITY.WARNING,
89
- message: `${version} — recommend npm 9+`,
90
- metadata,
91
- fixes: [{
92
- type: FIX_TYPE.COMMAND,
93
- description: 'Update npm',
94
- command: 'npm install -g npm@latest',
95
- autoFixable: true,
96
- }],
97
- };
98
- }
99
-
100
- return {
101
- severity: SEVERITY.PASS,
102
- message: version,
103
- metadata,
104
- };
105
- } catch (err) {
106
- return {
107
- severity: SEVERITY.ERROR,
108
- message: 'npm not found',
109
- detail: err.message,
110
- fixes: [{
111
- type: FIX_TYPE.LINK,
112
- description: 'Install Node.js (includes npm)',
113
- url: 'https://nodejs.org/',
114
- }],
115
- };
116
- }
117
- },
118
- },
119
- {
120
- id: `${MODULE_ID}.package_manager`,
121
- name: 'Package Manager',
122
- category: CATEGORY.RUNTIME,
123
- parallel: true,
124
- check: async () => {
125
- const managers = [
126
- { name: 'pnpm', preferred: true },
127
- { name: 'yarn', preferred: false },
128
- { name: 'npm', preferred: false },
129
- ];
130
-
131
- const detected = [];
132
-
133
- for (const mgr of managers) {
134
- try {
135
- const version = execSync(`${mgr.name} --version`, {
136
- encoding: 'utf8',
137
- timeout: 5000,
138
- stdio: ['pipe', 'pipe', 'pipe'],
139
- }).trim();
140
- detected.push({ ...mgr, version });
141
- } catch {
142
- // Not installed
143
- }
144
- }
145
-
146
- if (detected.length === 0) {
147
- return {
148
- severity: SEVERITY.ERROR,
149
- message: 'No package manager found',
150
- fixes: [{
151
- type: FIX_TYPE.COMMAND,
152
- description: 'Install pnpm (recommended)',
153
- command: 'npm install -g pnpm',
154
- autoFixable: true,
155
- }],
156
- };
157
- }
158
-
159
- const primary = detected[0];
160
- const metadata = { detected, primary: primary.name };
161
-
162
- return {
163
- severity: SEVERITY.PASS,
164
- message: `${primary.name} ${primary.version}${detected.length > 1 ? ` (+${detected.length - 1} more)` : ''}`,
165
- metadata,
166
- };
167
- },
168
- },
169
- {
170
- id: `${MODULE_ID}.node_env`,
171
- name: 'NODE_ENV',
172
- category: CATEGORY.RUNTIME,
173
- parallel: true,
174
- check: async () => {
175
- const nodeEnv = process.env.NODE_ENV;
176
- const metadata = { nodeEnv };
177
-
178
- if (!nodeEnv) {
179
- return {
180
- severity: SEVERITY.INFO,
181
- message: 'Not set (defaults to development)',
182
- metadata,
183
- };
184
- }
185
-
186
- if (nodeEnv === 'production') {
187
- return {
188
- severity: SEVERITY.WARNING,
189
- message: 'production — may affect diagnostic behavior',
190
- detail: 'Some checks behave differently in production mode',
191
- metadata,
192
- };
193
- }
194
-
195
- return {
196
- severity: SEVERITY.PASS,
197
- message: nodeEnv,
198
- metadata,
199
- };
200
- },
201
- },
202
- {
203
- id: `${MODULE_ID}.path_env`,
204
- name: 'PATH Configuration',
205
- category: CATEGORY.RUNTIME,
206
- parallel: true,
207
- check: async () => {
208
- const pathEnv = process.env.PATH || process.env.Path || '';
209
- const paths = pathEnv.split(process.platform === 'win32' ? ';' : ':');
210
-
211
- const hasNodeModulesBin = paths.some(p => p.includes('node_modules/.bin') || p.includes('node_modules\\.bin'));
212
- const metadata = { pathCount: paths.length, hasNodeModulesBin };
213
-
214
- return {
215
- severity: SEVERITY.PASS,
216
- message: `${paths.length} paths configured`,
217
- metadata,
218
- };
219
- },
220
- },
221
- ];
222
- }
223
-
224
- module.exports = { MODULE_ID, createDiagnostics };