@vibescope/mcp-server 0.4.5 → 0.4.7
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/CHANGELOG.md +84 -84
- package/README.md +194 -194
- package/dist/api-client/project.d.ts +1 -0
- package/dist/api-client.d.ts +4 -1
- package/dist/api-client.js +24 -7
- package/dist/cli-init.js +25 -24
- package/dist/cli.js +26 -26
- package/dist/handlers/chat.d.ts +2 -0
- package/dist/handlers/chat.js +25 -0
- package/dist/handlers/discovery.js +12 -0
- package/dist/handlers/project.js +4 -2
- package/dist/handlers/tool-docs.js +1203 -1137
- package/dist/handlers/version.js +1 -1
- package/dist/index.js +159 -87
- package/dist/setup.js +13 -7
- package/dist/templates/agent-guidelines.d.ts +1 -1
- package/dist/templates/agent-guidelines.js +205 -187
- package/dist/templates/help-content.js +1621 -1621
- package/dist/tools/bodies-of-work.js +6 -6
- package/dist/tools/chat.d.ts +1 -0
- package/dist/tools/chat.js +24 -0
- package/dist/tools/cloud-agents.js +22 -22
- package/dist/tools/features.d.ts +13 -0
- package/dist/tools/features.js +151 -0
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.js +4 -1
- package/dist/tools/milestones.js +2 -2
- package/dist/tools/project.js +4 -0
- package/dist/tools/requests.js +1 -1
- package/dist/tools/session.js +11 -11
- package/dist/tools/sprints.js +9 -9
- package/dist/tools/tasks.js +35 -35
- package/dist/tools/worktrees.js +14 -14
- package/dist/tools.d.ts +2 -0
- package/dist/tools.js +3602 -0
- package/dist/utils.js +11 -11
- package/dist/version.d.ts +9 -3
- package/dist/version.js +56 -8
- package/docs/TOOLS.md +2663 -2559
- package/package.json +53 -53
- package/scripts/generate-docs.ts +212 -212
- package/scripts/version-bump.ts +203 -203
- package/src/api-client/blockers.ts +86 -86
- package/src/api-client/bodies-of-work.ts +194 -194
- package/src/api-client/chat.ts +50 -50
- package/src/api-client/connectors.ts +152 -152
- package/src/api-client/cost.ts +185 -185
- package/src/api-client/decisions.ts +87 -87
- package/src/api-client/deployment.ts +313 -313
- package/src/api-client/discovery.ts +81 -81
- package/src/api-client/fallback.ts +52 -52
- package/src/api-client/file-checkouts.ts +115 -115
- package/src/api-client/findings.ts +100 -100
- package/src/api-client/git-issues.ts +88 -88
- package/src/api-client/ideas.ts +112 -112
- package/src/api-client/index.ts +592 -592
- package/src/api-client/milestones.ts +83 -83
- package/src/api-client/organizations.ts +185 -185
- package/src/api-client/progress.ts +94 -94
- package/src/api-client/project.ts +180 -179
- package/src/api-client/requests.ts +54 -54
- package/src/api-client/session.ts +220 -220
- package/src/api-client/sprints.ts +227 -227
- package/src/api-client/subtasks.ts +57 -57
- package/src/api-client/tasks.ts +450 -450
- package/src/api-client/types.ts +32 -32
- package/src/api-client/validation.ts +60 -60
- package/src/api-client/worktrees.ts +53 -53
- package/src/api-client.test.ts +847 -847
- package/src/api-client.ts +2723 -2706
- package/src/cli-init.ts +558 -557
- package/src/cli.test.ts +284 -284
- package/src/cli.ts +204 -204
- package/src/handlers/__test-setup__.ts +240 -240
- package/src/handlers/__test-utils__.ts +89 -89
- package/src/handlers/blockers.test.ts +468 -468
- package/src/handlers/blockers.ts +172 -172
- package/src/handlers/bodies-of-work.test.ts +704 -704
- package/src/handlers/bodies-of-work.ts +526 -526
- package/src/handlers/chat.test.ts +185 -185
- package/src/handlers/chat.ts +101 -69
- package/src/handlers/cloud-agents.test.ts +438 -438
- package/src/handlers/cloud-agents.ts +156 -156
- package/src/handlers/connectors.test.ts +834 -834
- package/src/handlers/connectors.ts +229 -229
- package/src/handlers/cost.test.ts +462 -462
- package/src/handlers/cost.ts +285 -285
- package/src/handlers/decisions.test.ts +382 -382
- package/src/handlers/decisions.ts +153 -153
- package/src/handlers/deployment.test.ts +551 -551
- package/src/handlers/deployment.ts +570 -570
- package/src/handlers/discovery.test.ts +206 -206
- package/src/handlers/discovery.ts +427 -415
- package/src/handlers/fallback.test.ts +537 -537
- package/src/handlers/fallback.ts +194 -194
- package/src/handlers/file-checkouts.test.ts +750 -750
- package/src/handlers/file-checkouts.ts +185 -185
- package/src/handlers/findings.test.ts +633 -633
- package/src/handlers/findings.ts +239 -239
- package/src/handlers/git-issues.test.ts +631 -631
- package/src/handlers/git-issues.ts +136 -136
- package/src/handlers/ideas.test.ts +644 -644
- package/src/handlers/ideas.ts +207 -207
- package/src/handlers/index.ts +93 -93
- package/src/handlers/milestones.test.ts +475 -475
- package/src/handlers/milestones.ts +180 -180
- package/src/handlers/organizations.test.ts +826 -826
- package/src/handlers/organizations.ts +315 -315
- package/src/handlers/progress.test.ts +269 -269
- package/src/handlers/progress.ts +77 -77
- package/src/handlers/project.test.ts +546 -546
- package/src/handlers/project.ts +242 -239
- package/src/handlers/requests.test.ts +303 -303
- package/src/handlers/requests.ts +99 -99
- package/src/handlers/roles.test.ts +305 -305
- package/src/handlers/roles.ts +219 -219
- package/src/handlers/session.test.ts +998 -998
- package/src/handlers/session.ts +1105 -1105
- package/src/handlers/sprints.test.ts +732 -732
- package/src/handlers/sprints.ts +537 -537
- package/src/handlers/tasks.test.ts +931 -931
- package/src/handlers/tasks.ts +1133 -1133
- package/src/handlers/tool-categories.test.ts +66 -66
- package/src/handlers/tool-docs.test.ts +511 -511
- package/src/handlers/tool-docs.ts +1571 -1499
- package/src/handlers/types.test.ts +259 -259
- package/src/handlers/types.ts +176 -176
- package/src/handlers/validation.test.ts +582 -582
- package/src/handlers/validation.ts +164 -164
- package/src/handlers/version.ts +63 -63
- package/src/index.test.ts +674 -674
- package/src/index.ts +884 -807
- package/src/setup.test.ts +243 -233
- package/src/setup.ts +410 -404
- package/src/templates/agent-guidelines.ts +233 -215
- package/src/templates/help-content.ts +1751 -1751
- package/src/token-tracking.test.ts +463 -463
- package/src/token-tracking.ts +167 -167
- package/src/tools/blockers.ts +122 -122
- package/src/tools/bodies-of-work.ts +283 -283
- package/src/tools/chat.ts +72 -46
- package/src/tools/cloud-agents.ts +101 -101
- package/src/tools/connectors.ts +191 -191
- package/src/tools/cost.ts +111 -111
- package/src/tools/decisions.ts +111 -111
- package/src/tools/deployment.ts +455 -455
- package/src/tools/discovery.ts +76 -76
- package/src/tools/fallback.ts +111 -111
- package/src/tools/features.ts +154 -0
- package/src/tools/file-checkouts.ts +145 -145
- package/src/tools/findings.ts +101 -101
- package/src/tools/git-issues.ts +130 -130
- package/src/tools/ideas.ts +162 -162
- package/src/tools/index.ts +141 -137
- package/src/tools/milestones.ts +118 -118
- package/src/tools/organizations.ts +224 -224
- package/src/tools/progress.ts +73 -73
- package/src/tools/project.ts +206 -202
- package/src/tools/requests.ts +68 -68
- package/src/tools/roles.ts +112 -112
- package/src/tools/session.ts +181 -181
- package/src/tools/sprints.ts +298 -298
- package/src/tools/tasks.ts +550 -550
- package/src/tools/tools.test.ts +222 -222
- package/src/tools/types.ts +9 -9
- package/src/tools/validation.ts +75 -75
- package/src/tools/version.ts +34 -34
- package/src/tools/worktrees.ts +66 -66
- package/src/tools.test.ts +416 -416
- package/src/utils.test.ts +1014 -1014
- package/src/utils.ts +586 -586
- package/src/validators.test.ts +223 -223
- package/src/validators.ts +249 -249
- package/src/version.ts +162 -109
- package/tsconfig.json +16 -16
- package/vitest.config.ts +14 -14
|
@@ -1,240 +1,240 @@
|
|
|
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
|
-
// Chat
|
|
194
|
-
sendProjectMessage: vi.fn(),
|
|
195
|
-
getProjectMessages: vi.fn(),
|
|
196
|
-
|
|
197
|
-
// Proxy (generic)
|
|
198
|
-
proxy: vi.fn(),
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
// ============================================================================
|
|
202
|
-
// Mock the API Client Module
|
|
203
|
-
// ============================================================================
|
|
204
|
-
|
|
205
|
-
// Note: The path is relative to the test file location, not this setup file
|
|
206
|
-
// This setup file is in src/handlers/, tests import from ../api-client.js
|
|
207
|
-
vi.mock('../api-client.js', () => ({
|
|
208
|
-
getApiClient: () => mockApiClient,
|
|
209
|
-
initApiClient: vi.fn(),
|
|
210
|
-
VibescopeApiClient: vi.fn(),
|
|
211
|
-
}));
|
|
212
|
-
|
|
213
|
-
// Also mock with absolute-style path for tests outside handlers/
|
|
214
|
-
vi.mock('../../api-client.js', () => ({
|
|
215
|
-
getApiClient: () => mockApiClient,
|
|
216
|
-
initApiClient: vi.fn(),
|
|
217
|
-
VibescopeApiClient: vi.fn(),
|
|
218
|
-
}));
|
|
219
|
-
|
|
220
|
-
// Export for test files that need direct access
|
|
221
|
-
export { mockApiClient as __mockApiClient__ };
|
|
222
|
-
|
|
223
|
-
// ============================================================================
|
|
224
|
-
// Reset Mocks Before Each Test
|
|
225
|
-
// ============================================================================
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Reset all mock functions before each test and set default return values.
|
|
229
|
-
* This ensures tests start with a clean slate and have sensible defaults.
|
|
230
|
-
*/
|
|
231
|
-
beforeEach(() => {
|
|
232
|
-
// Reset all mocks
|
|
233
|
-
Object.values(mockApiClient).forEach((mockFn) => {
|
|
234
|
-
if (typeof mockFn === 'function' && mockFn.mockReset) {
|
|
235
|
-
mockFn.mockReset();
|
|
236
|
-
// Set default return value to success
|
|
237
|
-
mockFn.mockResolvedValue({ ok: true, data: {} });
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
});
|
|
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
|
+
// Chat
|
|
194
|
+
sendProjectMessage: vi.fn(),
|
|
195
|
+
getProjectMessages: vi.fn(),
|
|
196
|
+
|
|
197
|
+
// Proxy (generic)
|
|
198
|
+
proxy: vi.fn(),
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
// ============================================================================
|
|
202
|
+
// Mock the API Client Module
|
|
203
|
+
// ============================================================================
|
|
204
|
+
|
|
205
|
+
// Note: The path is relative to the test file location, not this setup file
|
|
206
|
+
// This setup file is in src/handlers/, tests import from ../api-client.js
|
|
207
|
+
vi.mock('../api-client.js', () => ({
|
|
208
|
+
getApiClient: () => mockApiClient,
|
|
209
|
+
initApiClient: vi.fn(),
|
|
210
|
+
VibescopeApiClient: vi.fn(),
|
|
211
|
+
}));
|
|
212
|
+
|
|
213
|
+
// Also mock with absolute-style path for tests outside handlers/
|
|
214
|
+
vi.mock('../../api-client.js', () => ({
|
|
215
|
+
getApiClient: () => mockApiClient,
|
|
216
|
+
initApiClient: vi.fn(),
|
|
217
|
+
VibescopeApiClient: vi.fn(),
|
|
218
|
+
}));
|
|
219
|
+
|
|
220
|
+
// Export for test files that need direct access
|
|
221
|
+
export { mockApiClient as __mockApiClient__ };
|
|
222
|
+
|
|
223
|
+
// ============================================================================
|
|
224
|
+
// Reset Mocks Before Each Test
|
|
225
|
+
// ============================================================================
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Reset all mock functions before each test and set default return values.
|
|
229
|
+
* This ensures tests start with a clean slate and have sensible defaults.
|
|
230
|
+
*/
|
|
231
|
+
beforeEach(() => {
|
|
232
|
+
// Reset all mocks
|
|
233
|
+
Object.values(mockApiClient).forEach((mockFn) => {
|
|
234
|
+
if (typeof mockFn === 'function' && mockFn.mockReset) {
|
|
235
|
+
mockFn.mockReset();
|
|
236
|
+
// Set default return value to success
|
|
237
|
+
mockFn.mockResolvedValue({ ok: true, data: {} });
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
});
|
|
@@ -1,89 +1,89 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared Test Utilities
|
|
3
|
-
*
|
|
4
|
-
* Common mock factories and test helpers used across handler tests.
|
|
5
|
-
* Handlers now use API client instead of direct Supabase access.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { vi } from 'vitest';
|
|
9
|
-
import type { HandlerContext, TokenUsage } from './types.js';
|
|
10
|
-
|
|
11
|
-
// ============================================================================
|
|
12
|
-
// Mock Handler Context Factory
|
|
13
|
-
// ============================================================================
|
|
14
|
-
|
|
15
|
-
export interface MockContextOptions {
|
|
16
|
-
sessionId?: string | null;
|
|
17
|
-
userId?: string;
|
|
18
|
-
apiKeyId?: string;
|
|
19
|
-
instanceId?: string;
|
|
20
|
-
persona?: string;
|
|
21
|
-
tokenUsage?: TokenUsage;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Create a mock HandlerContext for testing.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```ts
|
|
29
|
-
* const ctx = createMockContext({ sessionId: 'test-session' });
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export function createMockContext(
|
|
33
|
-
options: MockContextOptions = {}
|
|
34
|
-
): HandlerContext {
|
|
35
|
-
const defaultTokenUsage: TokenUsage = {
|
|
36
|
-
callCount: 5,
|
|
37
|
-
totalTokens: 2500,
|
|
38
|
-
byTool: {},
|
|
39
|
-
byModel: {},
|
|
40
|
-
currentModel: null,
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const sessionId = 'sessionId' in options ? (options.sessionId ?? null) : 'session-123';
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
auth: {
|
|
47
|
-
userId: options.userId ?? 'user-123',
|
|
48
|
-
apiKeyId: options.apiKeyId ?? 'api-key-123',
|
|
49
|
-
scope: 'personal' as const,
|
|
50
|
-
},
|
|
51
|
-
session: {
|
|
52
|
-
instanceId: options.instanceId ?? 'instance-abc',
|
|
53
|
-
currentSessionId: sessionId,
|
|
54
|
-
currentPersona: options.persona ?? 'Wave',
|
|
55
|
-
currentRole: null,
|
|
56
|
-
currentProjectId: null,
|
|
57
|
-
tokenUsage: options.tokenUsage ?? defaultTokenUsage,
|
|
58
|
-
},
|
|
59
|
-
updateSession: vi.fn(),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// ============================================================================
|
|
64
|
-
// Test Data Generators
|
|
65
|
-
// ============================================================================
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Generate a valid UUID for testing.
|
|
69
|
-
*/
|
|
70
|
-
export function testUUID(): string {
|
|
71
|
-
return '123e4567-e89b-12d3-a456-426614174000';
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Generate a random-ish UUID for testing (deterministic based on seed).
|
|
76
|
-
*/
|
|
77
|
-
export function testUUIDSeeded(seed: number): string {
|
|
78
|
-
const hex = seed.toString(16).padStart(8, '0');
|
|
79
|
-
return `${hex}-e89b-12d3-a456-426614174000`;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Create a mock timestamp for consistent testing.
|
|
84
|
-
*/
|
|
85
|
-
export function testTimestamp(offsetMinutes = 0): string {
|
|
86
|
-
const date = new Date('2025-01-14T12:00:00Z');
|
|
87
|
-
date.setMinutes(date.getMinutes() + offsetMinutes);
|
|
88
|
-
return date.toISOString();
|
|
89
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Shared Test Utilities
|
|
3
|
+
*
|
|
4
|
+
* Common mock factories and test helpers used across handler tests.
|
|
5
|
+
* Handlers now use API client instead of direct Supabase access.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { vi } from 'vitest';
|
|
9
|
+
import type { HandlerContext, TokenUsage } from './types.js';
|
|
10
|
+
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Mock Handler Context Factory
|
|
13
|
+
// ============================================================================
|
|
14
|
+
|
|
15
|
+
export interface MockContextOptions {
|
|
16
|
+
sessionId?: string | null;
|
|
17
|
+
userId?: string;
|
|
18
|
+
apiKeyId?: string;
|
|
19
|
+
instanceId?: string;
|
|
20
|
+
persona?: string;
|
|
21
|
+
tokenUsage?: TokenUsage;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a mock HandlerContext for testing.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const ctx = createMockContext({ sessionId: 'test-session' });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function createMockContext(
|
|
33
|
+
options: MockContextOptions = {}
|
|
34
|
+
): HandlerContext {
|
|
35
|
+
const defaultTokenUsage: TokenUsage = {
|
|
36
|
+
callCount: 5,
|
|
37
|
+
totalTokens: 2500,
|
|
38
|
+
byTool: {},
|
|
39
|
+
byModel: {},
|
|
40
|
+
currentModel: null,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const sessionId = 'sessionId' in options ? (options.sessionId ?? null) : 'session-123';
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
auth: {
|
|
47
|
+
userId: options.userId ?? 'user-123',
|
|
48
|
+
apiKeyId: options.apiKeyId ?? 'api-key-123',
|
|
49
|
+
scope: 'personal' as const,
|
|
50
|
+
},
|
|
51
|
+
session: {
|
|
52
|
+
instanceId: options.instanceId ?? 'instance-abc',
|
|
53
|
+
currentSessionId: sessionId,
|
|
54
|
+
currentPersona: options.persona ?? 'Wave',
|
|
55
|
+
currentRole: null,
|
|
56
|
+
currentProjectId: null,
|
|
57
|
+
tokenUsage: options.tokenUsage ?? defaultTokenUsage,
|
|
58
|
+
},
|
|
59
|
+
updateSession: vi.fn(),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Test Data Generators
|
|
65
|
+
// ============================================================================
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Generate a valid UUID for testing.
|
|
69
|
+
*/
|
|
70
|
+
export function testUUID(): string {
|
|
71
|
+
return '123e4567-e89b-12d3-a456-426614174000';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Generate a random-ish UUID for testing (deterministic based on seed).
|
|
76
|
+
*/
|
|
77
|
+
export function testUUIDSeeded(seed: number): string {
|
|
78
|
+
const hex = seed.toString(16).padStart(8, '0');
|
|
79
|
+
return `${hex}-e89b-12d3-a456-426614174000`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Create a mock timestamp for consistent testing.
|
|
84
|
+
*/
|
|
85
|
+
export function testTimestamp(offsetMinutes = 0): string {
|
|
86
|
+
const date = new Date('2025-01-14T12:00:00Z');
|
|
87
|
+
date.setMinutes(date.getMinutes() + offsetMinutes);
|
|
88
|
+
return date.toISOString();
|
|
89
|
+
}
|