@vibescope/mcp-server 0.2.4 → 0.2.5

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 (84) hide show
  1. package/CHANGELOG.md +84 -84
  2. package/README.md +194 -181
  3. package/dist/cli.d.ts +6 -3
  4. package/dist/cli.js +28 -10
  5. package/dist/handlers/tool-docs.js +828 -828
  6. package/dist/index.js +73 -73
  7. package/dist/knowledge.d.ts +6 -0
  8. package/dist/knowledge.js +218 -0
  9. package/dist/setup.d.ts +22 -0
  10. package/dist/setup.js +313 -0
  11. package/dist/templates/agent-guidelines.js +185 -185
  12. package/dist/tools.js +65 -65
  13. package/dist/utils.js +11 -11
  14. package/docs/TOOLS.md +2053 -2053
  15. package/package.json +1 -1
  16. package/scripts/generate-docs.ts +212 -212
  17. package/scripts/version-bump.ts +203 -203
  18. package/src/api-client.test.ts +723 -723
  19. package/src/api-client.ts +2499 -2499
  20. package/src/cli.ts +27 -10
  21. package/src/handlers/__test-setup__.ts +236 -236
  22. package/src/handlers/__test-utils__.ts +87 -87
  23. package/src/handlers/blockers.test.ts +468 -468
  24. package/src/handlers/blockers.ts +163 -163
  25. package/src/handlers/bodies-of-work.test.ts +704 -704
  26. package/src/handlers/bodies-of-work.ts +526 -526
  27. package/src/handlers/connectors.test.ts +834 -834
  28. package/src/handlers/connectors.ts +229 -229
  29. package/src/handlers/cost.test.ts +462 -462
  30. package/src/handlers/cost.ts +285 -285
  31. package/src/handlers/decisions.test.ts +382 -382
  32. package/src/handlers/decisions.ts +153 -153
  33. package/src/handlers/deployment.test.ts +551 -551
  34. package/src/handlers/deployment.ts +541 -541
  35. package/src/handlers/discovery.test.ts +206 -206
  36. package/src/handlers/discovery.ts +390 -390
  37. package/src/handlers/fallback.test.ts +537 -537
  38. package/src/handlers/fallback.ts +194 -194
  39. package/src/handlers/file-checkouts.test.ts +750 -750
  40. package/src/handlers/file-checkouts.ts +185 -185
  41. package/src/handlers/findings.test.ts +633 -633
  42. package/src/handlers/findings.ts +239 -239
  43. package/src/handlers/git-issues.test.ts +631 -631
  44. package/src/handlers/git-issues.ts +136 -136
  45. package/src/handlers/ideas.test.ts +644 -644
  46. package/src/handlers/ideas.ts +207 -207
  47. package/src/handlers/index.ts +84 -84
  48. package/src/handlers/milestones.test.ts +475 -475
  49. package/src/handlers/milestones.ts +180 -180
  50. package/src/handlers/organizations.test.ts +826 -826
  51. package/src/handlers/organizations.ts +315 -315
  52. package/src/handlers/progress.test.ts +269 -269
  53. package/src/handlers/progress.ts +77 -77
  54. package/src/handlers/project.test.ts +546 -546
  55. package/src/handlers/project.ts +239 -239
  56. package/src/handlers/requests.test.ts +303 -303
  57. package/src/handlers/requests.ts +99 -99
  58. package/src/handlers/roles.test.ts +303 -303
  59. package/src/handlers/roles.ts +226 -226
  60. package/src/handlers/session.test.ts +875 -875
  61. package/src/handlers/session.ts +738 -738
  62. package/src/handlers/sprints.test.ts +732 -732
  63. package/src/handlers/sprints.ts +537 -537
  64. package/src/handlers/tasks.test.ts +907 -907
  65. package/src/handlers/tasks.ts +945 -945
  66. package/src/handlers/tool-categories.test.ts +66 -66
  67. package/src/handlers/tool-docs.ts +1096 -1096
  68. package/src/handlers/types.test.ts +259 -259
  69. package/src/handlers/types.ts +175 -175
  70. package/src/handlers/validation.test.ts +582 -582
  71. package/src/handlers/validation.ts +97 -97
  72. package/src/index.ts +792 -792
  73. package/src/setup.test.ts +231 -0
  74. package/src/setup.ts +370 -0
  75. package/src/templates/agent-guidelines.ts +210 -210
  76. package/src/token-tracking.test.ts +453 -453
  77. package/src/token-tracking.ts +164 -164
  78. package/src/tools.ts +3562 -3562
  79. package/src/utils.test.ts +683 -683
  80. package/src/utils.ts +436 -436
  81. package/src/validators.test.ts +223 -223
  82. package/src/validators.ts +249 -249
  83. package/tsconfig.json +16 -16
  84. package/vitest.config.ts +14 -14
package/src/cli.ts CHANGED
@@ -1,16 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Vibescope CLI - Enforcement verification tool
4
+ * Vibescope CLI - Setup wizard and enforcement verification tool
5
5
  *
6
- * Used by Claude Code Stop hook to verify agent compliance with Vibescope tracking.
7
- * Exit codes:
6
+ * Commands:
7
+ * setup - Interactive wizard to configure Vibescope for your IDE
8
+ * verify - Check agent compliance with Vibescope tracking (used by hooks)
9
+ *
10
+ * Exit codes (for verify command):
8
11
  * 0 = Compliant (allow exit)
9
12
  * 1 = Non-compliant (block exit, loop back)
10
13
  * 2 = Error (allow exit with warning)
11
14
  */
12
15
 
13
16
  import { execSync } from 'child_process';
17
+ import { runSetup } from './setup.js';
14
18
 
15
19
  // ============================================================================
16
20
  // Types
@@ -128,7 +132,11 @@ async function main() {
128
132
  const args = process.argv.slice(2);
129
133
  const command = args[0];
130
134
 
131
- if (command === 'verify') {
135
+ if (command === 'setup') {
136
+ // Run interactive setup wizard
137
+ await runSetup();
138
+ process.exit(0);
139
+ } else if (command === 'verify') {
132
140
  // Parse --git-url and --project-id flags
133
141
  let gitUrl: string | undefined;
134
142
  let projectId: string | undefined;
@@ -154,27 +162,36 @@ async function main() {
154
162
  }
155
163
  } else if (command === 'help' || command === '--help' || command === '-h') {
156
164
  console.log(`
157
- Vibescope CLI - Enforcement verification tool
165
+ Vibescope CLI - Setup wizard and enforcement verification tool
158
166
 
159
167
  Usage:
160
- vibescope-cli verify [options] Check Vibescope compliance before exit
168
+ vibescope-cli setup Interactive setup wizard for your IDE
169
+ vibescope-cli verify [options] Check Vibescope compliance before exit
170
+
171
+ Setup:
172
+ Configures Vibescope MCP integration for:
173
+ - Claude Code (CLI)
174
+ - Claude Desktop
175
+ - Cursor
176
+ - Gemini CLI
161
177
 
162
- Options:
178
+ Verify Options:
163
179
  --git-url <url> Git repository URL (auto-detected if not provided)
164
180
  --project-id <id> Vibescope project UUID
165
181
 
166
- Exit Codes:
182
+ Exit Codes (verify):
167
183
  0 Compliant - agent can exit
168
184
  1 Non-compliant - agent should continue work
169
185
  2 Error - allow exit with warning
170
186
 
171
187
  Environment Variables:
172
- VIBESCOPE_API_KEY Required - Your Vibescope API key
188
+ VIBESCOPE_API_KEY Required for verify - Your Vibescope API key
173
189
  VIBESCOPE_API_URL Optional - API URL (default: https://vibescope.dev)
174
190
  `);
175
191
  process.exit(0);
176
192
  } else {
177
- console.error('Usage: vibescope-cli verify [--git-url <url>] [--project-id <id>]');
193
+ console.error('Usage: vibescope-cli setup');
194
+ console.error(' vibescope-cli verify [--git-url <url>] [--project-id <id>]');
178
195
  console.error(' vibescope-cli --help');
179
196
  process.exit(2);
180
197
  }
@@ -1,236 +1,236 @@
1
- /**
2
- * Global Test Setup for Handler Tests
3
- *
4
- * This file is loaded before all tests via vitest.config.ts setupFiles.
5
- * It provides a global mock for the API client used by migrated handlers.
6
- */
7
-
8
- import { vi, beforeEach } from 'vitest';
9
-
10
- // Default success response for API calls
11
- const defaultSuccess = { ok: true, data: {} };
12
- const defaultError = { ok: false, error: 'Mock error' };
13
-
14
- // ============================================================================
15
- // Global Mock API Client
16
- // ============================================================================
17
-
18
- /**
19
- * Mock API client with all methods stubbed.
20
- * Tests can configure return values using mockResolvedValue/mockImplementation.
21
- * Default return is a success response { ok: true, data: {} }
22
- */
23
- export const mockApiClient = {
24
- // Session
25
- startSession: vi.fn(),
26
- heartbeat: vi.fn(),
27
- syncSession: vi.fn(),
28
- endSession: vi.fn(),
29
- reportTokenUsage: vi.fn(),
30
-
31
- // Project
32
- listProjects: vi.fn(),
33
- getProject: vi.fn(),
34
- getProjectContext: vi.fn(),
35
- createProject: vi.fn(),
36
- updateProject: vi.fn(),
37
- updateProjectReadme: vi.fn(),
38
- getGitWorkflow: vi.fn(),
39
-
40
- // Tasks
41
- getTasks: vi.fn(),
42
- getNextTask: vi.fn(),
43
- createTask: vi.fn(),
44
- updateTask: vi.fn(),
45
- completeTask: vi.fn(),
46
- deleteTask: vi.fn(),
47
- addTaskReference: vi.fn(),
48
- removeTaskReference: vi.fn(),
49
- batchUpdateTasks: vi.fn(),
50
- batchCompleteTasks: vi.fn(),
51
-
52
- // Subtasks
53
- addSubtask: vi.fn(),
54
- getSubtasks: vi.fn(),
55
-
56
- // Progress
57
- logProgress: vi.fn(),
58
- getActivityFeed: vi.fn(),
59
-
60
- // Blockers
61
- addBlocker: vi.fn(),
62
- resolveBlocker: vi.fn(),
63
- getBlockers: vi.fn(),
64
- getBlockersStats: vi.fn(),
65
- deleteBlocker: vi.fn(),
66
-
67
- // Decisions
68
- logDecision: vi.fn(),
69
- getDecisions: vi.fn(),
70
- getDecisionsStats: vi.fn(),
71
- deleteDecision: vi.fn(),
72
-
73
- // Ideas
74
- addIdea: vi.fn(),
75
- updateIdea: vi.fn(),
76
- getIdeas: vi.fn(),
77
- deleteIdea: vi.fn(),
78
- convertIdeaToTask: vi.fn(),
79
-
80
- // Findings
81
- addFinding: vi.fn(),
82
- getFindings: vi.fn(),
83
- getFindingsStats: vi.fn(),
84
- updateFinding: vi.fn(),
85
- deleteFinding: vi.fn(),
86
- queryKnowledgeBase: vi.fn(),
87
-
88
- // Requests
89
- getPendingRequests: vi.fn(),
90
- acknowledgeRequest: vi.fn(),
91
- answerQuestion: vi.fn(),
92
-
93
- // Milestones
94
- addMilestone: vi.fn(),
95
- updateMilestone: vi.fn(),
96
- completeMilestone: vi.fn(),
97
- deleteMilestone: vi.fn(),
98
- getMilestones: vi.fn(),
99
-
100
- // Fallback
101
- startFallbackActivity: vi.fn(),
102
- stopFallbackActivity: vi.fn(),
103
- getActivityHistory: vi.fn(),
104
- getActivitySchedules: vi.fn(),
105
-
106
- // Cost
107
- getCostSummary: vi.fn(),
108
- getCostAlerts: vi.fn(),
109
- addCostAlert: vi.fn(),
110
- updateCostAlert: vi.fn(),
111
- deleteCostAlert: vi.fn(),
112
- getTaskCosts: vi.fn(),
113
-
114
- // Git Issues
115
- addGitIssue: vi.fn(),
116
- resolveGitIssue: vi.fn(),
117
- getGitIssues: vi.fn(),
118
- deleteGitIssue: vi.fn(),
119
-
120
- // Organizations
121
- listOrganizations: vi.fn(),
122
- createOrganization: vi.fn(),
123
- updateOrganization: vi.fn(),
124
- deleteOrganization: vi.fn(),
125
- listOrgMembers: vi.fn(),
126
- inviteMember: vi.fn(),
127
- updateMemberRole: vi.fn(),
128
- removeMember: vi.fn(),
129
- leaveOrganization: vi.fn(),
130
- shareProjectWithOrg: vi.fn(),
131
- updateProjectShare: vi.fn(),
132
- unshareProject: vi.fn(),
133
- listProjectShares: vi.fn(),
134
-
135
- // Bodies of Work
136
- createBodyOfWork: vi.fn(),
137
- updateBodyOfWork: vi.fn(),
138
- getBodyOfWork: vi.fn(),
139
- getBodiesOfWork: vi.fn(),
140
- deleteBodyOfWork: vi.fn(),
141
- addTaskToBodyOfWork: vi.fn(),
142
- removeTaskFromBodyOfWork: vi.fn(),
143
- activateBodyOfWork: vi.fn(),
144
- addTaskDependency: vi.fn(),
145
- removeTaskDependency: vi.fn(),
146
- getTaskDependencies: vi.fn(),
147
- getNextBodyOfWorkTask: vi.fn(),
148
-
149
- // Deployment
150
- requestDeployment: vi.fn(),
151
- claimDeploymentValidation: vi.fn(),
152
- reportValidation: vi.fn(),
153
- checkDeploymentStatus: vi.fn(),
154
- startDeployment: vi.fn(),
155
- completeDeployment: vi.fn(),
156
- cancelDeployment: vi.fn(),
157
- addDeploymentRequirement: vi.fn(),
158
- completeDeploymentRequirement: vi.fn(),
159
- getDeploymentRequirements: vi.fn(),
160
- getDeploymentRequirementsStats: vi.fn(),
161
- scheduleDeployment: vi.fn(),
162
- getScheduledDeployments: vi.fn(),
163
- updateScheduledDeployment: vi.fn(),
164
- deleteScheduledDeployment: vi.fn(),
165
- triggerScheduledDeployment: vi.fn(),
166
- checkDueDeployments: vi.fn(),
167
-
168
- // Validation
169
- getTasksAwaitingValidation: vi.fn(),
170
- claimValidation: vi.fn(),
171
- validateTask: vi.fn(),
172
-
173
- // Help Topics
174
- getHelpTopic: vi.fn(),
175
- getHelpTopics: vi.fn(),
176
-
177
- // File Checkouts
178
- checkoutFile: vi.fn(),
179
- checkinFile: vi.fn(),
180
- getFileCheckouts: vi.fn(),
181
- getFileCheckoutsStats: vi.fn(),
182
- abandonCheckout: vi.fn(),
183
-
184
- // Connectors
185
- getConnectors: vi.fn(),
186
- getConnector: vi.fn(),
187
- addConnector: vi.fn(),
188
- updateConnector: vi.fn(),
189
- deleteConnector: vi.fn(),
190
- testConnector: vi.fn(),
191
- getConnectorEvents: vi.fn(),
192
-
193
- // Proxy (generic)
194
- proxy: vi.fn(),
195
- };
196
-
197
- // ============================================================================
198
- // Mock the API Client Module
199
- // ============================================================================
200
-
201
- // Note: The path is relative to the test file location, not this setup file
202
- // This setup file is in src/handlers/, tests import from ../api-client.js
203
- vi.mock('../api-client.js', () => ({
204
- getApiClient: () => mockApiClient,
205
- initApiClient: vi.fn(),
206
- VibescopeApiClient: vi.fn(),
207
- }));
208
-
209
- // Also mock with absolute-style path for tests outside handlers/
210
- vi.mock('../../api-client.js', () => ({
211
- getApiClient: () => mockApiClient,
212
- initApiClient: vi.fn(),
213
- VibescopeApiClient: vi.fn(),
214
- }));
215
-
216
- // Export for test files that need direct access
217
- export { mockApiClient as __mockApiClient__ };
218
-
219
- // ============================================================================
220
- // Reset Mocks Before Each Test
221
- // ============================================================================
222
-
223
- /**
224
- * Reset all mock functions before each test and set default return values.
225
- * This ensures tests start with a clean slate and have sensible defaults.
226
- */
227
- beforeEach(() => {
228
- // Reset all mocks
229
- Object.values(mockApiClient).forEach((mockFn) => {
230
- if (typeof mockFn === 'function' && mockFn.mockReset) {
231
- mockFn.mockReset();
232
- // Set default return value to success
233
- mockFn.mockResolvedValue({ ok: true, data: {} });
234
- }
235
- });
236
- });
1
+ /**
2
+ * Global Test Setup for Handler Tests
3
+ *
4
+ * This file is loaded before all tests via vitest.config.ts setupFiles.
5
+ * It provides a global mock for the API client used by migrated handlers.
6
+ */
7
+
8
+ import { vi, beforeEach } from 'vitest';
9
+
10
+ // Default success response for API calls
11
+ const defaultSuccess = { ok: true, data: {} };
12
+ const defaultError = { ok: false, error: 'Mock error' };
13
+
14
+ // ============================================================================
15
+ // Global Mock API Client
16
+ // ============================================================================
17
+
18
+ /**
19
+ * Mock API client with all methods stubbed.
20
+ * Tests can configure return values using mockResolvedValue/mockImplementation.
21
+ * Default return is a success response { ok: true, data: {} }
22
+ */
23
+ export const mockApiClient = {
24
+ // Session
25
+ startSession: vi.fn(),
26
+ heartbeat: vi.fn(),
27
+ syncSession: vi.fn(),
28
+ endSession: vi.fn(),
29
+ reportTokenUsage: vi.fn(),
30
+
31
+ // Project
32
+ listProjects: vi.fn(),
33
+ getProject: vi.fn(),
34
+ getProjectContext: vi.fn(),
35
+ createProject: vi.fn(),
36
+ updateProject: vi.fn(),
37
+ updateProjectReadme: vi.fn(),
38
+ getGitWorkflow: vi.fn(),
39
+
40
+ // Tasks
41
+ getTasks: vi.fn(),
42
+ getNextTask: vi.fn(),
43
+ createTask: vi.fn(),
44
+ updateTask: vi.fn(),
45
+ completeTask: vi.fn(),
46
+ deleteTask: vi.fn(),
47
+ addTaskReference: vi.fn(),
48
+ removeTaskReference: vi.fn(),
49
+ batchUpdateTasks: vi.fn(),
50
+ batchCompleteTasks: vi.fn(),
51
+
52
+ // Subtasks
53
+ addSubtask: vi.fn(),
54
+ getSubtasks: vi.fn(),
55
+
56
+ // Progress
57
+ logProgress: vi.fn(),
58
+ getActivityFeed: vi.fn(),
59
+
60
+ // Blockers
61
+ addBlocker: vi.fn(),
62
+ resolveBlocker: vi.fn(),
63
+ getBlockers: vi.fn(),
64
+ getBlockersStats: vi.fn(),
65
+ deleteBlocker: vi.fn(),
66
+
67
+ // Decisions
68
+ logDecision: vi.fn(),
69
+ getDecisions: vi.fn(),
70
+ getDecisionsStats: vi.fn(),
71
+ deleteDecision: vi.fn(),
72
+
73
+ // Ideas
74
+ addIdea: vi.fn(),
75
+ updateIdea: vi.fn(),
76
+ getIdeas: vi.fn(),
77
+ deleteIdea: vi.fn(),
78
+ convertIdeaToTask: vi.fn(),
79
+
80
+ // Findings
81
+ addFinding: vi.fn(),
82
+ getFindings: vi.fn(),
83
+ getFindingsStats: vi.fn(),
84
+ updateFinding: vi.fn(),
85
+ deleteFinding: vi.fn(),
86
+ queryKnowledgeBase: vi.fn(),
87
+
88
+ // Requests
89
+ getPendingRequests: vi.fn(),
90
+ acknowledgeRequest: vi.fn(),
91
+ answerQuestion: vi.fn(),
92
+
93
+ // Milestones
94
+ addMilestone: vi.fn(),
95
+ updateMilestone: vi.fn(),
96
+ completeMilestone: vi.fn(),
97
+ deleteMilestone: vi.fn(),
98
+ getMilestones: vi.fn(),
99
+
100
+ // Fallback
101
+ startFallbackActivity: vi.fn(),
102
+ stopFallbackActivity: vi.fn(),
103
+ getActivityHistory: vi.fn(),
104
+ getActivitySchedules: vi.fn(),
105
+
106
+ // Cost
107
+ getCostSummary: vi.fn(),
108
+ getCostAlerts: vi.fn(),
109
+ addCostAlert: vi.fn(),
110
+ updateCostAlert: vi.fn(),
111
+ deleteCostAlert: vi.fn(),
112
+ getTaskCosts: vi.fn(),
113
+
114
+ // Git Issues
115
+ addGitIssue: vi.fn(),
116
+ resolveGitIssue: vi.fn(),
117
+ getGitIssues: vi.fn(),
118
+ deleteGitIssue: vi.fn(),
119
+
120
+ // Organizations
121
+ listOrganizations: vi.fn(),
122
+ createOrganization: vi.fn(),
123
+ updateOrganization: vi.fn(),
124
+ deleteOrganization: vi.fn(),
125
+ listOrgMembers: vi.fn(),
126
+ inviteMember: vi.fn(),
127
+ updateMemberRole: vi.fn(),
128
+ removeMember: vi.fn(),
129
+ leaveOrganization: vi.fn(),
130
+ shareProjectWithOrg: vi.fn(),
131
+ updateProjectShare: vi.fn(),
132
+ unshareProject: vi.fn(),
133
+ listProjectShares: vi.fn(),
134
+
135
+ // Bodies of Work
136
+ createBodyOfWork: vi.fn(),
137
+ updateBodyOfWork: vi.fn(),
138
+ getBodyOfWork: vi.fn(),
139
+ getBodiesOfWork: vi.fn(),
140
+ deleteBodyOfWork: vi.fn(),
141
+ addTaskToBodyOfWork: vi.fn(),
142
+ removeTaskFromBodyOfWork: vi.fn(),
143
+ activateBodyOfWork: vi.fn(),
144
+ addTaskDependency: vi.fn(),
145
+ removeTaskDependency: vi.fn(),
146
+ getTaskDependencies: vi.fn(),
147
+ getNextBodyOfWorkTask: vi.fn(),
148
+
149
+ // Deployment
150
+ requestDeployment: vi.fn(),
151
+ claimDeploymentValidation: vi.fn(),
152
+ reportValidation: vi.fn(),
153
+ checkDeploymentStatus: vi.fn(),
154
+ startDeployment: vi.fn(),
155
+ completeDeployment: vi.fn(),
156
+ cancelDeployment: vi.fn(),
157
+ addDeploymentRequirement: vi.fn(),
158
+ completeDeploymentRequirement: vi.fn(),
159
+ getDeploymentRequirements: vi.fn(),
160
+ getDeploymentRequirementsStats: vi.fn(),
161
+ scheduleDeployment: vi.fn(),
162
+ getScheduledDeployments: vi.fn(),
163
+ updateScheduledDeployment: vi.fn(),
164
+ deleteScheduledDeployment: vi.fn(),
165
+ triggerScheduledDeployment: vi.fn(),
166
+ checkDueDeployments: vi.fn(),
167
+
168
+ // Validation
169
+ getTasksAwaitingValidation: vi.fn(),
170
+ claimValidation: vi.fn(),
171
+ validateTask: vi.fn(),
172
+
173
+ // Help Topics
174
+ getHelpTopic: vi.fn(),
175
+ getHelpTopics: vi.fn(),
176
+
177
+ // File Checkouts
178
+ checkoutFile: vi.fn(),
179
+ checkinFile: vi.fn(),
180
+ getFileCheckouts: vi.fn(),
181
+ getFileCheckoutsStats: vi.fn(),
182
+ abandonCheckout: vi.fn(),
183
+
184
+ // Connectors
185
+ getConnectors: vi.fn(),
186
+ getConnector: vi.fn(),
187
+ addConnector: vi.fn(),
188
+ updateConnector: vi.fn(),
189
+ deleteConnector: vi.fn(),
190
+ testConnector: vi.fn(),
191
+ getConnectorEvents: vi.fn(),
192
+
193
+ // Proxy (generic)
194
+ proxy: vi.fn(),
195
+ };
196
+
197
+ // ============================================================================
198
+ // Mock the API Client Module
199
+ // ============================================================================
200
+
201
+ // Note: The path is relative to the test file location, not this setup file
202
+ // This setup file is in src/handlers/, tests import from ../api-client.js
203
+ vi.mock('../api-client.js', () => ({
204
+ getApiClient: () => mockApiClient,
205
+ initApiClient: vi.fn(),
206
+ VibescopeApiClient: vi.fn(),
207
+ }));
208
+
209
+ // Also mock with absolute-style path for tests outside handlers/
210
+ vi.mock('../../api-client.js', () => ({
211
+ getApiClient: () => mockApiClient,
212
+ initApiClient: vi.fn(),
213
+ VibescopeApiClient: vi.fn(),
214
+ }));
215
+
216
+ // Export for test files that need direct access
217
+ export { mockApiClient as __mockApiClient__ };
218
+
219
+ // ============================================================================
220
+ // Reset Mocks Before Each Test
221
+ // ============================================================================
222
+
223
+ /**
224
+ * Reset all mock functions before each test and set default return values.
225
+ * This ensures tests start with a clean slate and have sensible defaults.
226
+ */
227
+ beforeEach(() => {
228
+ // Reset all mocks
229
+ Object.values(mockApiClient).forEach((mockFn) => {
230
+ if (typeof mockFn === 'function' && mockFn.mockReset) {
231
+ mockFn.mockReset();
232
+ // Set default return value to success
233
+ mockFn.mockResolvedValue({ ok: true, data: {} });
234
+ }
235
+ });
236
+ });