@vibecheckai/cli 3.2.4 → 3.2.6
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/.generated +25 -25
- package/bin/dev/run-v2-torture.js +30 -30
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -295
- package/bin/runners/lib/api-client.js +269 -0
- package/bin/runners/lib/auth-truth.js +193 -193
- package/bin/runners/lib/backup.js +62 -62
- package/bin/runners/lib/billing.js +107 -107
- package/bin/runners/lib/claims.js +118 -118
- package/bin/runners/lib/cli-ui.js +540 -540
- package/bin/runners/lib/contracts/auth-contract.js +202 -202
- package/bin/runners/lib/contracts/env-contract.js +181 -181
- package/bin/runners/lib/contracts/external-contract.js +206 -206
- package/bin/runners/lib/contracts/guard.js +168 -168
- package/bin/runners/lib/contracts/index.js +89 -89
- package/bin/runners/lib/contracts/plan-validator.js +311 -311
- package/bin/runners/lib/contracts/route-contract.js +199 -199
- package/bin/runners/lib/contracts.js +804 -804
- package/bin/runners/lib/detect.js +89 -89
- package/bin/runners/lib/doctor/autofix.js +254 -254
- package/bin/runners/lib/doctor/index.js +37 -37
- package/bin/runners/lib/doctor/modules/dependencies.js +325 -325
- package/bin/runners/lib/doctor/modules/index.js +46 -46
- package/bin/runners/lib/doctor/modules/network.js +250 -250
- package/bin/runners/lib/doctor/modules/project.js +312 -312
- package/bin/runners/lib/doctor/modules/runtime.js +224 -224
- package/bin/runners/lib/doctor/modules/security.js +348 -348
- package/bin/runners/lib/doctor/modules/system.js +213 -213
- package/bin/runners/lib/doctor/modules/vibecheck.js +394 -394
- package/bin/runners/lib/doctor/reporter.js +262 -262
- package/bin/runners/lib/doctor/service.js +262 -262
- package/bin/runners/lib/doctor/types.js +113 -113
- package/bin/runners/lib/doctor/ui.js +263 -263
- package/bin/runners/lib/doctor-v2.js +608 -608
- package/bin/runners/lib/drift.js +425 -425
- package/bin/runners/lib/enforcement.js +72 -72
- package/bin/runners/lib/enterprise-detect.js +603 -603
- package/bin/runners/lib/enterprise-init.js +942 -942
- package/bin/runners/lib/env-resolver.js +417 -417
- package/bin/runners/lib/env-template.js +66 -66
- package/bin/runners/lib/env.js +189 -189
- package/bin/runners/lib/extractors/client-calls.js +990 -990
- package/bin/runners/lib/extractors/fastify-route-dump.js +573 -573
- package/bin/runners/lib/extractors/fastify-routes.js +426 -426
- package/bin/runners/lib/extractors/index.js +363 -363
- package/bin/runners/lib/extractors/next-routes.js +524 -524
- package/bin/runners/lib/extractors/proof-graph.js +431 -431
- package/bin/runners/lib/extractors/route-matcher.js +451 -451
- package/bin/runners/lib/extractors/truthpack-v2.js +377 -377
- package/bin/runners/lib/extractors/ui-bindings.js +547 -547
- package/bin/runners/lib/findings-schema.js +281 -281
- package/bin/runners/lib/firewall-prompt.js +50 -50
- package/bin/runners/lib/graph/graph-builder.js +265 -265
- package/bin/runners/lib/graph/html-renderer.js +413 -413
- package/bin/runners/lib/graph/index.js +32 -32
- package/bin/runners/lib/graph/runtime-collector.js +215 -215
- package/bin/runners/lib/graph/static-extractor.js +518 -518
- package/bin/runners/lib/html-report.js +650 -650
- package/bin/runners/lib/llm.js +75 -75
- package/bin/runners/lib/meter.js +61 -61
- package/bin/runners/lib/missions/evidence.js +126 -126
- package/bin/runners/lib/patch.js +40 -40
- package/bin/runners/lib/permissions/auth-model.js +213 -213
- package/bin/runners/lib/permissions/idor-prover.js +205 -205
- package/bin/runners/lib/permissions/index.js +45 -45
- package/bin/runners/lib/permissions/matrix-builder.js +198 -198
- package/bin/runners/lib/pkgjson.js +28 -28
- package/bin/runners/lib/policy.js +295 -295
- package/bin/runners/lib/preflight.js +142 -142
- package/bin/runners/lib/reality/correlation-detectors.js +359 -359
- package/bin/runners/lib/reality/index.js +318 -318
- package/bin/runners/lib/reality/request-hashing.js +416 -416
- package/bin/runners/lib/reality/request-mapper.js +453 -453
- package/bin/runners/lib/reality/safety-rails.js +463 -463
- package/bin/runners/lib/reality/semantic-snapshot.js +408 -408
- package/bin/runners/lib/reality/toast-detector.js +393 -393
- package/bin/runners/lib/reality-findings.js +84 -84
- package/bin/runners/lib/receipts.js +179 -179
- package/bin/runners/lib/redact.js +29 -29
- package/bin/runners/lib/replay/capsule-manager.js +154 -154
- package/bin/runners/lib/replay/index.js +263 -263
- package/bin/runners/lib/replay/player.js +348 -348
- package/bin/runners/lib/replay/recorder.js +331 -331
- package/bin/runners/lib/report.js +135 -135
- package/bin/runners/lib/route-detection.js +1140 -1140
- package/bin/runners/lib/sandbox/index.js +59 -59
- package/bin/runners/lib/sandbox/proof-chain.js +399 -399
- package/bin/runners/lib/sandbox/sandbox-runner.js +205 -205
- package/bin/runners/lib/sandbox/worktree.js +174 -174
- package/bin/runners/lib/schema-validator.js +350 -350
- package/bin/runners/lib/schemas/contracts.schema.json +160 -160
- package/bin/runners/lib/schemas/finding.schema.json +100 -100
- package/bin/runners/lib/schemas/mission-pack.schema.json +206 -206
- package/bin/runners/lib/schemas/proof-graph.schema.json +176 -176
- package/bin/runners/lib/schemas/reality-report.schema.json +162 -162
- package/bin/runners/lib/schemas/share-pack.schema.json +180 -180
- package/bin/runners/lib/schemas/ship-report.schema.json +117 -117
- package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -303
- package/bin/runners/lib/schemas/validator.js +438 -438
- package/bin/runners/lib/score-history.js +282 -282
- package/bin/runners/lib/share-pack.js +239 -239
- package/bin/runners/lib/snippets.js +67 -67
- package/bin/runners/lib/upsell.js +510 -510
- package/bin/runners/lib/usage.js +153 -153
- package/bin/runners/lib/validate-patch.js +156 -156
- package/bin/runners/lib/verdict-engine.js +628 -628
- package/bin/runners/reality/engine.js +917 -917
- package/bin/runners/reality/flows.js +122 -122
- package/bin/runners/reality/report.js +378 -378
- package/bin/runners/reality/session.js +193 -193
- package/bin/runners/runAgent.d.ts +5 -0
- package/bin/runners/runFirewall.d.ts +5 -0
- package/bin/runners/runFirewallHook.d.ts +5 -0
- package/bin/runners/runGuard.js +168 -168
- package/bin/runners/runScan.js +82 -0
- package/bin/runners/runTruth.d.ts +5 -0
- package/bin/vibecheck.js +45 -20
- package/mcp-server/index.js +85 -0
- package/mcp-server/lib/api-client.js +269 -0
- package/mcp-server/package.json +1 -1
- package/mcp-server/tier-auth.js +173 -113
- package/mcp-server/tools/index.js +72 -72
- package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
- package/package.json +1 -1
|
@@ -1,224 +1,224 @@
|
|
|
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 };
|
|
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 };
|