@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
package/src/handlers/ideas.ts
CHANGED
|
@@ -1,207 +1,207 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ideas Handlers
|
|
3
|
-
*
|
|
4
|
-
* Handles feature ideas tracking:
|
|
5
|
-
* - add_idea
|
|
6
|
-
* - update_idea
|
|
7
|
-
* - get_ideas
|
|
8
|
-
* - delete_idea
|
|
9
|
-
* - convert_idea_to_task
|
|
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
|
-
priorityValidator,
|
|
19
|
-
minutesValidator,
|
|
20
|
-
createEnumValidator,
|
|
21
|
-
} from '../validators.js';
|
|
22
|
-
import { getApiClient } from '../api-client.js';
|
|
23
|
-
|
|
24
|
-
const VALID_IDEA_STATUSES = ['raw', 'exploring', 'planned', 'in_development', 'implemented', 'shipped'] as const;
|
|
25
|
-
type IdeaStatus = typeof VALID_IDEA_STATUSES[number];
|
|
26
|
-
|
|
27
|
-
// Argument schemas for type-safe parsing
|
|
28
|
-
const addIdeaSchema = {
|
|
29
|
-
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
30
|
-
title: { type: 'string' as const, required: true as const },
|
|
31
|
-
description: { type: 'string' as const },
|
|
32
|
-
status: { type: 'string' as const, validate: createEnumValidator(VALID_IDEA_STATUSES) },
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const updateIdeaSchema = {
|
|
36
|
-
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
37
|
-
title: { type: 'string' as const },
|
|
38
|
-
description: { type: 'string' as const },
|
|
39
|
-
status: { type: 'string' as const, validate: createEnumValidator(VALID_IDEA_STATUSES) },
|
|
40
|
-
doc_url: { type: 'string' as const },
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const getIdeaSchema = {
|
|
44
|
-
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const getIdeasSchema = {
|
|
48
|
-
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
49
|
-
status: { type: 'string' as const, validate: createEnumValidator(VALID_IDEA_STATUSES) },
|
|
50
|
-
limit: { type: 'number' as const, default: 10 },
|
|
51
|
-
offset: { type: 'number' as const, default: 0 },
|
|
52
|
-
search_query: { type: 'string' as const },
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const deleteIdeaSchema = {
|
|
56
|
-
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
const convertIdeaToTaskSchema = {
|
|
60
|
-
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
61
|
-
priority: { type: 'number' as const, default: 3, validate: priorityValidator },
|
|
62
|
-
estimated_minutes: { type: 'number' as const, validate: minutesValidator },
|
|
63
|
-
update_status: { type: 'boolean' as const, default: true },
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export const addIdea: Handler = async (args, ctx) => {
|
|
67
|
-
const { project_id, title, description, status } = parseArgs(args, addIdeaSchema);
|
|
68
|
-
|
|
69
|
-
const { session } = ctx;
|
|
70
|
-
const apiClient = getApiClient();
|
|
71
|
-
|
|
72
|
-
const response = await apiClient.addIdea(project_id, {
|
|
73
|
-
title,
|
|
74
|
-
description,
|
|
75
|
-
status: status as IdeaStatus | undefined
|
|
76
|
-
}, session.currentSessionId || undefined);
|
|
77
|
-
|
|
78
|
-
if (!response.ok) {
|
|
79
|
-
return { result: { error: response.error || 'Failed to add idea' }, isError: true };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return { result: { success: true, idea_id: response.data?.idea_id, title } };
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
export const updateIdea: Handler = async (args, _ctx) => {
|
|
86
|
-
const { idea_id, title, description, status, doc_url } = parseArgs(args, updateIdeaSchema);
|
|
87
|
-
|
|
88
|
-
const apiClient = getApiClient();
|
|
89
|
-
|
|
90
|
-
const response = await apiClient.updateIdea(idea_id, {
|
|
91
|
-
title,
|
|
92
|
-
description,
|
|
93
|
-
status: status as IdeaStatus | undefined,
|
|
94
|
-
doc_url
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
if (!response.ok) {
|
|
98
|
-
return { result: { error: response.error || 'Failed to update idea' }, isError: true };
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return { result: { success: true, idea_id } };
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Get a single idea by ID.
|
|
106
|
-
* More token-efficient than get_ideas when you need details for a specific idea.
|
|
107
|
-
*/
|
|
108
|
-
export const getIdea: Handler = async (args, _ctx) => {
|
|
109
|
-
const { idea_id } = parseArgs(args, getIdeaSchema);
|
|
110
|
-
|
|
111
|
-
const apiClient = getApiClient();
|
|
112
|
-
const response = await apiClient.proxy<{
|
|
113
|
-
idea: {
|
|
114
|
-
id: string;
|
|
115
|
-
title: string;
|
|
116
|
-
description?: string;
|
|
117
|
-
status: string;
|
|
118
|
-
doc_url?: string;
|
|
119
|
-
created_at: string;
|
|
120
|
-
updated_at: string;
|
|
121
|
-
};
|
|
122
|
-
}>('get_idea', { idea_id });
|
|
123
|
-
|
|
124
|
-
if (!response.ok) {
|
|
125
|
-
return { result: { error: response.error || 'Failed to get idea' }, isError: true };
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return { result: response.data };
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
export const getIdeas: Handler = async (args, _ctx) => {
|
|
132
|
-
const { project_id, status, limit, offset, search_query } = parseArgs(args, getIdeasSchema);
|
|
133
|
-
|
|
134
|
-
const apiClient = getApiClient();
|
|
135
|
-
|
|
136
|
-
const response = await apiClient.getIdeas(project_id, {
|
|
137
|
-
status: status as IdeaStatus | undefined,
|
|
138
|
-
limit: Math.min(limit ?? 10, 100),
|
|
139
|
-
offset,
|
|
140
|
-
search_query
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
if (!response.ok) {
|
|
144
|
-
return { result: { error: response.error || 'Failed to fetch ideas' }, isError: true };
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return {
|
|
148
|
-
result: {
|
|
149
|
-
ideas: response.data?.ideas || [],
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
export const deleteIdea: Handler = async (args, _ctx) => {
|
|
155
|
-
const { idea_id } = parseArgs(args, deleteIdeaSchema);
|
|
156
|
-
|
|
157
|
-
const apiClient = getApiClient();
|
|
158
|
-
|
|
159
|
-
const response = await apiClient.deleteIdea(idea_id);
|
|
160
|
-
|
|
161
|
-
if (!response.ok) {
|
|
162
|
-
return { result: { error: response.error || 'Failed to delete idea' }, isError: true };
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return { result: { success: true } };
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
export const convertIdeaToTask: Handler = async (args, _ctx) => {
|
|
169
|
-
const { idea_id, priority, estimated_minutes, update_status } = parseArgs(args, convertIdeaToTaskSchema);
|
|
170
|
-
|
|
171
|
-
const apiClient = getApiClient();
|
|
172
|
-
|
|
173
|
-
// Use proxy for convert_idea_to_task operation
|
|
174
|
-
const response = await apiClient.proxy<{
|
|
175
|
-
success: boolean;
|
|
176
|
-
task_id?: string;
|
|
177
|
-
task_title?: string;
|
|
178
|
-
idea_id?: string;
|
|
179
|
-
idea_status?: string;
|
|
180
|
-
message?: string;
|
|
181
|
-
error?: string;
|
|
182
|
-
existing_task_id?: string;
|
|
183
|
-
}>('convert_idea_to_task', {
|
|
184
|
-
idea_id,
|
|
185
|
-
priority,
|
|
186
|
-
estimated_minutes,
|
|
187
|
-
update_status
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
if (!response.ok) {
|
|
191
|
-
return { result: { error: response.error || 'Failed to convert idea' }, isError: true };
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return { result: response.data };
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Ideas handlers registry
|
|
199
|
-
*/
|
|
200
|
-
export const ideaHandlers: HandlerRegistry = {
|
|
201
|
-
add_idea: addIdea,
|
|
202
|
-
update_idea: updateIdea,
|
|
203
|
-
get_idea: getIdea,
|
|
204
|
-
get_ideas: getIdeas,
|
|
205
|
-
delete_idea: deleteIdea,
|
|
206
|
-
convert_idea_to_task: convertIdeaToTask,
|
|
207
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Ideas Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles feature ideas tracking:
|
|
5
|
+
* - add_idea
|
|
6
|
+
* - update_idea
|
|
7
|
+
* - get_ideas
|
|
8
|
+
* - delete_idea
|
|
9
|
+
* - convert_idea_to_task
|
|
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
|
+
priorityValidator,
|
|
19
|
+
minutesValidator,
|
|
20
|
+
createEnumValidator,
|
|
21
|
+
} from '../validators.js';
|
|
22
|
+
import { getApiClient } from '../api-client.js';
|
|
23
|
+
|
|
24
|
+
const VALID_IDEA_STATUSES = ['raw', 'exploring', 'planned', 'in_development', 'implemented', 'shipped'] as const;
|
|
25
|
+
type IdeaStatus = typeof VALID_IDEA_STATUSES[number];
|
|
26
|
+
|
|
27
|
+
// Argument schemas for type-safe parsing
|
|
28
|
+
const addIdeaSchema = {
|
|
29
|
+
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
30
|
+
title: { type: 'string' as const, required: true as const },
|
|
31
|
+
description: { type: 'string' as const },
|
|
32
|
+
status: { type: 'string' as const, validate: createEnumValidator(VALID_IDEA_STATUSES) },
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const updateIdeaSchema = {
|
|
36
|
+
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
37
|
+
title: { type: 'string' as const },
|
|
38
|
+
description: { type: 'string' as const },
|
|
39
|
+
status: { type: 'string' as const, validate: createEnumValidator(VALID_IDEA_STATUSES) },
|
|
40
|
+
doc_url: { type: 'string' as const },
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const getIdeaSchema = {
|
|
44
|
+
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const getIdeasSchema = {
|
|
48
|
+
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
49
|
+
status: { type: 'string' as const, validate: createEnumValidator(VALID_IDEA_STATUSES) },
|
|
50
|
+
limit: { type: 'number' as const, default: 10 },
|
|
51
|
+
offset: { type: 'number' as const, default: 0 },
|
|
52
|
+
search_query: { type: 'string' as const },
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const deleteIdeaSchema = {
|
|
56
|
+
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const convertIdeaToTaskSchema = {
|
|
60
|
+
idea_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
61
|
+
priority: { type: 'number' as const, default: 3, validate: priorityValidator },
|
|
62
|
+
estimated_minutes: { type: 'number' as const, validate: minutesValidator },
|
|
63
|
+
update_status: { type: 'boolean' as const, default: true },
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const addIdea: Handler = async (args, ctx) => {
|
|
67
|
+
const { project_id, title, description, status } = parseArgs(args, addIdeaSchema);
|
|
68
|
+
|
|
69
|
+
const { session } = ctx;
|
|
70
|
+
const apiClient = getApiClient();
|
|
71
|
+
|
|
72
|
+
const response = await apiClient.addIdea(project_id, {
|
|
73
|
+
title,
|
|
74
|
+
description,
|
|
75
|
+
status: status as IdeaStatus | undefined
|
|
76
|
+
}, session.currentSessionId || undefined);
|
|
77
|
+
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
return { result: { error: response.error || 'Failed to add idea' }, isError: true };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return { result: { success: true, idea_id: response.data?.idea_id, title } };
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const updateIdea: Handler = async (args, _ctx) => {
|
|
86
|
+
const { idea_id, title, description, status, doc_url } = parseArgs(args, updateIdeaSchema);
|
|
87
|
+
|
|
88
|
+
const apiClient = getApiClient();
|
|
89
|
+
|
|
90
|
+
const response = await apiClient.updateIdea(idea_id, {
|
|
91
|
+
title,
|
|
92
|
+
description,
|
|
93
|
+
status: status as IdeaStatus | undefined,
|
|
94
|
+
doc_url
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
return { result: { error: response.error || 'Failed to update idea' }, isError: true };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return { result: { success: true, idea_id } };
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Get a single idea by ID.
|
|
106
|
+
* More token-efficient than get_ideas when you need details for a specific idea.
|
|
107
|
+
*/
|
|
108
|
+
export const getIdea: Handler = async (args, _ctx) => {
|
|
109
|
+
const { idea_id } = parseArgs(args, getIdeaSchema);
|
|
110
|
+
|
|
111
|
+
const apiClient = getApiClient();
|
|
112
|
+
const response = await apiClient.proxy<{
|
|
113
|
+
idea: {
|
|
114
|
+
id: string;
|
|
115
|
+
title: string;
|
|
116
|
+
description?: string;
|
|
117
|
+
status: string;
|
|
118
|
+
doc_url?: string;
|
|
119
|
+
created_at: string;
|
|
120
|
+
updated_at: string;
|
|
121
|
+
};
|
|
122
|
+
}>('get_idea', { idea_id });
|
|
123
|
+
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
return { result: { error: response.error || 'Failed to get idea' }, isError: true };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return { result: response.data };
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const getIdeas: Handler = async (args, _ctx) => {
|
|
132
|
+
const { project_id, status, limit, offset, search_query } = parseArgs(args, getIdeasSchema);
|
|
133
|
+
|
|
134
|
+
const apiClient = getApiClient();
|
|
135
|
+
|
|
136
|
+
const response = await apiClient.getIdeas(project_id, {
|
|
137
|
+
status: status as IdeaStatus | undefined,
|
|
138
|
+
limit: Math.min(limit ?? 10, 100),
|
|
139
|
+
offset,
|
|
140
|
+
search_query
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
return { result: { error: response.error || 'Failed to fetch ideas' }, isError: true };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
result: {
|
|
149
|
+
ideas: response.data?.ideas || [],
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export const deleteIdea: Handler = async (args, _ctx) => {
|
|
155
|
+
const { idea_id } = parseArgs(args, deleteIdeaSchema);
|
|
156
|
+
|
|
157
|
+
const apiClient = getApiClient();
|
|
158
|
+
|
|
159
|
+
const response = await apiClient.deleteIdea(idea_id);
|
|
160
|
+
|
|
161
|
+
if (!response.ok) {
|
|
162
|
+
return { result: { error: response.error || 'Failed to delete idea' }, isError: true };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return { result: { success: true } };
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export const convertIdeaToTask: Handler = async (args, _ctx) => {
|
|
169
|
+
const { idea_id, priority, estimated_minutes, update_status } = parseArgs(args, convertIdeaToTaskSchema);
|
|
170
|
+
|
|
171
|
+
const apiClient = getApiClient();
|
|
172
|
+
|
|
173
|
+
// Use proxy for convert_idea_to_task operation
|
|
174
|
+
const response = await apiClient.proxy<{
|
|
175
|
+
success: boolean;
|
|
176
|
+
task_id?: string;
|
|
177
|
+
task_title?: string;
|
|
178
|
+
idea_id?: string;
|
|
179
|
+
idea_status?: string;
|
|
180
|
+
message?: string;
|
|
181
|
+
error?: string;
|
|
182
|
+
existing_task_id?: string;
|
|
183
|
+
}>('convert_idea_to_task', {
|
|
184
|
+
idea_id,
|
|
185
|
+
priority,
|
|
186
|
+
estimated_minutes,
|
|
187
|
+
update_status
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
if (!response.ok) {
|
|
191
|
+
return { result: { error: response.error || 'Failed to convert idea' }, isError: true };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return { result: response.data };
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Ideas handlers registry
|
|
199
|
+
*/
|
|
200
|
+
export const ideaHandlers: HandlerRegistry = {
|
|
201
|
+
add_idea: addIdea,
|
|
202
|
+
update_idea: updateIdea,
|
|
203
|
+
get_idea: getIdea,
|
|
204
|
+
get_ideas: getIdeas,
|
|
205
|
+
delete_idea: deleteIdea,
|
|
206
|
+
convert_idea_to_task: convertIdeaToTask,
|
|
207
|
+
};
|
package/src/handlers/index.ts
CHANGED
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Server Handlers
|
|
3
|
-
*
|
|
4
|
-
* This module exports all tool handlers organized by category.
|
|
5
|
-
* Each handler receives a HandlerContext and returns a HandlerResult.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export * from './types.js';
|
|
9
|
-
export * from './milestones.js';
|
|
10
|
-
export * from './session.js';
|
|
11
|
-
export * from './ideas.js';
|
|
12
|
-
export * from './findings.js';
|
|
13
|
-
export * from './blockers.js';
|
|
14
|
-
export * from './decisions.js';
|
|
15
|
-
export * from './progress.js';
|
|
16
|
-
export * from './requests.js';
|
|
17
|
-
export * from './tasks.js';
|
|
18
|
-
export * from './project.js';
|
|
19
|
-
export * from './deployment.js';
|
|
20
|
-
export * from './validation.js';
|
|
21
|
-
export * from './fallback.js';
|
|
22
|
-
export * from './bodies-of-work.js';
|
|
23
|
-
export * from './discovery.js';
|
|
24
|
-
export * from './organizations.js';
|
|
25
|
-
export * from './cost.js';
|
|
26
|
-
export * from './git-issues.js';
|
|
27
|
-
export * from './sprints.js';
|
|
28
|
-
export * from './file-checkouts.js';
|
|
29
|
-
export * from './roles.js';
|
|
30
|
-
export * from './connectors.js';
|
|
31
|
-
export * from './cloud-agents.js';
|
|
32
|
-
export * from './version.js';
|
|
33
|
-
export * from './chat.js';
|
|
34
|
-
|
|
35
|
-
import type { HandlerRegistry } from './types.js';
|
|
36
|
-
import { milestoneHandlers } from './milestones.js';
|
|
37
|
-
import { sessionHandlers } from './session.js';
|
|
38
|
-
import { ideaHandlers } from './ideas.js';
|
|
39
|
-
import { findingHandlers } from './findings.js';
|
|
40
|
-
import { blockerHandlers } from './blockers.js';
|
|
41
|
-
import { decisionHandlers } from './decisions.js';
|
|
42
|
-
import { progressHandlers } from './progress.js';
|
|
43
|
-
import { requestHandlers } from './requests.js';
|
|
44
|
-
import { taskHandlers } from './tasks.js';
|
|
45
|
-
import { projectHandlers } from './project.js';
|
|
46
|
-
import { deploymentHandlers } from './deployment.js';
|
|
47
|
-
import { validationHandlers } from './validation.js';
|
|
48
|
-
import { fallbackHandlers } from './fallback.js';
|
|
49
|
-
import { bodiesOfWorkHandlers } from './bodies-of-work.js';
|
|
50
|
-
import { discoveryHandlers } from './discovery.js';
|
|
51
|
-
import { organizationHandlers } from './organizations.js';
|
|
52
|
-
import { costHandlers } from './cost.js';
|
|
53
|
-
import { gitIssueHandlers } from './git-issues.js';
|
|
54
|
-
import { sprintHandlers } from './sprints.js';
|
|
55
|
-
import { fileCheckoutHandlers } from './file-checkouts.js';
|
|
56
|
-
import { roleHandlers } from './roles.js';
|
|
57
|
-
import { connectorHandlers } from './connectors.js';
|
|
58
|
-
import { cloudAgentHandlers } from './cloud-agents.js';
|
|
59
|
-
import { versionHandlers } from './version.js';
|
|
60
|
-
import { chatHandlers } from './chat.js';
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Build the complete handler registry from all modules
|
|
64
|
-
*/
|
|
65
|
-
export function buildHandlerRegistry(): HandlerRegistry {
|
|
66
|
-
return {
|
|
67
|
-
...milestoneHandlers,
|
|
68
|
-
...sessionHandlers,
|
|
69
|
-
...ideaHandlers,
|
|
70
|
-
...findingHandlers,
|
|
71
|
-
...blockerHandlers,
|
|
72
|
-
...decisionHandlers,
|
|
73
|
-
...progressHandlers,
|
|
74
|
-
...requestHandlers,
|
|
75
|
-
...taskHandlers,
|
|
76
|
-
...projectHandlers,
|
|
77
|
-
...deploymentHandlers,
|
|
78
|
-
...validationHandlers,
|
|
79
|
-
...fallbackHandlers,
|
|
80
|
-
...bodiesOfWorkHandlers,
|
|
81
|
-
...discoveryHandlers,
|
|
82
|
-
...organizationHandlers,
|
|
83
|
-
...costHandlers,
|
|
84
|
-
...gitIssueHandlers,
|
|
85
|
-
...sprintHandlers,
|
|
86
|
-
...fileCheckoutHandlers,
|
|
87
|
-
...roleHandlers,
|
|
88
|
-
...connectorHandlers,
|
|
89
|
-
...cloudAgentHandlers,
|
|
90
|
-
...versionHandlers,
|
|
91
|
-
...chatHandlers,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Handlers
|
|
3
|
+
*
|
|
4
|
+
* This module exports all tool handlers organized by category.
|
|
5
|
+
* Each handler receives a HandlerContext and returns a HandlerResult.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export * from './types.js';
|
|
9
|
+
export * from './milestones.js';
|
|
10
|
+
export * from './session.js';
|
|
11
|
+
export * from './ideas.js';
|
|
12
|
+
export * from './findings.js';
|
|
13
|
+
export * from './blockers.js';
|
|
14
|
+
export * from './decisions.js';
|
|
15
|
+
export * from './progress.js';
|
|
16
|
+
export * from './requests.js';
|
|
17
|
+
export * from './tasks.js';
|
|
18
|
+
export * from './project.js';
|
|
19
|
+
export * from './deployment.js';
|
|
20
|
+
export * from './validation.js';
|
|
21
|
+
export * from './fallback.js';
|
|
22
|
+
export * from './bodies-of-work.js';
|
|
23
|
+
export * from './discovery.js';
|
|
24
|
+
export * from './organizations.js';
|
|
25
|
+
export * from './cost.js';
|
|
26
|
+
export * from './git-issues.js';
|
|
27
|
+
export * from './sprints.js';
|
|
28
|
+
export * from './file-checkouts.js';
|
|
29
|
+
export * from './roles.js';
|
|
30
|
+
export * from './connectors.js';
|
|
31
|
+
export * from './cloud-agents.js';
|
|
32
|
+
export * from './version.js';
|
|
33
|
+
export * from './chat.js';
|
|
34
|
+
|
|
35
|
+
import type { HandlerRegistry } from './types.js';
|
|
36
|
+
import { milestoneHandlers } from './milestones.js';
|
|
37
|
+
import { sessionHandlers } from './session.js';
|
|
38
|
+
import { ideaHandlers } from './ideas.js';
|
|
39
|
+
import { findingHandlers } from './findings.js';
|
|
40
|
+
import { blockerHandlers } from './blockers.js';
|
|
41
|
+
import { decisionHandlers } from './decisions.js';
|
|
42
|
+
import { progressHandlers } from './progress.js';
|
|
43
|
+
import { requestHandlers } from './requests.js';
|
|
44
|
+
import { taskHandlers } from './tasks.js';
|
|
45
|
+
import { projectHandlers } from './project.js';
|
|
46
|
+
import { deploymentHandlers } from './deployment.js';
|
|
47
|
+
import { validationHandlers } from './validation.js';
|
|
48
|
+
import { fallbackHandlers } from './fallback.js';
|
|
49
|
+
import { bodiesOfWorkHandlers } from './bodies-of-work.js';
|
|
50
|
+
import { discoveryHandlers } from './discovery.js';
|
|
51
|
+
import { organizationHandlers } from './organizations.js';
|
|
52
|
+
import { costHandlers } from './cost.js';
|
|
53
|
+
import { gitIssueHandlers } from './git-issues.js';
|
|
54
|
+
import { sprintHandlers } from './sprints.js';
|
|
55
|
+
import { fileCheckoutHandlers } from './file-checkouts.js';
|
|
56
|
+
import { roleHandlers } from './roles.js';
|
|
57
|
+
import { connectorHandlers } from './connectors.js';
|
|
58
|
+
import { cloudAgentHandlers } from './cloud-agents.js';
|
|
59
|
+
import { versionHandlers } from './version.js';
|
|
60
|
+
import { chatHandlers } from './chat.js';
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Build the complete handler registry from all modules
|
|
64
|
+
*/
|
|
65
|
+
export function buildHandlerRegistry(): HandlerRegistry {
|
|
66
|
+
return {
|
|
67
|
+
...milestoneHandlers,
|
|
68
|
+
...sessionHandlers,
|
|
69
|
+
...ideaHandlers,
|
|
70
|
+
...findingHandlers,
|
|
71
|
+
...blockerHandlers,
|
|
72
|
+
...decisionHandlers,
|
|
73
|
+
...progressHandlers,
|
|
74
|
+
...requestHandlers,
|
|
75
|
+
...taskHandlers,
|
|
76
|
+
...projectHandlers,
|
|
77
|
+
...deploymentHandlers,
|
|
78
|
+
...validationHandlers,
|
|
79
|
+
...fallbackHandlers,
|
|
80
|
+
...bodiesOfWorkHandlers,
|
|
81
|
+
...discoveryHandlers,
|
|
82
|
+
...organizationHandlers,
|
|
83
|
+
...costHandlers,
|
|
84
|
+
...gitIssueHandlers,
|
|
85
|
+
...sprintHandlers,
|
|
86
|
+
...fileCheckoutHandlers,
|
|
87
|
+
...roleHandlers,
|
|
88
|
+
...connectorHandlers,
|
|
89
|
+
...cloudAgentHandlers,
|
|
90
|
+
...versionHandlers,
|
|
91
|
+
...chatHandlers,
|
|
92
|
+
};
|
|
93
|
+
}
|