@vibescope/mcp-server 0.0.1

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 +98 -0
  2. package/dist/cli.d.ts +34 -0
  3. package/dist/cli.js +356 -0
  4. package/dist/cli.test.d.ts +1 -0
  5. package/dist/cli.test.js +367 -0
  6. package/dist/handlers/__test-utils__.d.ts +72 -0
  7. package/dist/handlers/__test-utils__.js +176 -0
  8. package/dist/handlers/blockers.d.ts +18 -0
  9. package/dist/handlers/blockers.js +81 -0
  10. package/dist/handlers/bodies-of-work.d.ts +34 -0
  11. package/dist/handlers/bodies-of-work.js +614 -0
  12. package/dist/handlers/checkouts.d.ts +37 -0
  13. package/dist/handlers/checkouts.js +377 -0
  14. package/dist/handlers/cost.d.ts +39 -0
  15. package/dist/handlers/cost.js +247 -0
  16. package/dist/handlers/decisions.d.ts +16 -0
  17. package/dist/handlers/decisions.js +64 -0
  18. package/dist/handlers/deployment.d.ts +36 -0
  19. package/dist/handlers/deployment.js +1062 -0
  20. package/dist/handlers/discovery.d.ts +14 -0
  21. package/dist/handlers/discovery.js +870 -0
  22. package/dist/handlers/fallback.d.ts +18 -0
  23. package/dist/handlers/fallback.js +216 -0
  24. package/dist/handlers/findings.d.ts +18 -0
  25. package/dist/handlers/findings.js +110 -0
  26. package/dist/handlers/git-issues.d.ts +22 -0
  27. package/dist/handlers/git-issues.js +247 -0
  28. package/dist/handlers/ideas.d.ts +19 -0
  29. package/dist/handlers/ideas.js +188 -0
  30. package/dist/handlers/index.d.ts +29 -0
  31. package/dist/handlers/index.js +65 -0
  32. package/dist/handlers/knowledge-query.d.ts +22 -0
  33. package/dist/handlers/knowledge-query.js +253 -0
  34. package/dist/handlers/knowledge.d.ts +12 -0
  35. package/dist/handlers/knowledge.js +108 -0
  36. package/dist/handlers/milestones.d.ts +20 -0
  37. package/dist/handlers/milestones.js +179 -0
  38. package/dist/handlers/organizations.d.ts +36 -0
  39. package/dist/handlers/organizations.js +428 -0
  40. package/dist/handlers/progress.d.ts +14 -0
  41. package/dist/handlers/progress.js +149 -0
  42. package/dist/handlers/project.d.ts +20 -0
  43. package/dist/handlers/project.js +278 -0
  44. package/dist/handlers/requests.d.ts +16 -0
  45. package/dist/handlers/requests.js +131 -0
  46. package/dist/handlers/roles.d.ts +30 -0
  47. package/dist/handlers/roles.js +281 -0
  48. package/dist/handlers/session.d.ts +20 -0
  49. package/dist/handlers/session.js +791 -0
  50. package/dist/handlers/tasks.d.ts +52 -0
  51. package/dist/handlers/tasks.js +1111 -0
  52. package/dist/handlers/tasks.test.d.ts +1 -0
  53. package/dist/handlers/tasks.test.js +431 -0
  54. package/dist/handlers/types.d.ts +94 -0
  55. package/dist/handlers/types.js +1 -0
  56. package/dist/handlers/validation.d.ts +16 -0
  57. package/dist/handlers/validation.js +188 -0
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.js +2707 -0
  60. package/dist/knowledge.d.ts +6 -0
  61. package/dist/knowledge.js +121 -0
  62. package/dist/tools.d.ts +2 -0
  63. package/dist/tools.js +2498 -0
  64. package/dist/utils.d.ts +149 -0
  65. package/dist/utils.js +317 -0
  66. package/dist/utils.test.d.ts +1 -0
  67. package/dist/utils.test.js +532 -0
  68. package/dist/validators.d.ts +35 -0
  69. package/dist/validators.js +111 -0
  70. package/dist/validators.test.d.ts +1 -0
  71. package/dist/validators.test.js +176 -0
  72. package/package.json +44 -0
  73. package/src/cli.test.ts +442 -0
  74. package/src/cli.ts +439 -0
  75. package/src/handlers/__test-utils__.ts +217 -0
  76. package/src/handlers/blockers.test.ts +390 -0
  77. package/src/handlers/blockers.ts +110 -0
  78. package/src/handlers/bodies-of-work.test.ts +1276 -0
  79. package/src/handlers/bodies-of-work.ts +783 -0
  80. package/src/handlers/cost.test.ts +436 -0
  81. package/src/handlers/cost.ts +322 -0
  82. package/src/handlers/decisions.test.ts +401 -0
  83. package/src/handlers/decisions.ts +86 -0
  84. package/src/handlers/deployment.test.ts +516 -0
  85. package/src/handlers/deployment.ts +1289 -0
  86. package/src/handlers/discovery.test.ts +254 -0
  87. package/src/handlers/discovery.ts +969 -0
  88. package/src/handlers/fallback.test.ts +687 -0
  89. package/src/handlers/fallback.ts +260 -0
  90. package/src/handlers/findings.test.ts +565 -0
  91. package/src/handlers/findings.ts +153 -0
  92. package/src/handlers/ideas.test.ts +753 -0
  93. package/src/handlers/ideas.ts +247 -0
  94. package/src/handlers/index.ts +69 -0
  95. package/src/handlers/milestones.test.ts +584 -0
  96. package/src/handlers/milestones.ts +217 -0
  97. package/src/handlers/organizations.test.ts +997 -0
  98. package/src/handlers/organizations.ts +550 -0
  99. package/src/handlers/progress.test.ts +369 -0
  100. package/src/handlers/progress.ts +188 -0
  101. package/src/handlers/project.test.ts +562 -0
  102. package/src/handlers/project.ts +352 -0
  103. package/src/handlers/requests.test.ts +531 -0
  104. package/src/handlers/requests.ts +150 -0
  105. package/src/handlers/session.test.ts +459 -0
  106. package/src/handlers/session.ts +912 -0
  107. package/src/handlers/tasks.test.ts +602 -0
  108. package/src/handlers/tasks.ts +1393 -0
  109. package/src/handlers/types.ts +88 -0
  110. package/src/handlers/validation.test.ts +880 -0
  111. package/src/handlers/validation.ts +223 -0
  112. package/src/index.ts +3205 -0
  113. package/src/knowledge.ts +132 -0
  114. package/src/tmpclaude-0078-cwd +1 -0
  115. package/src/tmpclaude-0ee1-cwd +1 -0
  116. package/src/tmpclaude-2dd5-cwd +1 -0
  117. package/src/tmpclaude-344c-cwd +1 -0
  118. package/src/tmpclaude-3860-cwd +1 -0
  119. package/src/tmpclaude-4b63-cwd +1 -0
  120. package/src/tmpclaude-5c73-cwd +1 -0
  121. package/src/tmpclaude-5ee3-cwd +1 -0
  122. package/src/tmpclaude-6795-cwd +1 -0
  123. package/src/tmpclaude-709e-cwd +1 -0
  124. package/src/tmpclaude-9839-cwd +1 -0
  125. package/src/tmpclaude-d829-cwd +1 -0
  126. package/src/tmpclaude-e072-cwd +1 -0
  127. package/src/tmpclaude-f6ee-cwd +1 -0
  128. package/src/utils.test.ts +681 -0
  129. package/src/utils.ts +375 -0
  130. package/src/validators.test.ts +223 -0
  131. package/src/validators.ts +122 -0
  132. package/tmpclaude-0439-cwd +1 -0
  133. package/tmpclaude-132f-cwd +1 -0
  134. package/tmpclaude-15bb-cwd +1 -0
  135. package/tmpclaude-165a-cwd +1 -0
  136. package/tmpclaude-1ba9-cwd +1 -0
  137. package/tmpclaude-21a3-cwd +1 -0
  138. package/tmpclaude-2a38-cwd +1 -0
  139. package/tmpclaude-2adf-cwd +1 -0
  140. package/tmpclaude-2f56-cwd +1 -0
  141. package/tmpclaude-3626-cwd +1 -0
  142. package/tmpclaude-3727-cwd +1 -0
  143. package/tmpclaude-40bc-cwd +1 -0
  144. package/tmpclaude-436f-cwd +1 -0
  145. package/tmpclaude-4783-cwd +1 -0
  146. package/tmpclaude-4b6d-cwd +1 -0
  147. package/tmpclaude-4ba4-cwd +1 -0
  148. package/tmpclaude-51e6-cwd +1 -0
  149. package/tmpclaude-5ecf-cwd +1 -0
  150. package/tmpclaude-6f97-cwd +1 -0
  151. package/tmpclaude-7fb2-cwd +1 -0
  152. package/tmpclaude-825c-cwd +1 -0
  153. package/tmpclaude-8baf-cwd +1 -0
  154. package/tmpclaude-8d9f-cwd +1 -0
  155. package/tmpclaude-975c-cwd +1 -0
  156. package/tmpclaude-9983-cwd +1 -0
  157. package/tmpclaude-a045-cwd +1 -0
  158. package/tmpclaude-ac4a-cwd +1 -0
  159. package/tmpclaude-b593-cwd +1 -0
  160. package/tmpclaude-b891-cwd +1 -0
  161. package/tmpclaude-c032-cwd +1 -0
  162. package/tmpclaude-cf43-cwd +1 -0
  163. package/tmpclaude-d040-cwd +1 -0
  164. package/tmpclaude-dcdd-cwd +1 -0
  165. package/tmpclaude-dcee-cwd +1 -0
  166. package/tmpclaude-e16b-cwd +1 -0
  167. package/tmpclaude-ecd2-cwd +1 -0
  168. package/tmpclaude-f48d-cwd +1 -0
  169. package/tsconfig.json +16 -0
  170. package/vitest.config.ts +13 -0
@@ -0,0 +1,217 @@
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
+
12
+ import type { Handler, HandlerRegistry } from './types.js';
13
+ import { ValidationError, validateRequired, validateUUID } from '../validators.js';
14
+
15
+ export const addMilestone: Handler = async (args, ctx) => {
16
+ const { task_id, title, description, order_index } = args as {
17
+ task_id: string;
18
+ title: string;
19
+ description?: string;
20
+ order_index?: number;
21
+ };
22
+
23
+ validateRequired(task_id, 'task_id');
24
+ validateUUID(task_id, 'task_id');
25
+ validateRequired(title, 'title');
26
+
27
+ const { supabase, session } = ctx;
28
+
29
+ // Verify task exists
30
+ const { data: task, error: taskError } = await supabase
31
+ .from('tasks')
32
+ .select('id, project_id')
33
+ .eq('id', task_id)
34
+ .single();
35
+
36
+ if (taskError || !task) {
37
+ throw new Error('Task not found');
38
+ }
39
+
40
+ // Get the next order_index if not provided
41
+ let orderIdx = order_index;
42
+ if (orderIdx === undefined) {
43
+ const { data: maxOrder } = await supabase
44
+ .from('task_milestones')
45
+ .select('order_index')
46
+ .eq('task_id', task_id)
47
+ .order('order_index', { ascending: false })
48
+ .limit(1)
49
+ .single();
50
+
51
+ orderIdx = maxOrder ? maxOrder.order_index + 1 : 0;
52
+ }
53
+
54
+ const { data: milestone, error } = await supabase
55
+ .from('task_milestones')
56
+ .insert({
57
+ task_id,
58
+ title,
59
+ description: description || null,
60
+ order_index: orderIdx,
61
+ created_by: 'agent',
62
+ created_by_session_id: session.currentSessionId,
63
+ })
64
+ .select()
65
+ .single();
66
+
67
+ if (error) throw error;
68
+
69
+ return {
70
+ result: {
71
+ success: true,
72
+ milestone,
73
+ },
74
+ };
75
+ };
76
+
77
+ export const updateMilestone: Handler = async (args, ctx) => {
78
+ const { milestone_id, title, description, status, order_index } = args as {
79
+ milestone_id: string;
80
+ title?: string;
81
+ description?: string;
82
+ status?: string;
83
+ order_index?: number;
84
+ };
85
+
86
+ validateRequired(milestone_id, 'milestone_id');
87
+ validateUUID(milestone_id, 'milestone_id');
88
+
89
+ const updates: Record<string, unknown> = {};
90
+ if (title !== undefined) updates.title = title;
91
+ if (description !== undefined) updates.description = description;
92
+ if (order_index !== undefined) updates.order_index = order_index;
93
+ if (status !== undefined) {
94
+ if (!['pending', 'in_progress', 'completed'].includes(status)) {
95
+ throw new ValidationError('status must be pending, in_progress, or completed');
96
+ }
97
+ updates.status = status;
98
+ if (status === 'completed') {
99
+ updates.completed_at = new Date().toISOString();
100
+ } else {
101
+ updates.completed_at = null;
102
+ }
103
+ }
104
+
105
+ if (Object.keys(updates).length === 0) {
106
+ throw new ValidationError('At least one field to update is required');
107
+ }
108
+
109
+ const { data: milestone, error } = await ctx.supabase
110
+ .from('task_milestones')
111
+ .update(updates)
112
+ .eq('id', milestone_id)
113
+ .select()
114
+ .single();
115
+
116
+ if (error) throw error;
117
+
118
+ return {
119
+ result: {
120
+ success: true,
121
+ milestone,
122
+ },
123
+ };
124
+ };
125
+
126
+ export const completeMilestone: Handler = async (args, ctx) => {
127
+ const { milestone_id } = args as { milestone_id: string };
128
+
129
+ validateRequired(milestone_id, 'milestone_id');
130
+ validateUUID(milestone_id, 'milestone_id');
131
+
132
+ const { data: milestone, error } = await ctx.supabase
133
+ .from('task_milestones')
134
+ .update({
135
+ status: 'completed',
136
+ completed_at: new Date().toISOString(),
137
+ })
138
+ .eq('id', milestone_id)
139
+ .select()
140
+ .single();
141
+
142
+ if (error) throw error;
143
+
144
+ return {
145
+ result: {
146
+ success: true,
147
+ milestone,
148
+ },
149
+ };
150
+ };
151
+
152
+ export const deleteMilestone: Handler = async (args, ctx) => {
153
+ const { milestone_id } = args as { milestone_id: string };
154
+
155
+ validateRequired(milestone_id, 'milestone_id');
156
+ validateUUID(milestone_id, 'milestone_id');
157
+
158
+ const { error } = await ctx.supabase
159
+ .from('task_milestones')
160
+ .delete()
161
+ .eq('id', milestone_id);
162
+
163
+ if (error) throw error;
164
+
165
+ return {
166
+ result: {
167
+ success: true,
168
+ message: 'Milestone deleted',
169
+ },
170
+ };
171
+ };
172
+
173
+ export const getMilestones: Handler = async (args, ctx) => {
174
+ const { task_id } = args as { task_id: string };
175
+
176
+ validateRequired(task_id, 'task_id');
177
+ validateUUID(task_id, 'task_id');
178
+
179
+ const { data: milestones, error } = await ctx.supabase
180
+ .from('task_milestones')
181
+ .select('*')
182
+ .eq('task_id', task_id)
183
+ .order('order_index', { ascending: true });
184
+
185
+ if (error) throw error;
186
+
187
+ // Calculate progress stats
188
+ const total = milestones?.length || 0;
189
+ const completed = milestones?.filter(m => m.status === 'completed').length || 0;
190
+ const in_progress = milestones?.filter(m => m.status === 'in_progress').length || 0;
191
+ const pending = total - completed - in_progress;
192
+ const progress_percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
193
+
194
+ return {
195
+ result: {
196
+ milestones: milestones || [],
197
+ stats: {
198
+ total,
199
+ completed,
200
+ in_progress,
201
+ pending,
202
+ progress_percentage,
203
+ },
204
+ },
205
+ };
206
+ };
207
+
208
+ /**
209
+ * Milestone handlers registry
210
+ */
211
+ export const milestoneHandlers: HandlerRegistry = {
212
+ add_milestone: addMilestone,
213
+ update_milestone: updateMilestone,
214
+ complete_milestone: completeMilestone,
215
+ delete_milestone: deleteMilestone,
216
+ get_milestones: getMilestones,
217
+ };