@vibescope/mcp-server 0.2.9 → 0.3.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/CHANGELOG.md +84 -84
- package/README.md +194 -194
- package/dist/api-client.d.ts +36 -0
- package/dist/api-client.js +34 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +30 -38
- package/dist/handlers/discovery.js +2 -0
- package/dist/handlers/session.d.ts +11 -0
- package/dist/handlers/session.js +101 -0
- package/dist/handlers/tasks.d.ts +8 -0
- package/dist/handlers/tasks.js +163 -3
- package/dist/handlers/tool-docs.js +840 -828
- package/dist/handlers/validation.js +45 -2
- package/dist/index.js +73 -73
- package/dist/setup.js +6 -6
- package/dist/templates/agent-guidelines.js +185 -185
- package/dist/templates/help-content.js +1622 -1544
- package/dist/tools.js +126 -74
- package/dist/utils.d.ts +15 -11
- package/dist/utils.js +53 -28
- package/docs/TOOLS.md +2406 -2053
- package/package.json +51 -51
- package/scripts/generate-docs.ts +212 -212
- package/scripts/version-bump.ts +203 -203
- package/src/api-client.test.ts +723 -723
- package/src/api-client.ts +2561 -2499
- package/src/cli.test.ts +24 -8
- package/src/cli.ts +204 -212
- package/src/handlers/__test-setup__.ts +236 -236
- package/src/handlers/__test-utils__.ts +87 -87
- package/src/handlers/blockers.test.ts +468 -468
- package/src/handlers/blockers.ts +163 -163
- package/src/handlers/bodies-of-work.test.ts +704 -704
- package/src/handlers/bodies-of-work.ts +526 -526
- 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 +541 -541
- package/src/handlers/discovery.test.ts +206 -206
- package/src/handlers/discovery.ts +392 -390
- 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 +84 -84
- 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 +239 -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 -875
- package/src/handlers/session.ts +839 -730
- package/src/handlers/sprints.test.ts +732 -732
- package/src/handlers/sprints.ts +537 -537
- package/src/handlers/tasks.test.ts +931 -907
- package/src/handlers/tasks.ts +1121 -945
- package/src/handlers/tool-categories.test.ts +66 -66
- package/src/handlers/tool-docs.ts +1109 -1096
- package/src/handlers/types.test.ts +259 -259
- package/src/handlers/types.ts +175 -175
- package/src/handlers/validation.test.ts +582 -582
- package/src/handlers/validation.ts +159 -113
- package/src/index.test.ts +674 -0
- package/src/index.ts +792 -792
- package/src/setup.test.ts +233 -233
- package/src/setup.ts +404 -403
- package/src/templates/agent-guidelines.ts +210 -210
- package/src/templates/help-content.ts +1751 -1673
- package/src/token-tracking.test.ts +463 -463
- package/src/token-tracking.ts +166 -166
- package/src/tools.test.ts +416 -0
- package/src/tools.ts +3607 -3555
- package/src/utils.test.ts +785 -683
- package/src/utils.ts +469 -436
- package/src/validators.test.ts +223 -223
- package/src/validators.ts +249 -249
- package/tsconfig.json +16 -16
- package/vitest.config.ts +14 -14
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Milestone Handlers
|
|
3
|
-
*
|
|
4
|
-
* Handles task milestone CRUD operations:
|
|
5
|
-
* - add_milestone
|
|
6
|
-
* - update_milestone
|
|
7
|
-
* - complete_milestone
|
|
8
|
-
* - delete_milestone
|
|
9
|
-
* - get_milestones
|
|
10
|
-
*
|
|
11
|
-
* MIGRATED: Uses Vibescope API client instead of direct Supabase
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { Handler, HandlerRegistry } from './types.js';
|
|
15
|
-
import {
|
|
16
|
-
parseArgs,
|
|
17
|
-
uuidValidator,
|
|
18
|
-
createEnumValidator,
|
|
19
|
-
ValidationError,
|
|
20
|
-
} from '../validators.js';
|
|
21
|
-
import { getApiClient } from '../api-client.js';
|
|
22
|
-
|
|
23
|
-
const VALID_MILESTONE_STATUSES = ['pending', 'in_progress', 'completed'] as const;
|
|
24
|
-
type MilestoneStatus = typeof VALID_MILESTONE_STATUSES[number];
|
|
25
|
-
|
|
26
|
-
// Argument schemas for type-safe parsing
|
|
27
|
-
const addMilestoneSchema = {
|
|
28
|
-
task_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
29
|
-
title: { type: 'string' as const, required: true as const },
|
|
30
|
-
description: { type: 'string' as const },
|
|
31
|
-
order_index: { type: 'number' as const },
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const updateMilestoneSchema = {
|
|
35
|
-
milestone_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
36
|
-
title: { type: 'string' as const },
|
|
37
|
-
description: { type: 'string' as const },
|
|
38
|
-
status: { type: 'string' as const, validate: createEnumValidator(VALID_MILESTONE_STATUSES) },
|
|
39
|
-
order_index: { type: 'number' as const },
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const completeMilestoneSchema = {
|
|
43
|
-
milestone_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
const deleteMilestoneSchema = {
|
|
47
|
-
milestone_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const getMilestonesSchema = {
|
|
51
|
-
task_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
export const addMilestone: Handler = async (args, ctx) => {
|
|
55
|
-
const { task_id, title, description, order_index } = parseArgs(args, addMilestoneSchema);
|
|
56
|
-
|
|
57
|
-
const { session } = ctx;
|
|
58
|
-
const apiClient = getApiClient();
|
|
59
|
-
|
|
60
|
-
const response = await apiClient.addMilestone(task_id, {
|
|
61
|
-
title,
|
|
62
|
-
description,
|
|
63
|
-
order_index
|
|
64
|
-
}, session.currentSessionId || undefined);
|
|
65
|
-
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
return { result: { error: response.error || 'Failed to add milestone' }, isError: true };
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return {
|
|
71
|
-
result: {
|
|
72
|
-
success: true,
|
|
73
|
-
milestone_id: response.data?.milestone_id,
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
export const updateMilestone: Handler = async (args, _ctx) => {
|
|
79
|
-
const { milestone_id, title, description, status, order_index } = parseArgs(args, updateMilestoneSchema);
|
|
80
|
-
|
|
81
|
-
// Check that at least one field is provided
|
|
82
|
-
if (title === undefined && description === undefined && status === undefined && order_index === undefined) {
|
|
83
|
-
throw new ValidationError('At least one field to update is required');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const apiClient = getApiClient();
|
|
87
|
-
|
|
88
|
-
const response = await apiClient.updateMilestone(milestone_id, {
|
|
89
|
-
title,
|
|
90
|
-
description,
|
|
91
|
-
status: status as MilestoneStatus | undefined,
|
|
92
|
-
order_index
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
if (!response.ok) {
|
|
96
|
-
return { result: { error: response.error || 'Failed to update milestone' }, isError: true };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return {
|
|
100
|
-
result: {
|
|
101
|
-
success: true,
|
|
102
|
-
milestone: response.data?.milestone,
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
export const completeMilestone: Handler = async (args, _ctx) => {
|
|
108
|
-
const { milestone_id } = parseArgs(args, completeMilestoneSchema);
|
|
109
|
-
|
|
110
|
-
const apiClient = getApiClient();
|
|
111
|
-
|
|
112
|
-
const response = await apiClient.completeMilestone(milestone_id);
|
|
113
|
-
|
|
114
|
-
if (!response.ok) {
|
|
115
|
-
return { result: { error: response.error || 'Failed to complete milestone' }, isError: true };
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
result: {
|
|
120
|
-
success: true,
|
|
121
|
-
milestone: response.data?.milestone,
|
|
122
|
-
},
|
|
123
|
-
};
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
export const deleteMilestone: Handler = async (args, _ctx) => {
|
|
127
|
-
const { milestone_id } = parseArgs(args, deleteMilestoneSchema);
|
|
128
|
-
|
|
129
|
-
const apiClient = getApiClient();
|
|
130
|
-
|
|
131
|
-
const response = await apiClient.deleteMilestone(milestone_id);
|
|
132
|
-
|
|
133
|
-
if (!response.ok) {
|
|
134
|
-
return { result: { error: response.error || 'Failed to delete milestone' }, isError: true };
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
result: {
|
|
139
|
-
success: true,
|
|
140
|
-
message: 'Milestone deleted',
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
export const getMilestones: Handler = async (args, _ctx) => {
|
|
146
|
-
const { task_id } = parseArgs(args, getMilestonesSchema);
|
|
147
|
-
|
|
148
|
-
const apiClient = getApiClient();
|
|
149
|
-
|
|
150
|
-
const response = await apiClient.getMilestones(task_id);
|
|
151
|
-
|
|
152
|
-
if (!response.ok) {
|
|
153
|
-
return { result: { error: response.error || 'Failed to get milestones' }, isError: true };
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Stats are calculated server-side now
|
|
157
|
-
return {
|
|
158
|
-
result: {
|
|
159
|
-
milestones: response.data?.milestones || [],
|
|
160
|
-
stats: response.data?.stats || {
|
|
161
|
-
total: 0,
|
|
162
|
-
completed: 0,
|
|
163
|
-
in_progress: 0,
|
|
164
|
-
pending: 0,
|
|
165
|
-
progress_percentage: 0,
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
/**
|
|
172
|
-
* Milestone handlers registry
|
|
173
|
-
*/
|
|
174
|
-
export const milestoneHandlers: HandlerRegistry = {
|
|
175
|
-
add_milestone: addMilestone,
|
|
176
|
-
update_milestone: updateMilestone,
|
|
177
|
-
complete_milestone: completeMilestone,
|
|
178
|
-
delete_milestone: deleteMilestone,
|
|
179
|
-
get_milestones: getMilestones,
|
|
180
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Milestone Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles task milestone CRUD operations:
|
|
5
|
+
* - add_milestone
|
|
6
|
+
* - update_milestone
|
|
7
|
+
* - complete_milestone
|
|
8
|
+
* - delete_milestone
|
|
9
|
+
* - get_milestones
|
|
10
|
+
*
|
|
11
|
+
* MIGRATED: Uses Vibescope API client instead of direct Supabase
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { Handler, HandlerRegistry } from './types.js';
|
|
15
|
+
import {
|
|
16
|
+
parseArgs,
|
|
17
|
+
uuidValidator,
|
|
18
|
+
createEnumValidator,
|
|
19
|
+
ValidationError,
|
|
20
|
+
} from '../validators.js';
|
|
21
|
+
import { getApiClient } from '../api-client.js';
|
|
22
|
+
|
|
23
|
+
const VALID_MILESTONE_STATUSES = ['pending', 'in_progress', 'completed'] as const;
|
|
24
|
+
type MilestoneStatus = typeof VALID_MILESTONE_STATUSES[number];
|
|
25
|
+
|
|
26
|
+
// Argument schemas for type-safe parsing
|
|
27
|
+
const addMilestoneSchema = {
|
|
28
|
+
task_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
29
|
+
title: { type: 'string' as const, required: true as const },
|
|
30
|
+
description: { type: 'string' as const },
|
|
31
|
+
order_index: { type: 'number' as const },
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const updateMilestoneSchema = {
|
|
35
|
+
milestone_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
36
|
+
title: { type: 'string' as const },
|
|
37
|
+
description: { type: 'string' as const },
|
|
38
|
+
status: { type: 'string' as const, validate: createEnumValidator(VALID_MILESTONE_STATUSES) },
|
|
39
|
+
order_index: { type: 'number' as const },
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const completeMilestoneSchema = {
|
|
43
|
+
milestone_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const deleteMilestoneSchema = {
|
|
47
|
+
milestone_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const getMilestonesSchema = {
|
|
51
|
+
task_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const addMilestone: Handler = async (args, ctx) => {
|
|
55
|
+
const { task_id, title, description, order_index } = parseArgs(args, addMilestoneSchema);
|
|
56
|
+
|
|
57
|
+
const { session } = ctx;
|
|
58
|
+
const apiClient = getApiClient();
|
|
59
|
+
|
|
60
|
+
const response = await apiClient.addMilestone(task_id, {
|
|
61
|
+
title,
|
|
62
|
+
description,
|
|
63
|
+
order_index
|
|
64
|
+
}, session.currentSessionId || undefined);
|
|
65
|
+
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
return { result: { error: response.error || 'Failed to add milestone' }, isError: true };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
result: {
|
|
72
|
+
success: true,
|
|
73
|
+
milestone_id: response.data?.milestone_id,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export const updateMilestone: Handler = async (args, _ctx) => {
|
|
79
|
+
const { milestone_id, title, description, status, order_index } = parseArgs(args, updateMilestoneSchema);
|
|
80
|
+
|
|
81
|
+
// Check that at least one field is provided
|
|
82
|
+
if (title === undefined && description === undefined && status === undefined && order_index === undefined) {
|
|
83
|
+
throw new ValidationError('At least one field to update is required');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const apiClient = getApiClient();
|
|
87
|
+
|
|
88
|
+
const response = await apiClient.updateMilestone(milestone_id, {
|
|
89
|
+
title,
|
|
90
|
+
description,
|
|
91
|
+
status: status as MilestoneStatus | undefined,
|
|
92
|
+
order_index
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
return { result: { error: response.error || 'Failed to update milestone' }, isError: true };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
result: {
|
|
101
|
+
success: true,
|
|
102
|
+
milestone: response.data?.milestone,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const completeMilestone: Handler = async (args, _ctx) => {
|
|
108
|
+
const { milestone_id } = parseArgs(args, completeMilestoneSchema);
|
|
109
|
+
|
|
110
|
+
const apiClient = getApiClient();
|
|
111
|
+
|
|
112
|
+
const response = await apiClient.completeMilestone(milestone_id);
|
|
113
|
+
|
|
114
|
+
if (!response.ok) {
|
|
115
|
+
return { result: { error: response.error || 'Failed to complete milestone' }, isError: true };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
result: {
|
|
120
|
+
success: true,
|
|
121
|
+
milestone: response.data?.milestone,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export const deleteMilestone: Handler = async (args, _ctx) => {
|
|
127
|
+
const { milestone_id } = parseArgs(args, deleteMilestoneSchema);
|
|
128
|
+
|
|
129
|
+
const apiClient = getApiClient();
|
|
130
|
+
|
|
131
|
+
const response = await apiClient.deleteMilestone(milestone_id);
|
|
132
|
+
|
|
133
|
+
if (!response.ok) {
|
|
134
|
+
return { result: { error: response.error || 'Failed to delete milestone' }, isError: true };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
result: {
|
|
139
|
+
success: true,
|
|
140
|
+
message: 'Milestone deleted',
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export const getMilestones: Handler = async (args, _ctx) => {
|
|
146
|
+
const { task_id } = parseArgs(args, getMilestonesSchema);
|
|
147
|
+
|
|
148
|
+
const apiClient = getApiClient();
|
|
149
|
+
|
|
150
|
+
const response = await apiClient.getMilestones(task_id);
|
|
151
|
+
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
return { result: { error: response.error || 'Failed to get milestones' }, isError: true };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Stats are calculated server-side now
|
|
157
|
+
return {
|
|
158
|
+
result: {
|
|
159
|
+
milestones: response.data?.milestones || [],
|
|
160
|
+
stats: response.data?.stats || {
|
|
161
|
+
total: 0,
|
|
162
|
+
completed: 0,
|
|
163
|
+
in_progress: 0,
|
|
164
|
+
pending: 0,
|
|
165
|
+
progress_percentage: 0,
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Milestone handlers registry
|
|
173
|
+
*/
|
|
174
|
+
export const milestoneHandlers: HandlerRegistry = {
|
|
175
|
+
add_milestone: addMilestone,
|
|
176
|
+
update_milestone: updateMilestone,
|
|
177
|
+
complete_milestone: completeMilestone,
|
|
178
|
+
delete_milestone: deleteMilestone,
|
|
179
|
+
get_milestones: getMilestones,
|
|
180
|
+
};
|