vibecheck-mcp-server 3.5.0 → 3.5.1

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 (96) hide show
  1. package/dist/__tests__/cache.test.d.ts +10 -0
  2. package/dist/__tests__/cache.test.d.ts.map +1 -0
  3. package/dist/__tests__/cache.test.js +239 -0
  4. package/dist/__tests__/cache.test.js.map +1 -0
  5. package/dist/__tests__/executor.test.d.ts +11 -0
  6. package/dist/__tests__/executor.test.d.ts.map +1 -0
  7. package/dist/__tests__/executor.test.js +198 -0
  8. package/dist/__tests__/executor.test.js.map +1 -0
  9. package/dist/__tests__/fixtures/exclusion-test/src/app.d.ts +5 -0
  10. package/dist/__tests__/fixtures/exclusion-test/src/app.d.ts.map +1 -0
  11. package/dist/__tests__/fixtures/exclusion-test/src/app.js +9 -0
  12. package/dist/__tests__/fixtures/exclusion-test/src/app.js.map +1 -0
  13. package/dist/__tests__/ids.test.d.ts +10 -0
  14. package/dist/__tests__/ids.test.d.ts.map +1 -0
  15. package/dist/__tests__/ids.test.js +262 -0
  16. package/dist/__tests__/ids.test.js.map +1 -0
  17. package/dist/__tests__/integration/tools.test.d.ts +10 -0
  18. package/dist/__tests__/integration/tools.test.d.ts.map +1 -0
  19. package/dist/__tests__/integration/tools.test.js +343 -0
  20. package/dist/__tests__/integration/tools.test.js.map +1 -0
  21. package/dist/__tests__/registry.test.d.ts +11 -0
  22. package/dist/__tests__/registry.test.d.ts.map +1 -0
  23. package/dist/__tests__/registry.test.js +289 -0
  24. package/dist/__tests__/registry.test.js.map +1 -0
  25. package/dist/__tests__/sandbox.test.d.ts +11 -0
  26. package/dist/__tests__/sandbox.test.d.ts.map +1 -0
  27. package/dist/__tests__/sandbox.test.js +257 -0
  28. package/dist/__tests__/sandbox.test.js.map +1 -0
  29. package/dist/__tests__/schemas.test.d.ts +7 -0
  30. package/dist/__tests__/schemas.test.d.ts.map +1 -0
  31. package/dist/__tests__/schemas.test.js +313 -0
  32. package/dist/__tests__/schemas.test.js.map +1 -0
  33. package/dist/benchmarks/run-benchmarks.d.ts +18 -0
  34. package/dist/benchmarks/run-benchmarks.d.ts.map +1 -0
  35. package/dist/benchmarks/run-benchmarks.js +245 -0
  36. package/dist/benchmarks/run-benchmarks.js.map +1 -0
  37. package/dist/handlers/tool-handler.d.ts +76 -0
  38. package/dist/handlers/tool-handler.d.ts.map +1 -0
  39. package/dist/handlers/tool-handler.js +522 -0
  40. package/dist/handlers/tool-handler.js.map +1 -0
  41. package/dist/index-v3.d.ts +18 -0
  42. package/dist/index-v3.d.ts.map +1 -0
  43. package/dist/index-v3.js +261 -0
  44. package/dist/index-v3.js.map +1 -0
  45. package/dist/lib/cache.d.ts +110 -0
  46. package/dist/lib/cache.d.ts.map +1 -0
  47. package/dist/lib/cache.js +273 -0
  48. package/dist/lib/cache.js.map +1 -0
  49. package/dist/lib/errors.d.ts +121 -0
  50. package/dist/lib/errors.d.ts.map +1 -0
  51. package/dist/lib/errors.js +254 -0
  52. package/dist/lib/errors.js.map +1 -0
  53. package/dist/lib/executor.d.ts +217 -0
  54. package/dist/lib/executor.d.ts.map +1 -0
  55. package/dist/lib/executor.js +676 -0
  56. package/dist/lib/executor.js.map +1 -0
  57. package/dist/lib/ids.d.ts +121 -0
  58. package/dist/lib/ids.d.ts.map +1 -0
  59. package/dist/lib/ids.js +192 -0
  60. package/dist/lib/ids.js.map +1 -0
  61. package/dist/lib/logger.d.ts +160 -0
  62. package/dist/lib/logger.d.ts.map +1 -0
  63. package/dist/lib/logger.js +268 -0
  64. package/dist/lib/logger.js.map +1 -0
  65. package/dist/lib/metrics.d.ts +146 -0
  66. package/dist/lib/metrics.d.ts.map +1 -0
  67. package/dist/lib/metrics.js +263 -0
  68. package/dist/lib/metrics.js.map +1 -0
  69. package/dist/lib/sandbox.d.ts +78 -0
  70. package/dist/lib/sandbox.d.ts.map +1 -0
  71. package/dist/lib/sandbox.js +277 -0
  72. package/dist/lib/sandbox.js.map +1 -0
  73. package/dist/lib/validator.d.ts +67 -0
  74. package/dist/lib/validator.d.ts.map +1 -0
  75. package/dist/lib/validator.js +178 -0
  76. package/dist/lib/validator.js.map +1 -0
  77. package/index-v1.js +698 -0
  78. package/index.js +1080 -1757
  79. package/index.old.js +4137 -0
  80. package/package.json +32 -7
  81. package/premium-tools.js +2 -2
  82. package/registry/tools.json +476 -0
  83. package/schemas/error-envelope.schema.json +125 -0
  84. package/schemas/finding.schema.json +167 -0
  85. package/schemas/report-artifact.schema.json +88 -0
  86. package/schemas/run-request.schema.json +75 -0
  87. package/schemas/verdict.schema.json +168 -0
  88. package/tier-auth.js +371 -183
  89. package/truth-context.js +90 -131
  90. package/truth-firewall-tools.js +1000 -1611
  91. package/vibecheck-tools.js +2 -2
  92. package/agent-firewall-interceptor.js +0 -500
  93. package/authority-tools.js +0 -569
  94. package/logger.js +0 -173
  95. package/tools-v3.js +0 -1039
  96. package/tools.js +0 -495
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Schema Validation Tests
3
+ *
4
+ * Ensures all canonical schemas are valid and work correctly.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=schemas.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../../__tests__/schemas.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Schema Validation Tests
3
+ *
4
+ * Ensures all canonical schemas are valid and work correctly.
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { validateRunRequest, validateFinding, validateVerdict, validateErrorEnvelope, validateToolInput, normalizeFindingId, validateProjectPath, } from '../lib/validator.js';
8
+ describe('Schema Validation', () => {
9
+ describe('RunRequest Schema', () => {
10
+ it('should validate a valid run request', () => {
11
+ const request = {
12
+ tool: 'vibecheck.scan',
13
+ projectPath: '/home/user/project',
14
+ timeout: 60000,
15
+ cache: { mode: 'auto', maxAge: 300 },
16
+ options: { profile: 'quick' },
17
+ };
18
+ const result = validateRunRequest(request);
19
+ expect(result.valid).toBe(true);
20
+ expect(result.errors).toBeUndefined();
21
+ });
22
+ it('should reject invalid tool name format', () => {
23
+ const request = {
24
+ tool: 'invalid-tool', // Should be vibecheck.xxx
25
+ projectPath: '/home/user/project',
26
+ };
27
+ const result = validateRunRequest(request);
28
+ expect(result.valid).toBe(false);
29
+ expect(result.errors).toBeDefined();
30
+ expect(result.errors?.some((e) => e.path.includes('tool'))).toBe(true);
31
+ });
32
+ it('should require projectPath', () => {
33
+ const request = {
34
+ tool: 'vibecheck.scan',
35
+ };
36
+ const result = validateRunRequest(request);
37
+ expect(result.valid).toBe(false);
38
+ });
39
+ it('should validate timeout bounds', () => {
40
+ const tooShort = {
41
+ tool: 'vibecheck.scan',
42
+ projectPath: '/home/user/project',
43
+ timeout: 500, // Below minimum (1000)
44
+ };
45
+ const tooLong = {
46
+ tool: 'vibecheck.scan',
47
+ projectPath: '/home/user/project',
48
+ timeout: 700000, // Above maximum (600000)
49
+ };
50
+ expect(validateRunRequest(tooShort).valid).toBe(false);
51
+ expect(validateRunRequest(tooLong).valid).toBe(false);
52
+ });
53
+ it('should validate cache mode enum', () => {
54
+ const valid = {
55
+ tool: 'vibecheck.scan',
56
+ projectPath: '/home/user/project',
57
+ cache: { mode: 'force' },
58
+ };
59
+ const invalid = {
60
+ tool: 'vibecheck.scan',
61
+ projectPath: '/home/user/project',
62
+ cache: { mode: 'invalid' },
63
+ };
64
+ expect(validateRunRequest(valid).valid).toBe(true);
65
+ expect(validateRunRequest(invalid).valid).toBe(false);
66
+ });
67
+ });
68
+ describe('Finding Schema', () => {
69
+ it('should validate a complete finding', () => {
70
+ const finding = {
71
+ id: 'auth_gap-a1b2c3d4',
72
+ category: 'auth_gap',
73
+ severity: 'BLOCK',
74
+ title: 'Unprotected API endpoint',
75
+ description: 'The /api/admin endpoint has no authentication',
76
+ evidence: [
77
+ {
78
+ file: 'src/routes/admin.ts',
79
+ line: 42,
80
+ snippet: 'router.get("/admin", handler)',
81
+ reason: 'No auth middleware',
82
+ },
83
+ ],
84
+ fixHints: ['Add withAuth middleware'],
85
+ confidence: 0.95,
86
+ source: 'static',
87
+ };
88
+ const result = validateFinding(finding);
89
+ expect(result.valid).toBe(true);
90
+ });
91
+ it('should require evidence array with at least one item', () => {
92
+ const finding = {
93
+ id: 'auth_gap-a1b2c3d4',
94
+ category: 'auth_gap',
95
+ severity: 'BLOCK',
96
+ title: 'Missing auth',
97
+ evidence: [], // Empty array
98
+ };
99
+ const result = validateFinding(finding);
100
+ expect(result.valid).toBe(false);
101
+ });
102
+ it('should validate severity enum', () => {
103
+ const valid = {
104
+ id: 'test-12345678',
105
+ category: 'secrets',
106
+ severity: 'WARN',
107
+ title: 'Test',
108
+ evidence: [{ file: 'test.ts' }],
109
+ };
110
+ const invalid = {
111
+ ...valid,
112
+ severity: 'CRITICAL', // Not in enum
113
+ };
114
+ expect(validateFinding(valid).valid).toBe(true);
115
+ expect(validateFinding(invalid).valid).toBe(false);
116
+ });
117
+ it('should validate category enum', () => {
118
+ const validCategories = ['secrets', 'auth_gap', 'billing_bypass', 'dead_ui', 'fake_success'];
119
+ for (const category of validCategories) {
120
+ const finding = {
121
+ id: `${category}-12345678`,
122
+ category,
123
+ severity: 'WARN',
124
+ title: 'Test',
125
+ evidence: [{ file: 'test.ts' }],
126
+ };
127
+ expect(validateFinding(finding).valid).toBe(true);
128
+ }
129
+ });
130
+ it('should validate finding ID format', () => {
131
+ const validIds = ['auth_gap-a1b2c3d4', 'secrets-12345678', 'dead_ui-abcdef12'];
132
+ const invalidIds = ['invalid', 'AUTH_GAP-123', 'auth_gap_123'];
133
+ for (const id of validIds) {
134
+ const finding = {
135
+ id,
136
+ category: 'secrets',
137
+ severity: 'WARN',
138
+ title: 'Test',
139
+ evidence: [{ file: 'test.ts' }],
140
+ };
141
+ expect(validateFinding(finding).valid).toBe(true);
142
+ }
143
+ for (const id of invalidIds) {
144
+ const finding = {
145
+ id,
146
+ category: 'secrets',
147
+ severity: 'WARN',
148
+ title: 'Test',
149
+ evidence: [{ file: 'test.ts' }],
150
+ };
151
+ expect(validateFinding(finding).valid).toBe(false);
152
+ }
153
+ });
154
+ });
155
+ describe('Verdict Schema', () => {
156
+ it('should validate a complete verdict', () => {
157
+ const verdict = {
158
+ verdict: 'SHIP',
159
+ score: 95,
160
+ grade: 'A',
161
+ summary: {
162
+ block: 0,
163
+ warn: 2,
164
+ info: 5,
165
+ total: 7,
166
+ },
167
+ findings: [],
168
+ meta: {
169
+ version: '3.0.0',
170
+ runId: 'run_abc123',
171
+ timestamp: '2024-01-15T10:30:00Z',
172
+ durationMs: 5000,
173
+ },
174
+ };
175
+ const result = validateVerdict(verdict);
176
+ expect(result.valid).toBe(true);
177
+ });
178
+ it('should validate verdict enum', () => {
179
+ const base = {
180
+ score: 50,
181
+ summary: { block: 0, warn: 0, info: 0, total: 0 },
182
+ findings: [],
183
+ meta: {
184
+ version: '3.0.0',
185
+ runId: 'run_123',
186
+ timestamp: '2024-01-15T10:30:00Z',
187
+ durationMs: 1000,
188
+ },
189
+ };
190
+ expect(validateVerdict({ ...base, verdict: 'SHIP' }).valid).toBe(true);
191
+ expect(validateVerdict({ ...base, verdict: 'WARN' }).valid).toBe(true);
192
+ expect(validateVerdict({ ...base, verdict: 'BLOCK' }).valid).toBe(true);
193
+ expect(validateVerdict({ ...base, verdict: 'MAYBE' }).valid).toBe(false);
194
+ });
195
+ it('should validate score bounds', () => {
196
+ const base = {
197
+ verdict: 'SHIP',
198
+ summary: { block: 0, warn: 0, info: 0, total: 0 },
199
+ findings: [],
200
+ meta: {
201
+ version: '3.0.0',
202
+ runId: 'run_123',
203
+ timestamp: '2024-01-15T10:30:00Z',
204
+ durationMs: 1000,
205
+ },
206
+ };
207
+ expect(validateVerdict({ ...base, score: 0 }).valid).toBe(true);
208
+ expect(validateVerdict({ ...base, score: 100 }).valid).toBe(true);
209
+ expect(validateVerdict({ ...base, score: -1 }).valid).toBe(false);
210
+ expect(validateVerdict({ ...base, score: 101 }).valid).toBe(false);
211
+ });
212
+ });
213
+ describe('ErrorEnvelope Schema', () => {
214
+ it('should validate a complete error envelope', () => {
215
+ const envelope = {
216
+ ok: false,
217
+ error: {
218
+ code: 'TIMEOUT',
219
+ message: 'Operation timed out after 60000ms',
220
+ retryable: true,
221
+ retryAfterMs: 5000,
222
+ userAction: 'Try again with a smaller scope',
223
+ },
224
+ requestId: 'req_abc123',
225
+ timestamp: '2024-01-15T10:30:00Z',
226
+ };
227
+ const result = validateErrorEnvelope(envelope);
228
+ expect(result.valid).toBe(true);
229
+ });
230
+ it('should require ok to be false', () => {
231
+ const envelope = {
232
+ ok: true, // Should be false
233
+ error: {
234
+ code: 'TIMEOUT',
235
+ message: 'Test',
236
+ },
237
+ requestId: 'req_123',
238
+ timestamp: '2024-01-15T10:30:00Z',
239
+ };
240
+ const result = validateErrorEnvelope(envelope);
241
+ expect(result.valid).toBe(false);
242
+ });
243
+ it('should validate error code enum', () => {
244
+ const validCodes = ['INVALID_INPUT', 'TIMEOUT', 'PATH_NOT_FOUND', 'TIER_REQUIRED'];
245
+ for (const code of validCodes) {
246
+ const envelope = {
247
+ ok: false,
248
+ error: { code, message: 'Test' },
249
+ requestId: 'req_123',
250
+ timestamp: '2024-01-15T10:30:00Z',
251
+ };
252
+ expect(validateErrorEnvelope(envelope).valid).toBe(true);
253
+ }
254
+ });
255
+ });
256
+ describe('Tool Input Validation', () => {
257
+ it('should validate vibecheck.scan input', () => {
258
+ const valid = { profile: 'quick' };
259
+ const invalid = { profile: 'invalid_profile' };
260
+ expect(validateToolInput('vibecheck.scan', valid).valid).toBe(true);
261
+ expect(validateToolInput('vibecheck.scan', invalid).valid).toBe(false);
262
+ });
263
+ it('should validate vibecheck.reality required fields', () => {
264
+ const valid = { url: 'http://localhost:3000' };
265
+ const invalid = {}; // Missing required url
266
+ expect(validateToolInput('vibecheck.reality', valid).valid).toBe(true);
267
+ expect(validateToolInput('vibecheck.reality', invalid).valid).toBe(false);
268
+ });
269
+ it('should return error for unknown tool', () => {
270
+ const result = validateToolInput('vibecheck.unknown_tool', {});
271
+ expect(result.valid).toBe(false);
272
+ expect(result.errors?.some((e) => e.message.includes('Unknown tool'))).toBe(true);
273
+ });
274
+ });
275
+ describe('Finding ID Normalization', () => {
276
+ it('should create deterministic IDs', () => {
277
+ const evidence = { file: 'src/api.ts', line: 42 };
278
+ const id1 = normalizeFindingId('auth_gap', evidence);
279
+ const id2 = normalizeFindingId('auth_gap', evidence);
280
+ expect(id1).toBe(id2);
281
+ expect(id1).toMatch(/^auth_gap-[a-f0-9]{8}$/);
282
+ });
283
+ it('should produce different IDs for different evidence', () => {
284
+ const id1 = normalizeFindingId('auth_gap', { file: 'a.ts', line: 1 });
285
+ const id2 = normalizeFindingId('auth_gap', { file: 'b.ts', line: 1 });
286
+ const id3 = normalizeFindingId('auth_gap', { file: 'a.ts', line: 2 });
287
+ expect(id1).not.toBe(id2);
288
+ expect(id1).not.toBe(id3);
289
+ expect(id2).not.toBe(id3);
290
+ });
291
+ });
292
+ describe('Project Path Validation', () => {
293
+ it('should accept valid paths within workspace', () => {
294
+ const result = validateProjectPath('/home/user/project', '/home/user');
295
+ expect(result.valid).toBe(true);
296
+ });
297
+ it('should reject path traversal', () => {
298
+ const result = validateProjectPath('/home/user/../etc/passwd', '/home/user');
299
+ expect(result.valid).toBe(false);
300
+ expect(result.error).toContain('traversal');
301
+ });
302
+ it('should reject paths outside workspace', () => {
303
+ const result = validateProjectPath('/etc/passwd', '/home/user');
304
+ expect(result.valid).toBe(false);
305
+ });
306
+ it('should normalize paths', () => {
307
+ const result = validateProjectPath('project//src///file.ts');
308
+ expect(result.valid).toBe(true);
309
+ expect(result.normalized).toBe('project/src/file.ts');
310
+ });
311
+ });
312
+ });
313
+ //# sourceMappingURL=schemas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../../__tests__/schemas.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * MCP Server Benchmarks
3
+ *
4
+ * Measures performance for core tools.
5
+ * Shows cache benefit and correctness.
6
+ *
7
+ * Usage:
8
+ * npx tsx benchmarks/run-benchmarks.ts [projectPath]
9
+ *
10
+ * TARGETS:
11
+ * - Warm runs 3-10x faster than cold
12
+ * - doctor warm <500ms (realistic <1.5s on Windows)
13
+ * - scan warm <3000ms
14
+ * - ship warm <2000ms
15
+ * - status warm <100ms
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=run-benchmarks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-benchmarks.d.ts","sourceRoot":"","sources":["../../benchmarks/run-benchmarks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * MCP Server Benchmarks
3
+ *
4
+ * Measures performance for core tools.
5
+ * Shows cache benefit and correctness.
6
+ *
7
+ * Usage:
8
+ * npx tsx benchmarks/run-benchmarks.ts [projectPath]
9
+ *
10
+ * TARGETS:
11
+ * - Warm runs 3-10x faster than cold
12
+ * - doctor warm <500ms (realistic <1.5s on Windows)
13
+ * - scan warm <3000ms
14
+ * - ship warm <2000ms
15
+ * - status warm <100ms
16
+ */
17
+ import { performance } from 'perf_hooks';
18
+ import { existsSync, mkdirSync, writeFileSync, rmSync } from 'fs';
19
+ import { join } from 'path';
20
+ import { tmpdir } from 'os';
21
+ import { handleTool } from '../handlers/tool-handler.js';
22
+ import { getGlobalCache, initGlobalCache } from '../lib/cache.js';
23
+ import { initLogger, LogLevel } from '../lib/logger.js';
24
+ import { getMetricsCollector, initMetricsCollector } from '../lib/metrics.js';
25
+ const TARGETS = {
26
+ doctor: { warmTarget: 500, coldTarget: 3000 },
27
+ scan: { warmTarget: 3000, coldTarget: 15000 },
28
+ ship: { warmTarget: 2000, coldTarget: 10000 },
29
+ status: { warmTarget: 100, coldTarget: 1000 },
30
+ };
31
+ /**
32
+ * Create test fixture if needed
33
+ */
34
+ function createTestFixture() {
35
+ const fixtureDir = join(tmpdir(), `vibecheck-bench-${Date.now()}`);
36
+ mkdirSync(fixtureDir, { recursive: true });
37
+ // Create minimal project structure
38
+ writeFileSync(join(fixtureDir, 'package.json'), JSON.stringify({
39
+ name: 'benchmark-fixture',
40
+ version: '1.0.0',
41
+ dependencies: { express: '^4.18.0' },
42
+ }));
43
+ mkdirSync(join(fixtureDir, 'src'));
44
+ writeFileSync(join(fixtureDir, 'src', 'index.ts'), `
45
+ import express from 'express';
46
+ const app = express();
47
+ app.get('/api/test', (req, res) => res.json({ ok: true }));
48
+ export default app;
49
+ `);
50
+ mkdirSync(join(fixtureDir, '.vibecheck'), { recursive: true });
51
+ return fixtureDir;
52
+ }
53
+ /**
54
+ * Run a single benchmark
55
+ */
56
+ async function runBenchmark(tool, projectPath, options) {
57
+ const cache = getGlobalCache();
58
+ // Clear cache for cold run
59
+ cache.clear();
60
+ // Cold run
61
+ const coldStart = performance.now();
62
+ let coldResult;
63
+ try {
64
+ coldResult = await handleTool({
65
+ tool: `vibecheck.${tool}`,
66
+ projectPath,
67
+ options,
68
+ cache: { mode: 'auto' },
69
+ });
70
+ }
71
+ catch (e) {
72
+ return {
73
+ tool,
74
+ coldRun: -1,
75
+ warmRun: -1,
76
+ cacheHit: false,
77
+ speedup: 0,
78
+ correct: false,
79
+ error: e.message,
80
+ };
81
+ }
82
+ const coldTime = performance.now() - coldStart;
83
+ // Verify cold run correctness
84
+ const coldCorrect = coldResult.ok ||
85
+ coldResult.error?.code !== 'INTERNAL_ERROR';
86
+ // Warm run (should hit cache)
87
+ const warmStart = performance.now();
88
+ const warmResult = await handleTool({
89
+ tool: `vibecheck.${tool}`,
90
+ projectPath,
91
+ options,
92
+ cache: { mode: 'auto' },
93
+ });
94
+ const warmTime = performance.now() - warmStart;
95
+ const cacheHit = warmResult.ok &&
96
+ warmResult.meta?.cached === true;
97
+ const speedup = coldTime / warmTime;
98
+ return {
99
+ tool,
100
+ coldRun: Math.round(coldTime),
101
+ warmRun: Math.round(warmTime),
102
+ cacheHit,
103
+ speedup: Math.round(speedup * 10) / 10,
104
+ correct: coldCorrect,
105
+ };
106
+ }
107
+ /**
108
+ * Print results table
109
+ */
110
+ function printResults(benchmarks) {
111
+ console.log('');
112
+ console.log('╔══════════════════════════════════════════════════════════════════════════╗');
113
+ console.log('║ RESULTS ║');
114
+ console.log('╠═══════════════════════╦═════════╦═════════╦═════════╦═════════╦══════════╣');
115
+ console.log('║ Tool ║ Cold ║ Warm ║ Speedup ║ Cache ║ Correct ║');
116
+ console.log('╠═══════════════════════╬═════════╬═════════╬═════════╬═════════╬══════════╣');
117
+ for (const result of benchmarks) {
118
+ const tool = result.tool.padEnd(19);
119
+ const cold = result.coldRun >= 0 ? `${result.coldRun}ms`.padStart(7) : 'ERROR ';
120
+ const warm = result.warmRun >= 0 ? `${result.warmRun}ms`.padStart(7) : 'ERROR ';
121
+ const speedup = result.speedup > 0 ? `${result.speedup}x`.padStart(7) : 'N/A ';
122
+ const cache = result.cacheHit ? ' ✓ ' : ' ✗ ';
123
+ const correct = result.correct ? ' ✓ ' : ' ✗ ';
124
+ console.log(`║ ${tool} ║ ${cold} ║ ${warm} ║ ${speedup} ║${cache}║${correct}║`);
125
+ }
126
+ console.log('╚═══════════════════════╩═════════╩═════════╩═════════╩═════════╩══════════╝');
127
+ }
128
+ /**
129
+ * Print target checks
130
+ */
131
+ function printTargetChecks(benchmarks) {
132
+ console.log('');
133
+ console.log('Target Checks:');
134
+ let allPassed = true;
135
+ for (const result of benchmarks) {
136
+ const targets = TARGETS[result.tool];
137
+ if (!targets)
138
+ continue;
139
+ const warmPass = result.warmRun >= 0 && result.warmRun <= targets.warmTarget;
140
+ const coldPass = result.coldRun >= 0 && result.coldRun <= targets.coldTarget;
141
+ console.log(` ${result.tool}:`);
142
+ console.log(` warm <${targets.warmTarget}ms: ${warmPass ? '✓ PASS' : '✗ FAIL'} (${result.warmRun}ms)`);
143
+ console.log(` cold <${targets.coldTarget}ms: ${coldPass ? '✓ PASS' : '✗ FAIL'} (${result.coldRun}ms)`);
144
+ if (!warmPass || !coldPass)
145
+ allPassed = false;
146
+ }
147
+ // Speedup check
148
+ const avgSpeedup = benchmarks.filter(b => b.speedup > 0).reduce((sum, b) => sum + b.speedup, 0) /
149
+ benchmarks.filter(b => b.speedup > 0).length || 0;
150
+ const speedupPass = avgSpeedup >= 3;
151
+ console.log(` Average speedup >=3x: ${speedupPass ? '✓ PASS' : '✗ FAIL'} (${avgSpeedup.toFixed(1)}x)`);
152
+ if (!speedupPass)
153
+ allPassed = false;
154
+ return;
155
+ }
156
+ /**
157
+ * Main benchmark runner
158
+ */
159
+ async function main() {
160
+ // Initialize logging (quiet for benchmarks)
161
+ initLogger({
162
+ level: LogLevel.ERROR,
163
+ enableConsole: false,
164
+ enableFile: false
165
+ });
166
+ // Initialize cache and metrics
167
+ initGlobalCache({ maxMemoryEntries: 100, defaultTtl: 300 });
168
+ initMetricsCollector({ maxEntries: 1000 });
169
+ // Get or create project path
170
+ let projectPath = process.argv[2];
171
+ let createdFixture = false;
172
+ if (!projectPath || !existsSync(projectPath)) {
173
+ console.log('No valid project path provided. Creating test fixture...');
174
+ projectPath = createTestFixture();
175
+ createdFixture = true;
176
+ }
177
+ console.log('╔══════════════════════════════════════════════════════════════╗');
178
+ console.log('║ Vibecheck MCP Server Benchmarks ║');
179
+ console.log('╠══════════════════════════════════════════════════════════════╣');
180
+ console.log(`║ Project: ${projectPath.slice(0, 50).padEnd(50)} ║`);
181
+ console.log('╚══════════════════════════════════════════════════════════════╝');
182
+ console.log('');
183
+ const benchmarks = [];
184
+ const toolsToTest = ['doctor', 'scan', 'ship', 'status'];
185
+ for (const tool of toolsToTest) {
186
+ console.log(`Running vibecheck.${tool}...`);
187
+ try {
188
+ const options = tool === 'scan' ? { profile: 'quick' } : undefined;
189
+ const result = await runBenchmark(tool, projectPath, options);
190
+ benchmarks.push(result);
191
+ if (result.error) {
192
+ console.log(` Warning: ${result.error}`);
193
+ }
194
+ }
195
+ catch (e) {
196
+ console.log(` Error: ${e}`);
197
+ benchmarks.push({
198
+ tool,
199
+ coldRun: -1,
200
+ warmRun: -1,
201
+ cacheHit: false,
202
+ speedup: 0,
203
+ correct: false,
204
+ error: e.message,
205
+ });
206
+ }
207
+ }
208
+ // Print results
209
+ printResults(benchmarks);
210
+ // Summary
211
+ console.log('');
212
+ console.log('Summary:');
213
+ const successful = benchmarks.filter(b => b.correct);
214
+ const withCache = benchmarks.filter(b => b.cacheHit);
215
+ const avgSpeedup = successful.filter(b => b.speedup > 0).reduce((sum, b) => sum + b.speedup, 0) /
216
+ successful.filter(b => b.speedup > 0).length || 0;
217
+ console.log(` Tools tested: ${benchmarks.length}`);
218
+ console.log(` Successful: ${successful.length}/${benchmarks.length}`);
219
+ console.log(` Cache hits: ${withCache.length}/${benchmarks.length}`);
220
+ console.log(` Avg speedup: ${avgSpeedup.toFixed(1)}x`);
221
+ // Target checks
222
+ printTargetChecks(benchmarks);
223
+ // Metrics summary
224
+ const metrics = getMetricsCollector();
225
+ const summary = metrics.getSummary();
226
+ console.log('');
227
+ console.log('Metrics:');
228
+ console.log(` Cache hit rate: ${(summary.cacheHitRate * 100).toFixed(1)}%`);
229
+ // Cleanup fixture if we created it
230
+ if (createdFixture) {
231
+ console.log('');
232
+ console.log('Cleaning up test fixture...');
233
+ rmSync(projectPath, { recursive: true, force: true });
234
+ }
235
+ // Exit code based on results
236
+ const allPassed = successful.length === benchmarks.length &&
237
+ withCache.length >= Math.floor(benchmarks.length / 2) &&
238
+ avgSpeedup >= 2;
239
+ process.exit(allPassed ? 0 : 1);
240
+ }
241
+ main().catch(err => {
242
+ console.error('Benchmark failed:', err);
243
+ process.exit(1);
244
+ });
245
+ //# sourceMappingURL=run-benchmarks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-benchmarks.js","sourceRoot":"","sources":["../../benchmarks/run-benchmarks.ts"],"names":[],"mappings":"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"}