@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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/bin/runners/context/generators/cursor-enhanced.js +99 -13
  3. package/mcp-server/.eslintrc.json +24 -0
  4. package/mcp-server/README.md +425 -135
  5. package/mcp-server/SPEC.md +583 -0
  6. package/mcp-server/configs/README.md +172 -0
  7. package/mcp-server/configs/claude-desktop-pro.json +31 -0
  8. package/mcp-server/configs/claude-desktop-with-workspace.json +25 -0
  9. package/mcp-server/configs/claude-desktop.json +19 -0
  10. package/mcp-server/configs/cursor-mcp.json +21 -0
  11. package/mcp-server/configs/windsurf-mcp.json +17 -0
  12. package/mcp-server/mcp-config.example.json +9 -0
  13. package/mcp-server/package.json +49 -34
  14. package/mcp-server/src/cli.ts +185 -0
  15. package/mcp-server/src/index.ts +85 -0
  16. package/mcp-server/src/server.ts +1933 -0
  17. package/mcp-server/src/services/cache-service.ts +466 -0
  18. package/mcp-server/src/services/cli-service.ts +345 -0
  19. package/mcp-server/src/services/context-manager.ts +717 -0
  20. package/mcp-server/src/services/firewall-service.ts +662 -0
  21. package/mcp-server/src/services/git-service.ts +671 -0
  22. package/mcp-server/src/services/index.ts +52 -0
  23. package/mcp-server/src/services/prompt-builder-service.ts +1031 -0
  24. package/mcp-server/src/services/session-service.ts +550 -0
  25. package/mcp-server/src/services/tier-service.ts +470 -0
  26. package/mcp-server/src/types.ts +351 -0
  27. package/mcp-server/tsconfig.json +16 -27
  28. package/package.json +6 -6
  29. package/mcp-server/.guardrail/audit/audit.log.jsonl +0 -2
  30. package/mcp-server/.specs/architecture.mdc +0 -90
  31. package/mcp-server/.specs/security.mdc +0 -30
  32. package/mcp-server/HARDENING_SUMMARY.md +0 -299
  33. package/mcp-server/agent-checkpoint.js +0 -364
  34. package/mcp-server/agent-firewall-interceptor.js +0 -500
  35. package/mcp-server/architect-tools.js +0 -707
  36. package/mcp-server/audit-mcp.js +0 -206
  37. package/mcp-server/authority-tools.js +0 -569
  38. package/mcp-server/codebase-architect-tools.js +0 -838
  39. package/mcp-server/conductor/conflict-resolver.js +0 -588
  40. package/mcp-server/conductor/execution-planner.js +0 -544
  41. package/mcp-server/conductor/index.js +0 -377
  42. package/mcp-server/conductor/lock-manager.js +0 -615
  43. package/mcp-server/conductor/request-queue.js +0 -550
  44. package/mcp-server/conductor/session-manager.js +0 -500
  45. package/mcp-server/conductor/tools.js +0 -510
  46. package/mcp-server/consolidated-tools.js +0 -1170
  47. package/mcp-server/deprecation-middleware.js +0 -282
  48. package/mcp-server/handlers/index.ts +0 -15
  49. package/mcp-server/handlers/tool-handler.ts +0 -593
  50. package/mcp-server/hygiene-tools.js +0 -428
  51. package/mcp-server/index-v1.js +0 -698
  52. package/mcp-server/index.js +0 -2940
  53. package/mcp-server/intelligence-tools.js +0 -664
  54. package/mcp-server/intent-drift-tools.js +0 -873
  55. package/mcp-server/intent-firewall-interceptor.js +0 -529
  56. package/mcp-server/lib/api-client.cjs +0 -13
  57. package/mcp-server/lib/cache-wrapper.cjs +0 -383
  58. package/mcp-server/lib/error-envelope.js +0 -138
  59. package/mcp-server/lib/executor.ts +0 -499
  60. package/mcp-server/lib/index.ts +0 -29
  61. package/mcp-server/lib/logger.cjs +0 -30
  62. package/mcp-server/lib/rate-limiter.js +0 -166
  63. package/mcp-server/lib/sandbox.test.ts +0 -519
  64. package/mcp-server/lib/sandbox.ts +0 -395
  65. package/mcp-server/lib/types.ts +0 -267
  66. package/mcp-server/logger.js +0 -173
  67. package/mcp-server/manifest.json +0 -473
  68. package/mcp-server/mdc-generator.js +0 -298
  69. package/mcp-server/premium-tools.js +0 -1275
  70. package/mcp-server/proof-tools.js +0 -571
  71. package/mcp-server/registry/tool-registry.js +0 -586
  72. package/mcp-server/registry/tools.json +0 -619
  73. package/mcp-server/registry.test.ts +0 -340
  74. package/mcp-server/test-mcp.js +0 -108
  75. package/mcp-server/test-tools.js +0 -36
  76. package/mcp-server/tests/tier-gating.test.js +0 -297
  77. package/mcp-server/tier-auth.js +0 -767
  78. package/mcp-server/tools/index.js +0 -72
  79. package/mcp-server/tools-reorganized.ts +0 -244
  80. package/mcp-server/tools-v3.js +0 -1004
  81. package/mcp-server/truth-context.js +0 -622
  82. package/mcp-server/truth-firewall-tools.js +0 -2183
  83. package/mcp-server/vibecheck-2.0-tools.js +0 -761
  84. package/mcp-server/vibecheck-mcp-server-3.2.0.tgz +0 -0
  85. 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
- });