@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,213 +1,213 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* System Diagnostics Module
|
|
3
|
-
*
|
|
4
|
-
* Checks OS, memory, disk, CPU, and system resources
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const os = require('os');
|
|
8
|
-
const fs = require('fs');
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const { SEVERITY, CATEGORY, FIX_TYPE } = require('../types');
|
|
11
|
-
|
|
12
|
-
const MODULE_ID = 'system';
|
|
13
|
-
|
|
14
|
-
function createDiagnostics(projectPath) {
|
|
15
|
-
return [
|
|
16
|
-
{
|
|
17
|
-
id: `${MODULE_ID}.os`,
|
|
18
|
-
name: 'Operating System',
|
|
19
|
-
category: CATEGORY.SYSTEM,
|
|
20
|
-
parallel: true,
|
|
21
|
-
check: async () => {
|
|
22
|
-
const platform = os.platform();
|
|
23
|
-
const release = os.release();
|
|
24
|
-
const arch = os.arch();
|
|
25
|
-
|
|
26
|
-
const platformNames = {
|
|
27
|
-
win32: 'Windows',
|
|
28
|
-
darwin: 'macOS',
|
|
29
|
-
linux: 'Linux',
|
|
30
|
-
freebsd: 'FreeBSD',
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
return {
|
|
34
|
-
severity: SEVERITY.PASS,
|
|
35
|
-
message: `${platformNames[platform] || platform} ${release} (${arch})`,
|
|
36
|
-
metadata: { platform, release, arch },
|
|
37
|
-
};
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
id: `${MODULE_ID}.memory`,
|
|
42
|
-
name: 'System Memory',
|
|
43
|
-
category: CATEGORY.SYSTEM,
|
|
44
|
-
parallel: true,
|
|
45
|
-
check: async () => {
|
|
46
|
-
const totalBytes = os.totalmem();
|
|
47
|
-
const freeBytes = os.freemem();
|
|
48
|
-
const totalGB = (totalBytes / 1024 / 1024 / 1024).toFixed(1);
|
|
49
|
-
const freeGB = (freeBytes / 1024 / 1024 / 1024).toFixed(1);
|
|
50
|
-
const usedPercent = Math.round((1 - freeBytes / totalBytes) * 100);
|
|
51
|
-
|
|
52
|
-
const metadata = { totalBytes, freeBytes, totalGB, freeGB, usedPercent };
|
|
53
|
-
|
|
54
|
-
if (freeBytes < 256 * 1024 * 1024) { // < 256MB
|
|
55
|
-
return {
|
|
56
|
-
severity: SEVERITY.ERROR,
|
|
57
|
-
message: `Critically low memory: ${freeGB}GB free`,
|
|
58
|
-
detail: 'vibecheck may fail or be extremely slow',
|
|
59
|
-
metadata,
|
|
60
|
-
fixes: [{
|
|
61
|
-
type: FIX_TYPE.MANUAL,
|
|
62
|
-
description: 'Close other applications to free memory',
|
|
63
|
-
autoFixable: false,
|
|
64
|
-
}],
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (freeBytes < 512 * 1024 * 1024) { // < 512MB
|
|
69
|
-
return {
|
|
70
|
-
severity: SEVERITY.WARNING,
|
|
71
|
-
message: `Low memory: ${freeGB}GB free of ${totalGB}GB`,
|
|
72
|
-
metadata,
|
|
73
|
-
fixes: [{
|
|
74
|
-
type: FIX_TYPE.MANUAL,
|
|
75
|
-
description: 'Close other applications to free memory',
|
|
76
|
-
autoFixable: false,
|
|
77
|
-
}],
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
severity: SEVERITY.PASS,
|
|
83
|
-
message: `${freeGB}GB free of ${totalGB}GB (${usedPercent}% used)`,
|
|
84
|
-
metadata,
|
|
85
|
-
};
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
id: `${MODULE_ID}.cpu`,
|
|
90
|
-
name: 'CPU Information',
|
|
91
|
-
category: CATEGORY.SYSTEM,
|
|
92
|
-
parallel: true,
|
|
93
|
-
check: async () => {
|
|
94
|
-
const cpus = os.cpus();
|
|
95
|
-
const cores = cpus.length;
|
|
96
|
-
const model = cpus[0]?.model || 'Unknown';
|
|
97
|
-
const loadAvg = os.loadavg();
|
|
98
|
-
|
|
99
|
-
const metadata = { cores, model, loadAvg };
|
|
100
|
-
|
|
101
|
-
// High load warning (load > cores * 2)
|
|
102
|
-
if (loadAvg[0] > cores * 2) {
|
|
103
|
-
return {
|
|
104
|
-
severity: SEVERITY.WARNING,
|
|
105
|
-
message: `High CPU load: ${loadAvg[0].toFixed(1)} (${cores} cores)`,
|
|
106
|
-
detail: 'System is under heavy load',
|
|
107
|
-
metadata,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
severity: SEVERITY.PASS,
|
|
113
|
-
message: `${cores} cores, load: ${loadAvg[0].toFixed(2)}`,
|
|
114
|
-
metadata,
|
|
115
|
-
};
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
id: `${MODULE_ID}.disk_write`,
|
|
120
|
-
name: 'Disk Write Access',
|
|
121
|
-
category: CATEGORY.SYSTEM,
|
|
122
|
-
parallel: false,
|
|
123
|
-
check: async () => {
|
|
124
|
-
const testDir = path.join(projectPath, '.vibecheck');
|
|
125
|
-
const testFile = path.join(testDir, '.doctor-test');
|
|
126
|
-
|
|
127
|
-
try {
|
|
128
|
-
// Ensure directory exists
|
|
129
|
-
if (!fs.existsSync(testDir)) {
|
|
130
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Test write
|
|
134
|
-
fs.writeFileSync(testFile, `test-${Date.now()}`);
|
|
135
|
-
fs.unlinkSync(testFile);
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
severity: SEVERITY.PASS,
|
|
139
|
-
message: 'Write access OK',
|
|
140
|
-
};
|
|
141
|
-
} catch (err) {
|
|
142
|
-
return {
|
|
143
|
-
severity: SEVERITY.ERROR,
|
|
144
|
-
message: 'Cannot write to project directory',
|
|
145
|
-
detail: err.message,
|
|
146
|
-
fixes: [
|
|
147
|
-
{
|
|
148
|
-
type: FIX_TYPE.COMMAND,
|
|
149
|
-
description: 'Fix directory permissions',
|
|
150
|
-
command: process.platform === 'win32'
|
|
151
|
-
? `icacls "${projectPath}" /grant "%USERNAME%":F /T`
|
|
152
|
-
: `chmod -R u+w "${projectPath}"`,
|
|
153
|
-
dangerous: true,
|
|
154
|
-
autoFixable: false,
|
|
155
|
-
},
|
|
156
|
-
],
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
id: `${MODULE_ID}.temp_dir`,
|
|
163
|
-
name: 'Temp Directory',
|
|
164
|
-
category: CATEGORY.SYSTEM,
|
|
165
|
-
parallel: true,
|
|
166
|
-
check: async () => {
|
|
167
|
-
const tmpDir = os.tmpdir();
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
const testFile = path.join(tmpDir, `.vibecheck-test-${Date.now()}`);
|
|
171
|
-
fs.writeFileSync(testFile, 'test');
|
|
172
|
-
fs.unlinkSync(testFile);
|
|
173
|
-
|
|
174
|
-
return {
|
|
175
|
-
severity: SEVERITY.PASS,
|
|
176
|
-
message: `Writable: ${tmpDir}`,
|
|
177
|
-
metadata: { tmpDir },
|
|
178
|
-
};
|
|
179
|
-
} catch (err) {
|
|
180
|
-
return {
|
|
181
|
-
severity: SEVERITY.WARNING,
|
|
182
|
-
message: `Temp directory not writable: ${tmpDir}`,
|
|
183
|
-
detail: err.message,
|
|
184
|
-
metadata: { tmpDir },
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
},
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
id: `${MODULE_ID}.shell`,
|
|
191
|
-
name: 'Shell Environment',
|
|
192
|
-
category: CATEGORY.SYSTEM,
|
|
193
|
-
parallel: true,
|
|
194
|
-
check: async () => {
|
|
195
|
-
const shell = process.env.SHELL || process.env.ComSpec || 'unknown';
|
|
196
|
-
const term = process.env.TERM || process.env.WT_SESSION ? 'modern' : 'basic';
|
|
197
|
-
const colorSupport = process.stdout.isTTY && (
|
|
198
|
-
process.env.COLORTERM === 'truecolor' ||
|
|
199
|
-
process.env.TERM_PROGRAM === 'vscode' ||
|
|
200
|
-
process.env.WT_SESSION
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
return {
|
|
204
|
-
severity: SEVERITY.PASS,
|
|
205
|
-
message: `${path.basename(shell)} (${colorSupport ? 'color' : 'no-color'})`,
|
|
206
|
-
metadata: { shell, term, colorSupport },
|
|
207
|
-
};
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
];
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
module.exports = { MODULE_ID, createDiagnostics };
|
|
1
|
+
/**
|
|
2
|
+
* System Diagnostics Module
|
|
3
|
+
*
|
|
4
|
+
* Checks OS, memory, disk, CPU, and system resources
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const os = require('os');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { SEVERITY, CATEGORY, FIX_TYPE } = require('../types');
|
|
11
|
+
|
|
12
|
+
const MODULE_ID = 'system';
|
|
13
|
+
|
|
14
|
+
function createDiagnostics(projectPath) {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
id: `${MODULE_ID}.os`,
|
|
18
|
+
name: 'Operating System',
|
|
19
|
+
category: CATEGORY.SYSTEM,
|
|
20
|
+
parallel: true,
|
|
21
|
+
check: async () => {
|
|
22
|
+
const platform = os.platform();
|
|
23
|
+
const release = os.release();
|
|
24
|
+
const arch = os.arch();
|
|
25
|
+
|
|
26
|
+
const platformNames = {
|
|
27
|
+
win32: 'Windows',
|
|
28
|
+
darwin: 'macOS',
|
|
29
|
+
linux: 'Linux',
|
|
30
|
+
freebsd: 'FreeBSD',
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
severity: SEVERITY.PASS,
|
|
35
|
+
message: `${platformNames[platform] || platform} ${release} (${arch})`,
|
|
36
|
+
metadata: { platform, release, arch },
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: `${MODULE_ID}.memory`,
|
|
42
|
+
name: 'System Memory',
|
|
43
|
+
category: CATEGORY.SYSTEM,
|
|
44
|
+
parallel: true,
|
|
45
|
+
check: async () => {
|
|
46
|
+
const totalBytes = os.totalmem();
|
|
47
|
+
const freeBytes = os.freemem();
|
|
48
|
+
const totalGB = (totalBytes / 1024 / 1024 / 1024).toFixed(1);
|
|
49
|
+
const freeGB = (freeBytes / 1024 / 1024 / 1024).toFixed(1);
|
|
50
|
+
const usedPercent = Math.round((1 - freeBytes / totalBytes) * 100);
|
|
51
|
+
|
|
52
|
+
const metadata = { totalBytes, freeBytes, totalGB, freeGB, usedPercent };
|
|
53
|
+
|
|
54
|
+
if (freeBytes < 256 * 1024 * 1024) { // < 256MB
|
|
55
|
+
return {
|
|
56
|
+
severity: SEVERITY.ERROR,
|
|
57
|
+
message: `Critically low memory: ${freeGB}GB free`,
|
|
58
|
+
detail: 'vibecheck may fail or be extremely slow',
|
|
59
|
+
metadata,
|
|
60
|
+
fixes: [{
|
|
61
|
+
type: FIX_TYPE.MANUAL,
|
|
62
|
+
description: 'Close other applications to free memory',
|
|
63
|
+
autoFixable: false,
|
|
64
|
+
}],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (freeBytes < 512 * 1024 * 1024) { // < 512MB
|
|
69
|
+
return {
|
|
70
|
+
severity: SEVERITY.WARNING,
|
|
71
|
+
message: `Low memory: ${freeGB}GB free of ${totalGB}GB`,
|
|
72
|
+
metadata,
|
|
73
|
+
fixes: [{
|
|
74
|
+
type: FIX_TYPE.MANUAL,
|
|
75
|
+
description: 'Close other applications to free memory',
|
|
76
|
+
autoFixable: false,
|
|
77
|
+
}],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
severity: SEVERITY.PASS,
|
|
83
|
+
message: `${freeGB}GB free of ${totalGB}GB (${usedPercent}% used)`,
|
|
84
|
+
metadata,
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: `${MODULE_ID}.cpu`,
|
|
90
|
+
name: 'CPU Information',
|
|
91
|
+
category: CATEGORY.SYSTEM,
|
|
92
|
+
parallel: true,
|
|
93
|
+
check: async () => {
|
|
94
|
+
const cpus = os.cpus();
|
|
95
|
+
const cores = cpus.length;
|
|
96
|
+
const model = cpus[0]?.model || 'Unknown';
|
|
97
|
+
const loadAvg = os.loadavg();
|
|
98
|
+
|
|
99
|
+
const metadata = { cores, model, loadAvg };
|
|
100
|
+
|
|
101
|
+
// High load warning (load > cores * 2)
|
|
102
|
+
if (loadAvg[0] > cores * 2) {
|
|
103
|
+
return {
|
|
104
|
+
severity: SEVERITY.WARNING,
|
|
105
|
+
message: `High CPU load: ${loadAvg[0].toFixed(1)} (${cores} cores)`,
|
|
106
|
+
detail: 'System is under heavy load',
|
|
107
|
+
metadata,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
severity: SEVERITY.PASS,
|
|
113
|
+
message: `${cores} cores, load: ${loadAvg[0].toFixed(2)}`,
|
|
114
|
+
metadata,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: `${MODULE_ID}.disk_write`,
|
|
120
|
+
name: 'Disk Write Access',
|
|
121
|
+
category: CATEGORY.SYSTEM,
|
|
122
|
+
parallel: false,
|
|
123
|
+
check: async () => {
|
|
124
|
+
const testDir = path.join(projectPath, '.vibecheck');
|
|
125
|
+
const testFile = path.join(testDir, '.doctor-test');
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
// Ensure directory exists
|
|
129
|
+
if (!fs.existsSync(testDir)) {
|
|
130
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Test write
|
|
134
|
+
fs.writeFileSync(testFile, `test-${Date.now()}`);
|
|
135
|
+
fs.unlinkSync(testFile);
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
severity: SEVERITY.PASS,
|
|
139
|
+
message: 'Write access OK',
|
|
140
|
+
};
|
|
141
|
+
} catch (err) {
|
|
142
|
+
return {
|
|
143
|
+
severity: SEVERITY.ERROR,
|
|
144
|
+
message: 'Cannot write to project directory',
|
|
145
|
+
detail: err.message,
|
|
146
|
+
fixes: [
|
|
147
|
+
{
|
|
148
|
+
type: FIX_TYPE.COMMAND,
|
|
149
|
+
description: 'Fix directory permissions',
|
|
150
|
+
command: process.platform === 'win32'
|
|
151
|
+
? `icacls "${projectPath}" /grant "%USERNAME%":F /T`
|
|
152
|
+
: `chmod -R u+w "${projectPath}"`,
|
|
153
|
+
dangerous: true,
|
|
154
|
+
autoFixable: false,
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: `${MODULE_ID}.temp_dir`,
|
|
163
|
+
name: 'Temp Directory',
|
|
164
|
+
category: CATEGORY.SYSTEM,
|
|
165
|
+
parallel: true,
|
|
166
|
+
check: async () => {
|
|
167
|
+
const tmpDir = os.tmpdir();
|
|
168
|
+
|
|
169
|
+
try {
|
|
170
|
+
const testFile = path.join(tmpDir, `.vibecheck-test-${Date.now()}`);
|
|
171
|
+
fs.writeFileSync(testFile, 'test');
|
|
172
|
+
fs.unlinkSync(testFile);
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
severity: SEVERITY.PASS,
|
|
176
|
+
message: `Writable: ${tmpDir}`,
|
|
177
|
+
metadata: { tmpDir },
|
|
178
|
+
};
|
|
179
|
+
} catch (err) {
|
|
180
|
+
return {
|
|
181
|
+
severity: SEVERITY.WARNING,
|
|
182
|
+
message: `Temp directory not writable: ${tmpDir}`,
|
|
183
|
+
detail: err.message,
|
|
184
|
+
metadata: { tmpDir },
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
id: `${MODULE_ID}.shell`,
|
|
191
|
+
name: 'Shell Environment',
|
|
192
|
+
category: CATEGORY.SYSTEM,
|
|
193
|
+
parallel: true,
|
|
194
|
+
check: async () => {
|
|
195
|
+
const shell = process.env.SHELL || process.env.ComSpec || 'unknown';
|
|
196
|
+
const term = process.env.TERM || process.env.WT_SESSION ? 'modern' : 'basic';
|
|
197
|
+
const colorSupport = process.stdout.isTTY && (
|
|
198
|
+
process.env.COLORTERM === 'truecolor' ||
|
|
199
|
+
process.env.TERM_PROGRAM === 'vscode' ||
|
|
200
|
+
process.env.WT_SESSION
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
return {
|
|
204
|
+
severity: SEVERITY.PASS,
|
|
205
|
+
message: `${path.basename(shell)} (${colorSupport ? 'color' : 'no-color'})`,
|
|
206
|
+
metadata: { shell, term, colorSupport },
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
module.exports = { MODULE_ID, createDiagnostics };
|