@vibecheckai/cli 3.2.2 → 3.2.4
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/ENHANCEMENT_GUIDE.md +121 -121
- package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -295
- package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
- package/bin/runners/lib/agent-firewall/claims/extractor.js +117 -28
- package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +23 -14
- package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +72 -1
- package/bin/runners/lib/agent-firewall/interceptor/base.js +2 -2
- package/bin/runners/lib/agent-firewall/policy/default-policy.json +6 -0
- package/bin/runners/lib/agent-firewall/policy/engine.js +34 -3
- package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +29 -4
- package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +12 -0
- package/bin/runners/lib/agent-firewall/truthpack/loader.js +21 -0
- package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
- package/bin/runners/lib/analyzers.js +606 -325
- 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/engines/accessibility-engine.js +190 -0
- package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
- package/bin/runners/lib/engines/ast-cache.js +99 -0
- package/bin/runners/lib/engines/code-quality-engine.js +255 -0
- package/bin/runners/lib/engines/console-logs-engine.js +115 -0
- package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
- package/bin/runners/lib/engines/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
- package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
- package/bin/runners/lib/engines/file-filter.js +131 -0
- package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
- package/bin/runners/lib/engines/mock-data-engine.js +272 -0
- package/bin/runners/lib/engines/parallel-processor.js +71 -0
- package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
- package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
- package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
- package/bin/runners/lib/engines/type-aware-engine.js +152 -0
- package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
- package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
- package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
- package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
- package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
- 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/global-flags.js +213 -213
- 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/interactive-menu.js +1496 -1496
- 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-output.js +187 -187
- 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/scan-output.js +525 -190
- 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/status-output.js +253 -253
- package/bin/runners/lib/terminal-ui.js +351 -271
- 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/runGuard.js +168 -168
- package/bin/runners/runProof.zip +0 -0
- package/bin/runners/runProve.js +8 -0
- package/bin/runners/runReality.js +14 -0
- package/bin/runners/runScan.js +17 -1
- package/bin/runners/runTruth.js +15 -3
- package/mcp-server/tier-auth.js +4 -4
- package/mcp-server/tools/index.js +72 -72
- package/package.json +1 -1
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diagnostic Modules Index
|
|
3
|
-
*
|
|
4
|
-
* Exports all diagnostic modules for the Doctor service
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const system = require('./system');
|
|
8
|
-
const runtime = require('./runtime');
|
|
9
|
-
const project = require('./project');
|
|
10
|
-
const dependencies = require('./dependencies');
|
|
11
|
-
const security = require('./security');
|
|
12
|
-
const network = require('./network');
|
|
13
|
-
const vibecheck = require('./vibecheck');
|
|
14
|
-
|
|
15
|
-
const ALL_MODULES = [
|
|
16
|
-
system,
|
|
17
|
-
runtime,
|
|
18
|
-
project,
|
|
19
|
-
dependencies,
|
|
20
|
-
security,
|
|
21
|
-
network,
|
|
22
|
-
vibecheck,
|
|
23
|
-
];
|
|
24
|
-
|
|
25
|
-
function getAllDiagnostics(projectPath) {
|
|
26
|
-
const diagnostics = [];
|
|
27
|
-
|
|
28
|
-
for (const mod of ALL_MODULES) {
|
|
29
|
-
const moduleDiagnostics = mod.createDiagnostics(projectPath);
|
|
30
|
-
diagnostics.push(...moduleDiagnostics);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return diagnostics;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
module.exports = {
|
|
37
|
-
system,
|
|
38
|
-
runtime,
|
|
39
|
-
project,
|
|
40
|
-
dependencies,
|
|
41
|
-
security,
|
|
42
|
-
network,
|
|
43
|
-
vibecheck,
|
|
44
|
-
ALL_MODULES,
|
|
45
|
-
getAllDiagnostics,
|
|
46
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostic Modules Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all diagnostic modules for the Doctor service
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const system = require('./system');
|
|
8
|
+
const runtime = require('./runtime');
|
|
9
|
+
const project = require('./project');
|
|
10
|
+
const dependencies = require('./dependencies');
|
|
11
|
+
const security = require('./security');
|
|
12
|
+
const network = require('./network');
|
|
13
|
+
const vibecheck = require('./vibecheck');
|
|
14
|
+
|
|
15
|
+
const ALL_MODULES = [
|
|
16
|
+
system,
|
|
17
|
+
runtime,
|
|
18
|
+
project,
|
|
19
|
+
dependencies,
|
|
20
|
+
security,
|
|
21
|
+
network,
|
|
22
|
+
vibecheck,
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
function getAllDiagnostics(projectPath) {
|
|
26
|
+
const diagnostics = [];
|
|
27
|
+
|
|
28
|
+
for (const mod of ALL_MODULES) {
|
|
29
|
+
const moduleDiagnostics = mod.createDiagnostics(projectPath);
|
|
30
|
+
diagnostics.push(...moduleDiagnostics);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return diagnostics;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = {
|
|
37
|
+
system,
|
|
38
|
+
runtime,
|
|
39
|
+
project,
|
|
40
|
+
dependencies,
|
|
41
|
+
security,
|
|
42
|
+
network,
|
|
43
|
+
vibecheck,
|
|
44
|
+
ALL_MODULES,
|
|
45
|
+
getAllDiagnostics,
|
|
46
|
+
};
|
|
@@ -1,250 +1,250 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Network Diagnostics Module
|
|
3
|
-
*
|
|
4
|
-
* Checks network connectivity, API availability, and proxy configuration
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const https = require('https');
|
|
8
|
-
const http = require('http');
|
|
9
|
-
const { SEVERITY, CATEGORY, FIX_TYPE } = require('../types');
|
|
10
|
-
|
|
11
|
-
const MODULE_ID = 'network';
|
|
12
|
-
|
|
13
|
-
const ENDPOINTS = [
|
|
14
|
-
{ name: 'npm Registry', url: 'https://registry.npmjs.org/', required: true },
|
|
15
|
-
{ name: 'GitHub API', url: 'https://api.github.com/', required: false },
|
|
16
|
-
{ name: 'vibecheck API', url: 'https://api.vibecheck.dev/health', required: false },
|
|
17
|
-
];
|
|
18
|
-
|
|
19
|
-
function checkUrl(url, timeout = 5000) {
|
|
20
|
-
return new Promise((resolve) => {
|
|
21
|
-
const protocol = url.startsWith('https') ? https : http;
|
|
22
|
-
const startTime = Date.now();
|
|
23
|
-
|
|
24
|
-
const req = protocol.get(url, { timeout }, (res) => {
|
|
25
|
-
const latency = Date.now() - startTime;
|
|
26
|
-
resolve({
|
|
27
|
-
ok: res.statusCode >= 200 && res.statusCode < 400,
|
|
28
|
-
statusCode: res.statusCode,
|
|
29
|
-
latency,
|
|
30
|
-
});
|
|
31
|
-
res.destroy();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
req.on('error', (err) => {
|
|
35
|
-
resolve({
|
|
36
|
-
ok: false,
|
|
37
|
-
error: err.message,
|
|
38
|
-
latency: Date.now() - startTime,
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
req.on('timeout', () => {
|
|
43
|
-
resolve({
|
|
44
|
-
ok: false,
|
|
45
|
-
error: 'Timeout',
|
|
46
|
-
latency: timeout,
|
|
47
|
-
});
|
|
48
|
-
req.destroy();
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function createDiagnostics(projectPath) {
|
|
54
|
-
return [
|
|
55
|
-
{
|
|
56
|
-
id: `${MODULE_ID}.internet`,
|
|
57
|
-
name: 'Internet Connectivity',
|
|
58
|
-
category: CATEGORY.NETWORK,
|
|
59
|
-
parallel: true,
|
|
60
|
-
check: async () => {
|
|
61
|
-
const result = await checkUrl('https://www.google.com/', 5000);
|
|
62
|
-
|
|
63
|
-
if (!result.ok) {
|
|
64
|
-
return {
|
|
65
|
-
severity: SEVERITY.ERROR,
|
|
66
|
-
message: 'No internet connection',
|
|
67
|
-
detail: result.error || 'Cannot reach google.com',
|
|
68
|
-
fixes: [{
|
|
69
|
-
type: FIX_TYPE.MANUAL,
|
|
70
|
-
description: 'Check your network connection and firewall settings',
|
|
71
|
-
autoFixable: false,
|
|
72
|
-
}],
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
severity: SEVERITY.PASS,
|
|
78
|
-
message: `Connected (${result.latency}ms)`,
|
|
79
|
-
metadata: { latency: result.latency },
|
|
80
|
-
};
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
id: `${MODULE_ID}.npm_registry`,
|
|
85
|
-
name: 'npm Registry',
|
|
86
|
-
category: CATEGORY.NETWORK,
|
|
87
|
-
parallel: true,
|
|
88
|
-
check: async () => {
|
|
89
|
-
const result = await checkUrl('https://registry.npmjs.org/', 10000);
|
|
90
|
-
|
|
91
|
-
if (!result.ok) {
|
|
92
|
-
return {
|
|
93
|
-
severity: SEVERITY.ERROR,
|
|
94
|
-
message: 'Cannot reach npm registry',
|
|
95
|
-
detail: result.error,
|
|
96
|
-
fixes: [
|
|
97
|
-
{
|
|
98
|
-
type: FIX_TYPE.MANUAL,
|
|
99
|
-
description: 'Check if npm registry is blocked by firewall',
|
|
100
|
-
autoFixable: false,
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
type: FIX_TYPE.COMMAND,
|
|
104
|
-
description: 'Use alternative registry',
|
|
105
|
-
command: 'npm config set registry https://registry.npmmirror.com',
|
|
106
|
-
autoFixable: false,
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (result.latency > 3000) {
|
|
113
|
-
return {
|
|
114
|
-
severity: SEVERITY.WARNING,
|
|
115
|
-
message: `Slow connection (${result.latency}ms)`,
|
|
116
|
-
detail: 'Package installations may be slow',
|
|
117
|
-
metadata: { latency: result.latency },
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return {
|
|
122
|
-
severity: SEVERITY.PASS,
|
|
123
|
-
message: `Reachable (${result.latency}ms)`,
|
|
124
|
-
metadata: { latency: result.latency },
|
|
125
|
-
};
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
id: `${MODULE_ID}.github`,
|
|
130
|
-
name: 'GitHub API',
|
|
131
|
-
category: CATEGORY.NETWORK,
|
|
132
|
-
parallel: true,
|
|
133
|
-
check: async () => {
|
|
134
|
-
const result = await checkUrl('https://api.github.com/', 5000);
|
|
135
|
-
|
|
136
|
-
if (!result.ok) {
|
|
137
|
-
return {
|
|
138
|
-
severity: SEVERITY.INFO,
|
|
139
|
-
message: 'Cannot reach GitHub API',
|
|
140
|
-
detail: 'Some features may be limited',
|
|
141
|
-
metadata: { error: result.error },
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
severity: SEVERITY.PASS,
|
|
147
|
-
message: `Reachable (${result.latency}ms)`,
|
|
148
|
-
metadata: { latency: result.latency },
|
|
149
|
-
};
|
|
150
|
-
},
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
id: `${MODULE_ID}.vibecheck_api`,
|
|
154
|
-
name: 'vibecheck API',
|
|
155
|
-
category: CATEGORY.NETWORK,
|
|
156
|
-
parallel: true,
|
|
157
|
-
check: async () => {
|
|
158
|
-
// Check if API key is configured
|
|
159
|
-
const hasApiKey = !!process.env.VIBECHECK_API_KEY;
|
|
160
|
-
|
|
161
|
-
if (!hasApiKey) {
|
|
162
|
-
return {
|
|
163
|
-
severity: SEVERITY.INFO,
|
|
164
|
-
message: 'API key not configured (offline mode)',
|
|
165
|
-
detail: 'Set VIBECHECK_API_KEY for cloud features',
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const apiUrl = process.env.VIBECHECK_API_URL || 'https://api.vibecheck.dev';
|
|
170
|
-
const result = await checkUrl(`${apiUrl}/health`, 5000);
|
|
171
|
-
|
|
172
|
-
if (!result.ok) {
|
|
173
|
-
return {
|
|
174
|
-
severity: SEVERITY.WARNING,
|
|
175
|
-
message: 'vibecheck API unreachable',
|
|
176
|
-
detail: 'Cloud features may be unavailable',
|
|
177
|
-
metadata: { error: result.error, apiUrl },
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return {
|
|
182
|
-
severity: SEVERITY.PASS,
|
|
183
|
-
message: `Connected (${result.latency}ms)`,
|
|
184
|
-
metadata: { latency: result.latency, apiUrl },
|
|
185
|
-
};
|
|
186
|
-
},
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
id: `${MODULE_ID}.proxy`,
|
|
190
|
-
name: 'Proxy Configuration',
|
|
191
|
-
category: CATEGORY.NETWORK,
|
|
192
|
-
parallel: true,
|
|
193
|
-
check: async () => {
|
|
194
|
-
const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;
|
|
195
|
-
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
|
|
196
|
-
const noProxy = process.env.NO_PROXY || process.env.no_proxy;
|
|
197
|
-
|
|
198
|
-
const metadata = { httpProxy, httpsProxy, noProxy };
|
|
199
|
-
|
|
200
|
-
if (httpProxy || httpsProxy) {
|
|
201
|
-
return {
|
|
202
|
-
severity: SEVERITY.INFO,
|
|
203
|
-
message: `Proxy configured: ${httpsProxy || httpProxy}`,
|
|
204
|
-
metadata,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return {
|
|
209
|
-
severity: SEVERITY.PASS,
|
|
210
|
-
message: 'No proxy configured',
|
|
211
|
-
metadata,
|
|
212
|
-
};
|
|
213
|
-
},
|
|
214
|
-
},
|
|
215
|
-
{
|
|
216
|
-
id: `${MODULE_ID}.dns`,
|
|
217
|
-
name: 'DNS Resolution',
|
|
218
|
-
category: CATEGORY.NETWORK,
|
|
219
|
-
parallel: true,
|
|
220
|
-
check: async () => {
|
|
221
|
-
const dns = require('dns').promises;
|
|
222
|
-
const startTime = Date.now();
|
|
223
|
-
|
|
224
|
-
try {
|
|
225
|
-
await dns.resolve('registry.npmjs.org');
|
|
226
|
-
const latency = Date.now() - startTime;
|
|
227
|
-
|
|
228
|
-
return {
|
|
229
|
-
severity: SEVERITY.PASS,
|
|
230
|
-
message: `Working (${latency}ms)`,
|
|
231
|
-
metadata: { latency },
|
|
232
|
-
};
|
|
233
|
-
} catch (err) {
|
|
234
|
-
return {
|
|
235
|
-
severity: SEVERITY.ERROR,
|
|
236
|
-
message: 'DNS resolution failed',
|
|
237
|
-
detail: err.message,
|
|
238
|
-
fixes: [{
|
|
239
|
-
type: FIX_TYPE.MANUAL,
|
|
240
|
-
description: 'Check DNS settings or use 8.8.8.8 / 1.1.1.1',
|
|
241
|
-
autoFixable: false,
|
|
242
|
-
}],
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
];
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
module.exports = { MODULE_ID, createDiagnostics, checkUrl };
|
|
1
|
+
/**
|
|
2
|
+
* Network Diagnostics Module
|
|
3
|
+
*
|
|
4
|
+
* Checks network connectivity, API availability, and proxy configuration
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const https = require('https');
|
|
8
|
+
const http = require('http');
|
|
9
|
+
const { SEVERITY, CATEGORY, FIX_TYPE } = require('../types');
|
|
10
|
+
|
|
11
|
+
const MODULE_ID = 'network';
|
|
12
|
+
|
|
13
|
+
const ENDPOINTS = [
|
|
14
|
+
{ name: 'npm Registry', url: 'https://registry.npmjs.org/', required: true },
|
|
15
|
+
{ name: 'GitHub API', url: 'https://api.github.com/', required: false },
|
|
16
|
+
{ name: 'vibecheck API', url: 'https://api.vibecheck.dev/health', required: false },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
function checkUrl(url, timeout = 5000) {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const protocol = url.startsWith('https') ? https : http;
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
|
|
24
|
+
const req = protocol.get(url, { timeout }, (res) => {
|
|
25
|
+
const latency = Date.now() - startTime;
|
|
26
|
+
resolve({
|
|
27
|
+
ok: res.statusCode >= 200 && res.statusCode < 400,
|
|
28
|
+
statusCode: res.statusCode,
|
|
29
|
+
latency,
|
|
30
|
+
});
|
|
31
|
+
res.destroy();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
req.on('error', (err) => {
|
|
35
|
+
resolve({
|
|
36
|
+
ok: false,
|
|
37
|
+
error: err.message,
|
|
38
|
+
latency: Date.now() - startTime,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
req.on('timeout', () => {
|
|
43
|
+
resolve({
|
|
44
|
+
ok: false,
|
|
45
|
+
error: 'Timeout',
|
|
46
|
+
latency: timeout,
|
|
47
|
+
});
|
|
48
|
+
req.destroy();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function createDiagnostics(projectPath) {
|
|
54
|
+
return [
|
|
55
|
+
{
|
|
56
|
+
id: `${MODULE_ID}.internet`,
|
|
57
|
+
name: 'Internet Connectivity',
|
|
58
|
+
category: CATEGORY.NETWORK,
|
|
59
|
+
parallel: true,
|
|
60
|
+
check: async () => {
|
|
61
|
+
const result = await checkUrl('https://www.google.com/', 5000);
|
|
62
|
+
|
|
63
|
+
if (!result.ok) {
|
|
64
|
+
return {
|
|
65
|
+
severity: SEVERITY.ERROR,
|
|
66
|
+
message: 'No internet connection',
|
|
67
|
+
detail: result.error || 'Cannot reach google.com',
|
|
68
|
+
fixes: [{
|
|
69
|
+
type: FIX_TYPE.MANUAL,
|
|
70
|
+
description: 'Check your network connection and firewall settings',
|
|
71
|
+
autoFixable: false,
|
|
72
|
+
}],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
severity: SEVERITY.PASS,
|
|
78
|
+
message: `Connected (${result.latency}ms)`,
|
|
79
|
+
metadata: { latency: result.latency },
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: `${MODULE_ID}.npm_registry`,
|
|
85
|
+
name: 'npm Registry',
|
|
86
|
+
category: CATEGORY.NETWORK,
|
|
87
|
+
parallel: true,
|
|
88
|
+
check: async () => {
|
|
89
|
+
const result = await checkUrl('https://registry.npmjs.org/', 10000);
|
|
90
|
+
|
|
91
|
+
if (!result.ok) {
|
|
92
|
+
return {
|
|
93
|
+
severity: SEVERITY.ERROR,
|
|
94
|
+
message: 'Cannot reach npm registry',
|
|
95
|
+
detail: result.error,
|
|
96
|
+
fixes: [
|
|
97
|
+
{
|
|
98
|
+
type: FIX_TYPE.MANUAL,
|
|
99
|
+
description: 'Check if npm registry is blocked by firewall',
|
|
100
|
+
autoFixable: false,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: FIX_TYPE.COMMAND,
|
|
104
|
+
description: 'Use alternative registry',
|
|
105
|
+
command: 'npm config set registry https://registry.npmmirror.com',
|
|
106
|
+
autoFixable: false,
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (result.latency > 3000) {
|
|
113
|
+
return {
|
|
114
|
+
severity: SEVERITY.WARNING,
|
|
115
|
+
message: `Slow connection (${result.latency}ms)`,
|
|
116
|
+
detail: 'Package installations may be slow',
|
|
117
|
+
metadata: { latency: result.latency },
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
severity: SEVERITY.PASS,
|
|
123
|
+
message: `Reachable (${result.latency}ms)`,
|
|
124
|
+
metadata: { latency: result.latency },
|
|
125
|
+
};
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: `${MODULE_ID}.github`,
|
|
130
|
+
name: 'GitHub API',
|
|
131
|
+
category: CATEGORY.NETWORK,
|
|
132
|
+
parallel: true,
|
|
133
|
+
check: async () => {
|
|
134
|
+
const result = await checkUrl('https://api.github.com/', 5000);
|
|
135
|
+
|
|
136
|
+
if (!result.ok) {
|
|
137
|
+
return {
|
|
138
|
+
severity: SEVERITY.INFO,
|
|
139
|
+
message: 'Cannot reach GitHub API',
|
|
140
|
+
detail: 'Some features may be limited',
|
|
141
|
+
metadata: { error: result.error },
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
severity: SEVERITY.PASS,
|
|
147
|
+
message: `Reachable (${result.latency}ms)`,
|
|
148
|
+
metadata: { latency: result.latency },
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: `${MODULE_ID}.vibecheck_api`,
|
|
154
|
+
name: 'vibecheck API',
|
|
155
|
+
category: CATEGORY.NETWORK,
|
|
156
|
+
parallel: true,
|
|
157
|
+
check: async () => {
|
|
158
|
+
// Check if API key is configured
|
|
159
|
+
const hasApiKey = !!process.env.VIBECHECK_API_KEY;
|
|
160
|
+
|
|
161
|
+
if (!hasApiKey) {
|
|
162
|
+
return {
|
|
163
|
+
severity: SEVERITY.INFO,
|
|
164
|
+
message: 'API key not configured (offline mode)',
|
|
165
|
+
detail: 'Set VIBECHECK_API_KEY for cloud features',
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const apiUrl = process.env.VIBECHECK_API_URL || 'https://api.vibecheck.dev';
|
|
170
|
+
const result = await checkUrl(`${apiUrl}/health`, 5000);
|
|
171
|
+
|
|
172
|
+
if (!result.ok) {
|
|
173
|
+
return {
|
|
174
|
+
severity: SEVERITY.WARNING,
|
|
175
|
+
message: 'vibecheck API unreachable',
|
|
176
|
+
detail: 'Cloud features may be unavailable',
|
|
177
|
+
metadata: { error: result.error, apiUrl },
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
severity: SEVERITY.PASS,
|
|
183
|
+
message: `Connected (${result.latency}ms)`,
|
|
184
|
+
metadata: { latency: result.latency, apiUrl },
|
|
185
|
+
};
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
id: `${MODULE_ID}.proxy`,
|
|
190
|
+
name: 'Proxy Configuration',
|
|
191
|
+
category: CATEGORY.NETWORK,
|
|
192
|
+
parallel: true,
|
|
193
|
+
check: async () => {
|
|
194
|
+
const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;
|
|
195
|
+
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
|
|
196
|
+
const noProxy = process.env.NO_PROXY || process.env.no_proxy;
|
|
197
|
+
|
|
198
|
+
const metadata = { httpProxy, httpsProxy, noProxy };
|
|
199
|
+
|
|
200
|
+
if (httpProxy || httpsProxy) {
|
|
201
|
+
return {
|
|
202
|
+
severity: SEVERITY.INFO,
|
|
203
|
+
message: `Proxy configured: ${httpsProxy || httpProxy}`,
|
|
204
|
+
metadata,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return {
|
|
209
|
+
severity: SEVERITY.PASS,
|
|
210
|
+
message: 'No proxy configured',
|
|
211
|
+
metadata,
|
|
212
|
+
};
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: `${MODULE_ID}.dns`,
|
|
217
|
+
name: 'DNS Resolution',
|
|
218
|
+
category: CATEGORY.NETWORK,
|
|
219
|
+
parallel: true,
|
|
220
|
+
check: async () => {
|
|
221
|
+
const dns = require('dns').promises;
|
|
222
|
+
const startTime = Date.now();
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
await dns.resolve('registry.npmjs.org');
|
|
226
|
+
const latency = Date.now() - startTime;
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
severity: SEVERITY.PASS,
|
|
230
|
+
message: `Working (${latency}ms)`,
|
|
231
|
+
metadata: { latency },
|
|
232
|
+
};
|
|
233
|
+
} catch (err) {
|
|
234
|
+
return {
|
|
235
|
+
severity: SEVERITY.ERROR,
|
|
236
|
+
message: 'DNS resolution failed',
|
|
237
|
+
detail: err.message,
|
|
238
|
+
fixes: [{
|
|
239
|
+
type: FIX_TYPE.MANUAL,
|
|
240
|
+
description: 'Check DNS settings or use 8.8.8.8 / 1.1.1.1',
|
|
241
|
+
autoFixable: false,
|
|
242
|
+
}],
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
module.exports = { MODULE_ID, createDiagnostics, checkUrl };
|