@vibescope/mcp-server 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +113 -98
  2. package/dist/api-client.d.ts +1114 -0
  3. package/dist/api-client.js +698 -0
  4. package/dist/cli.d.ts +1 -6
  5. package/dist/cli.js +39 -240
  6. package/dist/config/tool-categories.d.ts +31 -0
  7. package/dist/config/tool-categories.js +253 -0
  8. package/dist/handlers/blockers.js +57 -58
  9. package/dist/handlers/bodies-of-work.d.ts +2 -0
  10. package/dist/handlers/bodies-of-work.js +106 -476
  11. package/dist/handlers/cost.d.ts +1 -0
  12. package/dist/handlers/cost.js +35 -113
  13. package/dist/handlers/decisions.d.ts +2 -0
  14. package/dist/handlers/decisions.js +28 -27
  15. package/dist/handlers/deployment.js +112 -828
  16. package/dist/handlers/discovery.js +31 -0
  17. package/dist/handlers/fallback.d.ts +2 -0
  18. package/dist/handlers/fallback.js +39 -134
  19. package/dist/handlers/findings.js +43 -67
  20. package/dist/handlers/git-issues.d.ts +9 -13
  21. package/dist/handlers/git-issues.js +80 -225
  22. package/dist/handlers/ideas.d.ts +3 -0
  23. package/dist/handlers/ideas.js +53 -134
  24. package/dist/handlers/index.d.ts +2 -0
  25. package/dist/handlers/index.js +6 -0
  26. package/dist/handlers/milestones.d.ts +2 -0
  27. package/dist/handlers/milestones.js +51 -98
  28. package/dist/handlers/organizations.js +79 -275
  29. package/dist/handlers/progress.d.ts +2 -0
  30. package/dist/handlers/progress.js +25 -123
  31. package/dist/handlers/project.js +42 -221
  32. package/dist/handlers/requests.d.ts +2 -0
  33. package/dist/handlers/requests.js +23 -83
  34. package/dist/handlers/session.js +99 -585
  35. package/dist/handlers/sprints.d.ts +32 -0
  36. package/dist/handlers/sprints.js +274 -0
  37. package/dist/handlers/tasks.d.ts +7 -10
  38. package/dist/handlers/tasks.js +230 -900
  39. package/dist/handlers/tool-docs.d.ts +8 -0
  40. package/dist/handlers/tool-docs.js +657 -0
  41. package/dist/handlers/types.d.ts +11 -3
  42. package/dist/handlers/validation.d.ts +1 -1
  43. package/dist/handlers/validation.js +26 -153
  44. package/dist/index.js +473 -160
  45. package/dist/knowledge.js +106 -9
  46. package/dist/tools.js +4 -0
  47. package/dist/validators.d.ts +21 -0
  48. package/dist/validators.js +91 -0
  49. package/package.json +2 -3
  50. package/src/api-client.ts +1752 -0
  51. package/src/cli.test.ts +128 -302
  52. package/src/cli.ts +41 -285
  53. package/src/handlers/__test-setup__.ts +210 -0
  54. package/src/handlers/__test-utils__.ts +4 -134
  55. package/src/handlers/blockers.test.ts +114 -124
  56. package/src/handlers/blockers.ts +68 -70
  57. package/src/handlers/bodies-of-work.test.ts +236 -831
  58. package/src/handlers/bodies-of-work.ts +194 -525
  59. package/src/handlers/cost.test.ts +149 -113
  60. package/src/handlers/cost.ts +44 -132
  61. package/src/handlers/decisions.test.ts +111 -209
  62. package/src/handlers/decisions.ts +35 -27
  63. package/src/handlers/deployment.test.ts +193 -239
  64. package/src/handlers/deployment.ts +140 -895
  65. package/src/handlers/discovery.test.ts +20 -67
  66. package/src/handlers/discovery.ts +32 -0
  67. package/src/handlers/fallback.test.ts +128 -361
  68. package/src/handlers/fallback.ts +62 -148
  69. package/src/handlers/findings.test.ts +127 -345
  70. package/src/handlers/findings.ts +49 -66
  71. package/src/handlers/git-issues.test.ts +623 -0
  72. package/src/handlers/git-issues.ts +174 -0
  73. package/src/handlers/ideas.test.ts +229 -343
  74. package/src/handlers/ideas.ts +69 -143
  75. package/src/handlers/index.ts +6 -0
  76. package/src/handlers/milestones.test.ts +167 -281
  77. package/src/handlers/milestones.ts +54 -93
  78. package/src/handlers/organizations.test.ts +275 -467
  79. package/src/handlers/organizations.ts +84 -294
  80. package/src/handlers/progress.test.ts +112 -218
  81. package/src/handlers/progress.ts +29 -142
  82. package/src/handlers/project.test.ts +203 -226
  83. package/src/handlers/project.ts +48 -238
  84. package/src/handlers/requests.test.ts +74 -342
  85. package/src/handlers/requests.ts +25 -83
  86. package/src/handlers/session.test.ts +241 -206
  87. package/src/handlers/session.ts +110 -657
  88. package/src/handlers/sprints.test.ts +711 -0
  89. package/src/handlers/sprints.ts +497 -0
  90. package/src/handlers/tasks.test.ts +608 -353
  91. package/src/handlers/tasks.ts +248 -1025
  92. package/src/handlers/types.ts +12 -4
  93. package/src/handlers/validation.test.ts +189 -572
  94. package/src/handlers/validation.ts +29 -166
  95. package/src/index.ts +473 -184
  96. package/src/knowledge.ts +107 -9
  97. package/src/tools.ts +2506 -0
  98. package/src/validators.test.ts +223 -223
  99. package/src/validators.ts +127 -0
  100. package/tsconfig.json +1 -1
  101. package/vitest.config.ts +14 -13
  102. package/dist/cli.test.d.ts +0 -1
  103. package/dist/cli.test.js +0 -367
  104. package/dist/handlers/__test-utils__.d.ts +0 -72
  105. package/dist/handlers/__test-utils__.js +0 -176
  106. package/dist/handlers/checkouts.d.ts +0 -37
  107. package/dist/handlers/checkouts.js +0 -377
  108. package/dist/handlers/knowledge-query.d.ts +0 -22
  109. package/dist/handlers/knowledge-query.js +0 -253
  110. package/dist/handlers/knowledge.d.ts +0 -12
  111. package/dist/handlers/knowledge.js +0 -108
  112. package/dist/handlers/roles.d.ts +0 -30
  113. package/dist/handlers/roles.js +0 -281
  114. package/dist/handlers/tasks.test.d.ts +0 -1
  115. package/dist/handlers/tasks.test.js +0 -431
  116. package/dist/utils.test.d.ts +0 -1
  117. package/dist/utils.test.js +0 -532
  118. package/dist/validators.test.d.ts +0 -1
  119. package/dist/validators.test.js +0 -176
  120. package/src/tmpclaude-0078-cwd +0 -1
  121. package/src/tmpclaude-0ee1-cwd +0 -1
  122. package/src/tmpclaude-2dd5-cwd +0 -1
  123. package/src/tmpclaude-344c-cwd +0 -1
  124. package/src/tmpclaude-3860-cwd +0 -1
  125. package/src/tmpclaude-4b63-cwd +0 -1
  126. package/src/tmpclaude-5c73-cwd +0 -1
  127. package/src/tmpclaude-5ee3-cwd +0 -1
  128. package/src/tmpclaude-6795-cwd +0 -1
  129. package/src/tmpclaude-709e-cwd +0 -1
  130. package/src/tmpclaude-9839-cwd +0 -1
  131. package/src/tmpclaude-d829-cwd +0 -1
  132. package/src/tmpclaude-e072-cwd +0 -1
  133. package/src/tmpclaude-f6ee-cwd +0 -1
  134. package/tmpclaude-0439-cwd +0 -1
  135. package/tmpclaude-132f-cwd +0 -1
  136. package/tmpclaude-15bb-cwd +0 -1
  137. package/tmpclaude-165a-cwd +0 -1
  138. package/tmpclaude-1ba9-cwd +0 -1
  139. package/tmpclaude-21a3-cwd +0 -1
  140. package/tmpclaude-2a38-cwd +0 -1
  141. package/tmpclaude-2adf-cwd +0 -1
  142. package/tmpclaude-2f56-cwd +0 -1
  143. package/tmpclaude-3626-cwd +0 -1
  144. package/tmpclaude-3727-cwd +0 -1
  145. package/tmpclaude-40bc-cwd +0 -1
  146. package/tmpclaude-436f-cwd +0 -1
  147. package/tmpclaude-4783-cwd +0 -1
  148. package/tmpclaude-4b6d-cwd +0 -1
  149. package/tmpclaude-4ba4-cwd +0 -1
  150. package/tmpclaude-51e6-cwd +0 -1
  151. package/tmpclaude-5ecf-cwd +0 -1
  152. package/tmpclaude-6f97-cwd +0 -1
  153. package/tmpclaude-7fb2-cwd +0 -1
  154. package/tmpclaude-825c-cwd +0 -1
  155. package/tmpclaude-8baf-cwd +0 -1
  156. package/tmpclaude-8d9f-cwd +0 -1
  157. package/tmpclaude-975c-cwd +0 -1
  158. package/tmpclaude-9983-cwd +0 -1
  159. package/tmpclaude-a045-cwd +0 -1
  160. package/tmpclaude-ac4a-cwd +0 -1
  161. package/tmpclaude-b593-cwd +0 -1
  162. package/tmpclaude-b891-cwd +0 -1
  163. package/tmpclaude-c032-cwd +0 -1
  164. package/tmpclaude-cf43-cwd +0 -1
  165. package/tmpclaude-d040-cwd +0 -1
  166. package/tmpclaude-dcdd-cwd +0 -1
  167. package/tmpclaude-dcee-cwd +0 -1
  168. package/tmpclaude-e16b-cwd +0 -1
  169. package/tmpclaude-ecd2-cwd +0 -1
  170. package/tmpclaude-f48d-cwd +0 -1
@@ -6,10 +6,14 @@
6
6
  * - update_idea
7
7
  * - get_ideas
8
8
  * - delete_idea
9
+ * - convert_idea_to_task
10
+ *
11
+ * MIGRATED: Uses Vibescope API client instead of direct Supabase
9
12
  */
10
13
 
11
14
  import type { Handler, HandlerRegistry } from './types.js';
12
15
  import { validateRequired, validateUUID, validatePriority, validateEstimatedMinutes } from '../validators.js';
16
+ import { getApiClient } from '../api-client.js';
13
17
 
14
18
  type IdeaStatus = 'raw' | 'exploring' | 'planned' | 'in_development' | 'shipped';
15
19
 
@@ -25,24 +29,20 @@ export const addIdea: Handler = async (args, ctx) => {
25
29
  validateUUID(project_id, 'project_id');
26
30
  validateRequired(title, 'title');
27
31
 
28
- const { supabase, session } = ctx;
32
+ const { session } = ctx;
33
+ const apiClient = getApiClient();
29
34
 
30
- const { data, error } = await supabase
31
- .from('ideas')
32
- .insert({
33
- project_id,
34
- title,
35
- description: description || null,
36
- status: status || 'raw',
37
- created_by: 'agent',
38
- created_by_session_id: session.currentSessionId,
39
- })
40
- .select('id')
41
- .single();
35
+ const response = await apiClient.addIdea(project_id, {
36
+ title,
37
+ description,
38
+ status
39
+ }, session.currentSessionId || undefined);
42
40
 
43
- if (error) throw new Error(`Failed to add idea: ${error.message}`);
41
+ if (!response.ok) {
42
+ throw new Error(`Failed to add idea: ${response.error}`);
43
+ }
44
44
 
45
- return { result: { success: true, idea_id: data.id, title } };
45
+ return { result: { success: true, idea_id: response.data?.idea_id, title } };
46
46
  };
47
47
 
48
48
  export const updateIdea: Handler = async (args, ctx) => {
@@ -57,67 +57,52 @@ export const updateIdea: Handler = async (args, ctx) => {
57
57
  validateRequired(idea_id, 'idea_id');
58
58
  validateUUID(idea_id, 'idea_id');
59
59
 
60
- const { supabase } = ctx;
61
-
62
- // Get current idea status
63
- const { data: existingIdea } = await supabase
64
- .from('ideas')
65
- .select('status')
66
- .eq('id', idea_id)
67
- .single();
60
+ const apiClient = getApiClient();
68
61
 
69
- if (!existingIdea) {
70
- throw new Error(`Idea not found: ${idea_id}`);
71
- }
62
+ const response = await apiClient.updateIdea(idea_id, {
63
+ title,
64
+ description,
65
+ status,
66
+ doc_url
67
+ });
72
68
 
73
- // Build update object
74
- const updates: Record<string, unknown> = { updated_at: new Date().toISOString() };
75
- if (title !== undefined) updates.title = title;
76
- if (description !== undefined) updates.description = description;
77
- if (doc_url !== undefined) updates.doc_url = doc_url;
78
- if (status !== undefined) {
79
- updates.status = status;
80
- // Set planned_at when transitioning to planned status
81
- if (status === 'planned' && existingIdea.status !== 'planned') {
82
- updates.planned_at = new Date().toISOString();
83
- }
69
+ if (!response.ok) {
70
+ throw new Error(`Failed to update idea: ${response.error}`);
84
71
  }
85
72
 
86
- const { error } = await supabase
87
- .from('ideas')
88
- .update(updates)
89
- .eq('id', idea_id);
90
-
91
- if (error) throw new Error(`Failed to update idea: ${error.message}`);
92
-
93
73
  return { result: { success: true, idea_id } };
94
74
  };
95
75
 
96
76
  export const getIdeas: Handler = async (args, ctx) => {
97
- const { project_id, status } = args as {
77
+ const { project_id, status, limit = 50, offset = 0, search_query } = args as {
98
78
  project_id: string;
99
79
  status?: IdeaStatus;
80
+ limit?: number;
81
+ offset?: number;
82
+ search_query?: string;
100
83
  };
101
84
 
102
85
  validateRequired(project_id, 'project_id');
103
86
  validateUUID(project_id, 'project_id');
104
87
 
105
- const { supabase } = ctx;
88
+ const apiClient = getApiClient();
106
89
 
107
- let query = supabase
108
- .from('ideas')
109
- .select('id, title, description, status, doc_url')
110
- .eq('project_id', project_id);
90
+ const response = await apiClient.getIdeas(project_id, {
91
+ status,
92
+ limit,
93
+ offset,
94
+ search_query
95
+ });
111
96
 
112
- if (status) {
113
- query = query.eq('status', status);
97
+ if (!response.ok) {
98
+ throw new Error(`Failed to fetch ideas: ${response.error}`);
114
99
  }
115
100
 
116
- const { data, error } = await query.order('created_at', { ascending: false });
117
-
118
- if (error) throw new Error(`Failed to fetch ideas: ${error.message}`);
119
-
120
- return { result: { ideas: data || [] } };
101
+ return {
102
+ result: {
103
+ ideas: response.data?.ideas || [],
104
+ },
105
+ };
121
106
  };
122
107
 
123
108
  export const deleteIdea: Handler = async (args, ctx) => {
@@ -126,12 +111,13 @@ export const deleteIdea: Handler = async (args, ctx) => {
126
111
  validateRequired(idea_id, 'idea_id');
127
112
  validateUUID(idea_id, 'idea_id');
128
113
 
129
- const { error } = await ctx.supabase
130
- .from('ideas')
131
- .delete()
132
- .eq('id', idea_id);
114
+ const apiClient = getApiClient();
133
115
 
134
- if (error) throw new Error(`Failed to delete idea: ${error.message}`);
116
+ const response = await apiClient.deleteIdea(idea_id);
117
+
118
+ if (!response.ok) {
119
+ throw new Error(`Failed to delete idea: ${response.error}`);
120
+ }
135
121
 
136
122
  return { result: { success: true } };
137
123
  };
@@ -149,90 +135,30 @@ export const convertIdeaToTask: Handler = async (args, ctx) => {
149
135
  validatePriority(priority);
150
136
  validateEstimatedMinutes(estimated_minutes);
151
137
 
152
- const { supabase, session } = ctx;
153
- const currentSessionId = session.currentSessionId;
154
-
155
- // Get the idea
156
- const { data: idea, error: fetchError } = await supabase
157
- .from('ideas')
158
- .select('id, project_id, title, description, status, converted_to_task_id')
159
- .eq('id', idea_id)
160
- .single();
161
-
162
- if (fetchError || !idea) {
163
- throw new Error(`Idea not found: ${idea_id}`);
164
- }
165
-
166
- // Check if already converted
167
- if (idea.converted_to_task_id) {
168
- return {
169
- result: {
170
- success: false,
171
- error: 'Idea has already been converted to a task',
172
- existing_task_id: idea.converted_to_task_id,
173
- hint: 'Use get_tasks to find the existing task',
174
- },
175
- };
176
- }
177
-
178
- // Create the task
179
- const { data: task, error: taskError } = await supabase
180
- .from('tasks')
181
- .insert({
182
- project_id: idea.project_id,
183
- title: idea.title,
184
- description: idea.description || `Converted from idea: ${idea.title}`,
185
- priority,
186
- estimated_minutes: estimated_minutes || null,
187
- created_by: 'agent',
188
- created_by_session_id: currentSessionId,
189
- })
190
- .select('id, title')
191
- .single();
192
-
193
- if (taskError || !task) {
194
- throw new Error(`Failed to create task: ${taskError?.message}`);
195
- }
196
-
197
- // Update the idea with the task reference and optionally update status
198
- const ideaUpdates: Record<string, unknown> = {
199
- converted_to_task_id: task.id,
200
- updated_at: new Date().toISOString(),
201
- };
202
-
203
- if (update_status && idea.status !== 'shipped') {
204
- ideaUpdates.status = 'in_development';
205
- }
206
-
207
- const { error: updateError } = await supabase
208
- .from('ideas')
209
- .update(ideaUpdates)
210
- .eq('id', idea_id);
138
+ const apiClient = getApiClient();
139
+
140
+ // Use proxy for convert_idea_to_task operation
141
+ const response = await apiClient.proxy<{
142
+ success: boolean;
143
+ task_id?: string;
144
+ task_title?: string;
145
+ idea_id?: string;
146
+ idea_status?: string;
147
+ message?: string;
148
+ error?: string;
149
+ existing_task_id?: string;
150
+ }>('convert_idea_to_task', {
151
+ idea_id,
152
+ priority,
153
+ estimated_minutes,
154
+ update_status
155
+ });
211
156
 
212
- if (updateError) {
213
- // Log but don't fail - task was created successfully
214
- console.error(`Failed to update idea after conversion: ${updateError.message}`);
157
+ if (!response.ok) {
158
+ throw new Error(`Failed to convert idea: ${response.error}`);
215
159
  }
216
160
 
217
- // Log progress
218
- await supabase.from('progress_logs').insert({
219
- project_id: idea.project_id,
220
- task_id: task.id,
221
- summary: `Converted idea "${idea.title}" to task`,
222
- created_by: 'agent',
223
- created_by_session_id: currentSessionId,
224
- });
225
-
226
- return {
227
- result: {
228
- success: true,
229
- task_id: task.id,
230
- task_title: task.title,
231
- idea_id: idea.id,
232
- idea_status: update_status ? 'in_development' : idea.status,
233
- message: `Created task from idea. Start with: update_task(task_id: "${task.id}", status: "in_progress")`,
234
- },
235
- };
161
+ return { result: response.data };
236
162
  };
237
163
 
238
164
  /**
@@ -23,6 +23,8 @@ export * from './bodies-of-work.js';
23
23
  export * from './discovery.js';
24
24
  export * from './organizations.js';
25
25
  export * from './cost.js';
26
+ export * from './git-issues.js';
27
+ export * from './sprints.js';
26
28
 
27
29
  import type { HandlerRegistry } from './types.js';
28
30
  import { milestoneHandlers } from './milestones.js';
@@ -42,6 +44,8 @@ import { bodiesOfWorkHandlers } from './bodies-of-work.js';
42
44
  import { discoveryHandlers } from './discovery.js';
43
45
  import { organizationHandlers } from './organizations.js';
44
46
  import { costHandlers } from './cost.js';
47
+ import { gitIssueHandlers } from './git-issues.js';
48
+ import { sprintHandlers } from './sprints.js';
45
49
 
46
50
  /**
47
51
  * Build the complete handler registry from all modules
@@ -65,5 +69,7 @@ export function buildHandlerRegistry(): HandlerRegistry {
65
69
  ...discoveryHandlers,
66
70
  ...organizationHandlers,
67
71
  ...costHandlers,
72
+ ...gitIssueHandlers,
73
+ ...sprintHandlers,
68
74
  };
69
75
  }