@vibecheckai/cli 3.9.1 → 4.0.0
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/README.md +1 -1
- package/bin/runners/context/generators/cursor-enhanced.js +99 -13
- package/mcp-server/.eslintrc.json +24 -0
- package/mcp-server/README.md +425 -135
- package/mcp-server/SPEC.md +583 -0
- package/mcp-server/configs/README.md +172 -0
- package/mcp-server/configs/claude-desktop-pro.json +31 -0
- package/mcp-server/configs/claude-desktop-with-workspace.json +25 -0
- package/mcp-server/configs/claude-desktop.json +19 -0
- package/mcp-server/configs/cursor-mcp.json +21 -0
- package/mcp-server/configs/windsurf-mcp.json +17 -0
- package/mcp-server/mcp-config.example.json +9 -0
- package/mcp-server/package.json +49 -34
- package/mcp-server/src/cli.ts +185 -0
- package/mcp-server/src/index.ts +85 -0
- package/mcp-server/src/server.ts +1933 -0
- package/mcp-server/src/services/cache-service.ts +466 -0
- package/mcp-server/src/services/cli-service.ts +345 -0
- package/mcp-server/src/services/context-manager.ts +717 -0
- package/mcp-server/src/services/firewall-service.ts +662 -0
- package/mcp-server/src/services/git-service.ts +671 -0
- package/mcp-server/src/services/index.ts +52 -0
- package/mcp-server/src/services/prompt-builder-service.ts +1031 -0
- package/mcp-server/src/services/session-service.ts +550 -0
- package/mcp-server/src/services/tier-service.ts +470 -0
- package/mcp-server/src/types.ts +351 -0
- package/mcp-server/tsconfig.json +16 -27
- package/package.json +6 -6
- package/mcp-server/.guardrail/audit/audit.log.jsonl +0 -2
- package/mcp-server/.specs/architecture.mdc +0 -90
- package/mcp-server/.specs/security.mdc +0 -30
- package/mcp-server/HARDENING_SUMMARY.md +0 -299
- package/mcp-server/agent-checkpoint.js +0 -364
- package/mcp-server/agent-firewall-interceptor.js +0 -500
- package/mcp-server/architect-tools.js +0 -707
- package/mcp-server/audit-mcp.js +0 -206
- package/mcp-server/authority-tools.js +0 -569
- package/mcp-server/codebase-architect-tools.js +0 -838
- package/mcp-server/conductor/conflict-resolver.js +0 -588
- package/mcp-server/conductor/execution-planner.js +0 -544
- package/mcp-server/conductor/index.js +0 -377
- package/mcp-server/conductor/lock-manager.js +0 -615
- package/mcp-server/conductor/request-queue.js +0 -550
- package/mcp-server/conductor/session-manager.js +0 -500
- package/mcp-server/conductor/tools.js +0 -510
- package/mcp-server/consolidated-tools.js +0 -1170
- package/mcp-server/deprecation-middleware.js +0 -282
- package/mcp-server/handlers/index.ts +0 -15
- package/mcp-server/handlers/tool-handler.ts +0 -593
- package/mcp-server/hygiene-tools.js +0 -428
- package/mcp-server/index-v1.js +0 -698
- package/mcp-server/index.js +0 -2940
- package/mcp-server/intelligence-tools.js +0 -664
- package/mcp-server/intent-drift-tools.js +0 -873
- package/mcp-server/intent-firewall-interceptor.js +0 -529
- package/mcp-server/lib/api-client.cjs +0 -13
- package/mcp-server/lib/cache-wrapper.cjs +0 -383
- package/mcp-server/lib/error-envelope.js +0 -138
- package/mcp-server/lib/executor.ts +0 -499
- package/mcp-server/lib/index.ts +0 -29
- package/mcp-server/lib/logger.cjs +0 -30
- package/mcp-server/lib/rate-limiter.js +0 -166
- package/mcp-server/lib/sandbox.test.ts +0 -519
- package/mcp-server/lib/sandbox.ts +0 -395
- package/mcp-server/lib/types.ts +0 -267
- package/mcp-server/logger.js +0 -173
- package/mcp-server/manifest.json +0 -473
- package/mcp-server/mdc-generator.js +0 -298
- package/mcp-server/premium-tools.js +0 -1275
- package/mcp-server/proof-tools.js +0 -571
- package/mcp-server/registry/tool-registry.js +0 -586
- package/mcp-server/registry/tools.json +0 -619
- package/mcp-server/registry.test.ts +0 -340
- package/mcp-server/test-mcp.js +0 -108
- package/mcp-server/test-tools.js +0 -36
- package/mcp-server/tests/tier-gating.test.js +0 -297
- package/mcp-server/tier-auth.js +0 -767
- package/mcp-server/tools/index.js +0 -72
- package/mcp-server/tools-reorganized.ts +0 -244
- package/mcp-server/tools-v3.js +0 -1004
- package/mcp-server/truth-context.js +0 -622
- package/mcp-server/truth-firewall-tools.js +0 -2183
- package/mcp-server/vibecheck-2.0-tools.js +0 -761
- package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
- package/mcp-server/vibecheck-tools.js +0 -1075
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Tier Gating Tests
|
|
3
|
-
*
|
|
4
|
-
* Verifies that:
|
|
5
|
-
* - FREE tier can run: scan, ctx, verify, report, status, doctor
|
|
6
|
-
* - FREE tier CANNOT run: prove, fix, ship, gate, badge
|
|
7
|
-
* - Option-level gates work (e.g., scan --autofix requires PRO)
|
|
8
|
-
* - Error responses use proper ErrorEnvelope format
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
12
|
-
import {
|
|
13
|
-
FREE_TOOLS,
|
|
14
|
-
PRO_TOOLS,
|
|
15
|
-
OPTION_GATES,
|
|
16
|
-
getMcpToolAccess,
|
|
17
|
-
checkOptionAccess,
|
|
18
|
-
canAccessTool,
|
|
19
|
-
isPro,
|
|
20
|
-
getFirewallMode,
|
|
21
|
-
ERROR_CODES,
|
|
22
|
-
notEntitledError,
|
|
23
|
-
optionNotEntitledError,
|
|
24
|
-
} from '../tier-auth.js';
|
|
25
|
-
|
|
26
|
-
// Mock fetch for API calls
|
|
27
|
-
global.fetch = vi.fn();
|
|
28
|
-
|
|
29
|
-
describe('Tier System - Basic Access', () => {
|
|
30
|
-
beforeEach(() => {
|
|
31
|
-
vi.resetAllMocks();
|
|
32
|
-
// Reset any cached tier state
|
|
33
|
-
delete process.env.VIBECHECK_DEV_PRO;
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
describe('FREE tier access', () => {
|
|
37
|
-
it('FREE can access vibecheck.scan', () => {
|
|
38
|
-
expect(canAccessTool('free', 'vibecheck.scan')).toBe(true);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it('FREE can access vibecheck.ctx', () => {
|
|
42
|
-
expect(canAccessTool('free', 'vibecheck.ctx')).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('FREE can access vibecheck.verify', () => {
|
|
46
|
-
expect(canAccessTool('free', 'vibecheck.verify')).toBe(true);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('FREE can access vibecheck.report', () => {
|
|
50
|
-
expect(canAccessTool('free', 'vibecheck.report')).toBe(true);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('FREE can access vibecheck.status', () => {
|
|
54
|
-
expect(canAccessTool('free', 'vibecheck.status')).toBe(true);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('FREE can access vibecheck.doctor', () => {
|
|
58
|
-
expect(canAccessTool('free', 'vibecheck.doctor')).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('FREE can access vibecheck.firewall (observe mode)', () => {
|
|
62
|
-
expect(canAccessTool('free', 'vibecheck.firewall')).toBe(true);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('FREE can access authority.list', () => {
|
|
66
|
-
expect(canAccessTool('free', 'authority.list')).toBe(true);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('FREE can access authority.classify', () => {
|
|
70
|
-
expect(canAccessTool('free', 'authority.classify')).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('FREE can access vibecheck_conductor_status', () => {
|
|
74
|
-
expect(canAccessTool('free', 'vibecheck_conductor_status')).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
describe('FREE tier denied access', () => {
|
|
79
|
-
it('FREE CANNOT access vibecheck.prove', () => {
|
|
80
|
-
expect(canAccessTool('free', 'vibecheck.prove')).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('FREE CANNOT access vibecheck.fix', () => {
|
|
84
|
-
expect(canAccessTool('free', 'vibecheck.fix')).toBe(false);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('FREE CANNOT access vibecheck.ship', () => {
|
|
88
|
-
expect(canAccessTool('free', 'vibecheck.ship')).toBe(false);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it('FREE CANNOT access vibecheck.gate', () => {
|
|
92
|
-
expect(canAccessTool('free', 'vibecheck.gate')).toBe(false);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('FREE CANNOT access vibecheck.badge', () => {
|
|
96
|
-
expect(canAccessTool('free', 'vibecheck.badge')).toBe(false);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('FREE CANNOT access vibecheck.reality', () => {
|
|
100
|
-
expect(canAccessTool('free', 'vibecheck.reality')).toBe(false);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('FREE CANNOT access vibecheck.share', () => {
|
|
104
|
-
expect(canAccessTool('free', 'vibecheck.share')).toBe(false);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('FREE CANNOT access authority.approve', () => {
|
|
108
|
-
expect(canAccessTool('free', 'authority.approve')).toBe(false);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('FREE CANNOT access vibecheck_conductor_register', () => {
|
|
112
|
-
expect(canAccessTool('free', 'vibecheck_conductor_register')).toBe(false);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it('FREE CANNOT access vibecheck_agent_firewall_intercept', () => {
|
|
116
|
-
expect(canAccessTool('free', 'vibecheck_agent_firewall_intercept')).toBe(false);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
describe('PRO tier access', () => {
|
|
121
|
-
it('PRO can access all FREE tools', () => {
|
|
122
|
-
for (const tool of FREE_TOOLS) {
|
|
123
|
-
expect(canAccessTool('pro', tool)).toBe(true);
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('PRO can access all PRO tools', () => {
|
|
128
|
-
for (const tool of PRO_TOOLS) {
|
|
129
|
-
expect(canAccessTool('pro', tool)).toBe(true);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
describe('Option-Level Gates', () => {
|
|
136
|
-
describe('vibecheck.scan options', () => {
|
|
137
|
-
it('FREE can use scan without autofix', () => {
|
|
138
|
-
const result = checkOptionAccess('free', 'vibecheck.scan', {});
|
|
139
|
-
expect(result.allowed).toBe(true);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('FREE CANNOT use scan --autofix', () => {
|
|
143
|
-
const result = checkOptionAccess('free', 'vibecheck.scan', { autofix: true });
|
|
144
|
-
expect(result.allowed).toBe(false);
|
|
145
|
-
expect(result.blockedOption).toBe('autofix');
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('FREE CANNOT use scan --fix', () => {
|
|
149
|
-
const result = checkOptionAccess('free', 'vibecheck.scan', { fix: true });
|
|
150
|
-
expect(result.allowed).toBe(false);
|
|
151
|
-
expect(result.blockedOption).toBe('fix');
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('PRO can use scan --autofix', () => {
|
|
155
|
-
const result = checkOptionAccess('pro', 'vibecheck.scan', { autofix: true });
|
|
156
|
-
expect(result.allowed).toBe(true);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
describe('vibecheck.firewall options', () => {
|
|
161
|
-
it('FREE can use firewall observe mode', () => {
|
|
162
|
-
const result = checkOptionAccess('free', 'vibecheck.firewall', { mode: 'observe' });
|
|
163
|
-
expect(result.allowed).toBe(true);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it('FREE CANNOT use firewall enforce mode', () => {
|
|
167
|
-
const result = checkOptionAccess('free', 'vibecheck.firewall', { mode: 'enforce' });
|
|
168
|
-
expect(result.allowed).toBe(false);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('PRO can use firewall enforce mode', () => {
|
|
172
|
-
const result = checkOptionAccess('pro', 'vibecheck.firewall', { mode: 'enforce' });
|
|
173
|
-
expect(result.allowed).toBe(true);
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
describe('ErrorEnvelope Format', () => {
|
|
179
|
-
it('notEntitledError returns proper ErrorEnvelope', () => {
|
|
180
|
-
const error = notEntitledError('vibecheck.prove', 'free', 'pro');
|
|
181
|
-
|
|
182
|
-
expect(error.code).toBe('NOT_ENTITLED');
|
|
183
|
-
expect(error.message).toBe('Requires PRO');
|
|
184
|
-
expect(error.userAction).toBe('Open billing');
|
|
185
|
-
expect(error.retryable).toBe(false);
|
|
186
|
-
expect(error.tier).toBe('free');
|
|
187
|
-
expect(error.required).toBe('pro');
|
|
188
|
-
expect(error.tool).toBe('vibecheck.prove');
|
|
189
|
-
expect(error.upgradeUrl).toBe('https://vibecheckai.dev/pricing');
|
|
190
|
-
expect(error.nextSteps).toBeInstanceOf(Array);
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('optionNotEntitledError returns proper ErrorEnvelope', () => {
|
|
194
|
-
const error = optionNotEntitledError('vibecheck.scan', 'autofix', 'free', 'pro');
|
|
195
|
-
|
|
196
|
-
expect(error.code).toBe('OPTION_NOT_ENTITLED');
|
|
197
|
-
expect(error.message).toContain('--autofix');
|
|
198
|
-
expect(error.userAction).toBe('Open billing');
|
|
199
|
-
expect(error.retryable).toBe(false);
|
|
200
|
-
expect(error.option).toBe('autofix');
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
describe('getMcpToolAccess', () => {
|
|
205
|
-
beforeEach(() => {
|
|
206
|
-
vi.resetAllMocks();
|
|
207
|
-
delete process.env.VIBECHECK_DEV_PRO;
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it('returns hasAccess=true for FREE tool without API key', async () => {
|
|
211
|
-
const result = await getMcpToolAccess('vibecheck.scan', null, {});
|
|
212
|
-
|
|
213
|
-
expect(result.hasAccess).toBe(true);
|
|
214
|
-
expect(result.tier).toBe('free');
|
|
215
|
-
expect(result.firewallMode).toBe('observe');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it('returns hasAccess=false for PRO tool without API key', async () => {
|
|
219
|
-
const result = await getMcpToolAccess('vibecheck.prove', null, {});
|
|
220
|
-
|
|
221
|
-
expect(result.hasAccess).toBe(false);
|
|
222
|
-
expect(result.error).toBeDefined();
|
|
223
|
-
expect(result.error.code).toBe('NOT_ENTITLED');
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('returns hasAccess=false for FREE tool with PRO option', async () => {
|
|
227
|
-
const result = await getMcpToolAccess('vibecheck.scan', null, { autofix: true });
|
|
228
|
-
|
|
229
|
-
expect(result.hasAccess).toBe(false);
|
|
230
|
-
expect(result.error.code).toBe('OPTION_NOT_ENTITLED');
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
describe('Firewall Mode', () => {
|
|
235
|
-
it('FREE tier gets observe mode', () => {
|
|
236
|
-
expect(getFirewallMode('free')).toBe('observe');
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
it('PRO tier gets enforce mode', () => {
|
|
240
|
-
expect(getFirewallMode('pro')).toBe('enforce');
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
describe('Developer Mode Bypass', () => {
|
|
245
|
-
it('VIBECHECK_DEV_PRO=1 grants PRO access', () => {
|
|
246
|
-
process.env.VIBECHECK_DEV_PRO = '1';
|
|
247
|
-
|
|
248
|
-
expect(isPro('free')).toBe(true);
|
|
249
|
-
expect(canAccessTool('free', 'vibecheck.prove')).toBe(true);
|
|
250
|
-
expect(getFirewallMode('free')).toBe('enforce');
|
|
251
|
-
|
|
252
|
-
delete process.env.VIBECHECK_DEV_PRO;
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
describe('Tool Lists Completeness', () => {
|
|
257
|
-
it('FREE_TOOLS includes all expected tools', () => {
|
|
258
|
-
const expectedFreeTools = [
|
|
259
|
-
'vibecheck.scan',
|
|
260
|
-
'vibecheck.ctx',
|
|
261
|
-
'vibecheck.verify',
|
|
262
|
-
'vibecheck.report',
|
|
263
|
-
'vibecheck.status',
|
|
264
|
-
'vibecheck.doctor',
|
|
265
|
-
'vibecheck.firewall',
|
|
266
|
-
'authority.list',
|
|
267
|
-
'authority.classify',
|
|
268
|
-
'vibecheck_conductor_status',
|
|
269
|
-
];
|
|
270
|
-
|
|
271
|
-
for (const tool of expectedFreeTools) {
|
|
272
|
-
expect(FREE_TOOLS).toContain(tool);
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
it('PRO_TOOLS includes all expected tools', () => {
|
|
277
|
-
const expectedProTools = [
|
|
278
|
-
'vibecheck.ship',
|
|
279
|
-
'vibecheck.fix',
|
|
280
|
-
'vibecheck.prove',
|
|
281
|
-
'vibecheck.gate',
|
|
282
|
-
'vibecheck.badge',
|
|
283
|
-
'vibecheck.reality',
|
|
284
|
-
'vibecheck.share',
|
|
285
|
-
'authority.approve',
|
|
286
|
-
];
|
|
287
|
-
|
|
288
|
-
for (const tool of expectedProTools) {
|
|
289
|
-
expect(PRO_TOOLS).toContain(tool);
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
it('No tool is in both FREE and PRO lists', () => {
|
|
294
|
-
const overlap = FREE_TOOLS.filter(t => PRO_TOOLS.includes(t));
|
|
295
|
-
expect(overlap).toHaveLength(0);
|
|
296
|
-
});
|
|
297
|
-
});
|