@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
@@ -183,6 +183,12 @@ const TOOL_CATEGORIES = {
183
183
  { name: 'get_task_costs', brief: 'Cost per task' },
184
184
  ],
185
185
  },
186
+ knowledge: {
187
+ description: 'Queryable knowledge base from project data',
188
+ tools: [
189
+ { name: 'query_knowledge_base', brief: 'Aggregated project knowledge in one call' },
190
+ ],
191
+ },
186
192
  };
187
193
  // Detailed tool info (fetched on-demand)
188
194
  const TOOL_INFO = {
@@ -809,6 +815,31 @@ Get cost breakdown by task for a project.
809
815
  - limit: Max tasks to return (default: 20)
810
816
 
811
817
  **Returns:** Tasks sorted by estimated cost with model breakdown`,
818
+ // Knowledge base tools
819
+ query_knowledge_base: `# query_knowledge_base
820
+ Query aggregated project knowledge in a single call. Reduces token usage by combining multiple data sources.
821
+
822
+ **Parameters:**
823
+ - project_id (required): Project UUID
824
+ - scope: 'summary' (default) or 'detailed' (includes rationales, descriptions)
825
+ - categories: Array of categories to include (default: all)
826
+ - findings: Audit findings (security, performance, code quality)
827
+ - qa: Questions and answers
828
+ - decisions: Architectural decisions
829
+ - completed_tasks: Tasks with completion summaries
830
+ - blockers: Resolved blockers with resolution notes
831
+ - progress: Recent progress logs
832
+ - limit: Max items per category (default: 5, max: 20)
833
+ - search_query: Optional text search across all knowledge
834
+
835
+ **Returns:**
836
+ - project: name, goal, tech_stack
837
+ - stats: counts for each category, findings by severity
838
+ - Category data based on selection
839
+
840
+ **Token savings:** Replaces up to 6 separate tool calls (get_findings, get_decisions, get_tasks, get_blockers, etc.) with one call.
841
+
842
+ **Example:** query_knowledge_base(project_id, categories: ["findings", "decisions"], limit: 10)`,
812
843
  };
813
844
  export const discoverTools = async (args) => {
814
845
  const { category } = args;
@@ -6,6 +6,8 @@
6
6
  * - stop_fallback_activity
7
7
  * - get_activity_history
8
8
  * - get_activity_schedules
9
+ *
10
+ * MIGRATED: Uses Vibescope API client instead of direct Supabase
9
11
  */
10
12
  import type { Handler, HandlerRegistry } from './types.js';
11
13
  export declare const startFallbackActivity: Handler;
@@ -6,9 +6,12 @@
6
6
  * - stop_fallback_activity
7
7
  * - get_activity_history
8
8
  * - get_activity_schedules
9
+ *
10
+ * MIGRATED: Uses Vibescope API client instead of direct Supabase
9
11
  */
10
12
  import { validateRequired, validateUUID } from '../validators.js';
11
13
  import { FALLBACK_ACTIVITIES } from '../utils.js';
14
+ import { getApiClient } from '../api-client.js';
12
15
  const VALID_ACTIVITIES = [
13
16
  'feature_ideation',
14
17
  'code_review',
@@ -29,20 +32,12 @@ export const startFallbackActivity = async (args, ctx) => {
29
32
  if (!VALID_ACTIVITIES.includes(activity)) {
30
33
  throw new Error(`Invalid activity. Must be one of: ${VALID_ACTIVITIES.join(', ')}`);
31
34
  }
32
- const { supabase, session } = ctx;
33
- const currentSessionId = session.currentSessionId;
34
- // Update the current session's fallback activity
35
- const { error: updateError } = await supabase
36
- .from('agent_sessions')
37
- .update({
38
- current_fallback_activity: activity,
39
- current_task_id: null, // Clear any task when starting fallback
40
- status: 'active',
41
- last_synced_at: new Date().toISOString(),
42
- })
43
- .eq('id', currentSessionId);
44
- if (updateError)
45
- throw updateError;
35
+ const { session } = ctx;
36
+ const apiClient = getApiClient();
37
+ const response = await apiClient.startFallbackActivity(project_id, activity, session.currentSessionId || undefined);
38
+ if (!response.ok) {
39
+ throw new Error(`Failed to start fallback activity: ${response.error}`);
40
+ }
46
41
  // Get the activity details for the response
47
42
  const activityInfo = FALLBACK_ACTIVITIES.find((a) => a.activity === activity);
48
43
  return {
@@ -52,7 +47,7 @@ export const startFallbackActivity = async (args, ctx) => {
52
47
  title: activityInfo?.title || activity,
53
48
  description: activityInfo?.description || '',
54
49
  prompt: activityInfo?.prompt || '',
55
- message: `Started fallback activity: ${activityInfo?.title || activity}`,
50
+ message: response.data?.message || `Started fallback activity: ${activityInfo?.title || activity}`,
56
51
  },
57
52
  };
58
53
  };
@@ -60,81 +55,16 @@ export const stopFallbackActivity = async (args, ctx) => {
60
55
  const { project_id, summary } = args;
61
56
  validateRequired(project_id, 'project_id');
62
57
  validateUUID(project_id, 'project_id');
63
- const { supabase, session } = ctx;
64
- const currentSessionId = session.currentSessionId;
65
- // Get the current session's fallback activity before clearing it
66
- const { data: sessionData, error: sessionError } = await supabase
67
- .from('agent_sessions')
68
- .select('current_fallback_activity')
69
- .eq('id', currentSessionId)
70
- .single();
71
- if (sessionError)
72
- throw sessionError;
73
- const activityType = sessionData?.current_fallback_activity;
74
- // Log the activity completion to history if there was an active activity
75
- if (activityType) {
76
- const completedAt = new Date().toISOString();
77
- // Insert history record
78
- await supabase.from('background_activity_history').insert({
79
- project_id,
80
- activity_type: activityType,
81
- completed_at: completedAt,
82
- completed_by_session_id: currentSessionId,
83
- summary: summary || null,
84
- });
85
- // Update schedule if one exists for this activity
86
- const { data: schedule } = await supabase
87
- .from('background_activity_schedules')
88
- .select('*')
89
- .eq('project_id', project_id)
90
- .eq('activity_type', activityType)
91
- .eq('enabled', true)
92
- .single();
93
- if (schedule) {
94
- let nextRunAt = null;
95
- let enabled = true;
96
- // Calculate next run time based on schedule type
97
- const completedDate = new Date(completedAt);
98
- switch (schedule.schedule_type) {
99
- case 'once':
100
- enabled = false;
101
- break;
102
- case 'daily':
103
- completedDate.setDate(completedDate.getDate() + 1);
104
- nextRunAt = completedDate.toISOString();
105
- break;
106
- case 'weekly':
107
- completedDate.setDate(completedDate.getDate() + 7);
108
- nextRunAt = completedDate.toISOString();
109
- break;
110
- case 'monthly':
111
- completedDate.setDate(completedDate.getDate() + 30);
112
- nextRunAt = completedDate.toISOString();
113
- break;
114
- }
115
- await supabase
116
- .from('background_activity_schedules')
117
- .update({ next_run_at: nextRunAt, enabled })
118
- .eq('id', schedule.id);
119
- }
58
+ const { session } = ctx;
59
+ const apiClient = getApiClient();
60
+ const response = await apiClient.stopFallbackActivity(project_id, summary, session.currentSessionId || undefined);
61
+ if (!response.ok) {
62
+ throw new Error(`Failed to stop fallback activity: ${response.error}`);
120
63
  }
121
- // Clear the current session's fallback activity
122
- const { error: updateError } = await supabase
123
- .from('agent_sessions')
124
- .update({
125
- current_fallback_activity: null,
126
- status: 'idle',
127
- last_synced_at: new Date().toISOString(),
128
- })
129
- .eq('id', currentSessionId);
130
- if (updateError)
131
- throw updateError;
132
64
  return {
133
65
  result: {
134
66
  success: true,
135
- message: activityType
136
- ? `Fallback activity '${activityType}' completed and logged to history`
137
- : 'Fallback activity stopped',
67
+ message: 'Fallback activity stopped',
138
68
  },
139
69
  };
140
70
  };
@@ -142,41 +72,21 @@ export const getActivityHistory = async (args, ctx) => {
142
72
  const { project_id, activity_type, limit = 50 } = args;
143
73
  validateRequired(project_id, 'project_id');
144
74
  validateUUID(project_id, 'project_id');
145
- const { supabase } = ctx;
146
- let query = supabase
147
- .from('background_activity_history')
148
- .select(`
149
- id,
150
- activity_type,
151
- completed_at,
152
- completed_by_session_id,
153
- summary,
154
- created_at,
155
- agent_sessions!completed_by_session_id (
156
- agent_name
157
- )
158
- `)
159
- .eq('project_id', project_id)
160
- .order('completed_at', { ascending: false })
161
- .limit(limit);
162
- if (activity_type) {
163
- query = query.eq('activity_type', activity_type);
164
- }
165
- const { data: history, error } = await query;
166
- if (error)
167
- throw error;
168
- // Also get the most recent completion for each activity type
169
- const latestByType = {};
170
- for (const entry of history || []) {
171
- if (!latestByType[entry.activity_type]) {
172
- latestByType[entry.activity_type] = entry;
173
- }
75
+ const apiClient = getApiClient();
76
+ // Use proxy for get_activity_history operation
77
+ const response = await apiClient.proxy('get_activity_history', {
78
+ project_id,
79
+ activity_type,
80
+ limit
81
+ });
82
+ if (!response.ok) {
83
+ throw new Error(`Failed to get activity history: ${response.error}`);
174
84
  }
175
85
  return {
176
86
  result: {
177
- history: history || [],
178
- latest_by_type: latestByType,
179
- count: history?.length || 0,
87
+ history: response.data?.history || [],
88
+ latest_by_type: response.data?.latest_by_type || {},
89
+ count: response.data?.count || 0,
180
90
  },
181
91
  };
182
92
  };
@@ -184,24 +94,19 @@ export const getActivitySchedules = async (args, ctx) => {
184
94
  const { project_id } = args;
185
95
  validateRequired(project_id, 'project_id');
186
96
  validateUUID(project_id, 'project_id');
187
- const { supabase } = ctx;
188
- const { data: schedules, error } = await supabase
189
- .from('background_activity_schedules')
190
- .select('*')
191
- .eq('project_id', project_id)
192
- .order('activity_type');
193
- if (error)
194
- throw error;
195
- // Identify which activities are "due" (next_run_at < now AND enabled)
196
- const now = new Date();
197
- const dueActivities = (schedules || [])
198
- .filter((s) => s.enabled && s.next_run_at && new Date(s.next_run_at) < now)
199
- .map((s) => s.activity_type);
97
+ const apiClient = getApiClient();
98
+ // Use proxy for get_activity_schedules operation
99
+ const response = await apiClient.proxy('get_activity_schedules', {
100
+ project_id
101
+ });
102
+ if (!response.ok) {
103
+ throw new Error(`Failed to get activity schedules: ${response.error}`);
104
+ }
200
105
  return {
201
106
  result: {
202
- schedules: schedules || [],
203
- due_activities: dueActivities,
204
- count: schedules?.length || 0,
107
+ schedules: response.data?.schedules || [],
108
+ due_activities: response.data?.due_activities || [],
109
+ count: response.data?.count || 0,
205
110
  },
206
111
  };
207
112
  };
@@ -8,6 +8,7 @@
8
8
  * - delete_finding
9
9
  */
10
10
  import { validateRequired, validateUUID } from '../validators.js';
11
+ import { getApiClient } from '../api-client.js';
11
12
  export const addFinding = async (args, ctx) => {
12
13
  const { project_id, category, title, description, severity, file_path, line_number, related_task_id } = args;
13
14
  validateRequired(project_id, 'project_id');
@@ -15,89 +16,64 @@ export const addFinding = async (args, ctx) => {
15
16
  validateRequired(title, 'title');
16
17
  if (related_task_id)
17
18
  validateUUID(related_task_id, 'related_task_id');
18
- const { supabase, session } = ctx;
19
- const { data, error } = await supabase
20
- .from('findings')
21
- .insert({
22
- project_id,
23
- category: category || 'other',
19
+ const apiClient = getApiClient();
20
+ const response = await apiClient.addFinding(project_id, {
24
21
  title,
25
- description: description || null,
26
- severity: severity || 'info',
27
- file_path: file_path || null,
28
- line_number: line_number || null,
29
- related_task_id: related_task_id || null,
30
- created_by: 'agent',
31
- created_by_session_id: session.currentSessionId,
32
- })
33
- .select('id')
34
- .single();
35
- if (error)
36
- throw new Error(`Failed to add finding: ${error.message}`);
37
- return { result: { success: true, finding_id: data.id, title } };
22
+ description,
23
+ category,
24
+ severity,
25
+ file_path,
26
+ line_number,
27
+ related_task_id
28
+ }, ctx.session.currentSessionId || undefined);
29
+ if (!response.ok) {
30
+ throw new Error(response.error || 'Failed to add finding');
31
+ }
32
+ return { result: response.data };
38
33
  };
39
34
  export const getFindings = async (args, ctx) => {
40
- const { project_id, category, severity, status, limit } = args;
35
+ const { project_id, category, severity, status, limit = 50, offset = 0, search_query } = args;
41
36
  validateRequired(project_id, 'project_id');
42
37
  validateUUID(project_id, 'project_id');
43
- const { supabase } = ctx;
44
- let query = supabase
45
- .from('findings')
46
- .select('id, title, category, severity, status, file_path, created_at')
47
- .eq('project_id', project_id)
48
- .order('created_at', { ascending: false })
49
- .limit(limit || 50);
50
- if (category)
51
- query = query.eq('category', category);
52
- if (severity)
53
- query = query.eq('severity', severity);
54
- if (status)
55
- query = query.eq('status', status);
56
- const { data, error } = await query;
57
- if (error)
58
- throw new Error(`Failed to get findings: ${error.message}`);
59
- return { result: { findings: data } };
38
+ const apiClient = getApiClient();
39
+ const response = await apiClient.getFindings(project_id, {
40
+ category,
41
+ severity,
42
+ status,
43
+ limit
44
+ });
45
+ if (!response.ok) {
46
+ throw new Error(response.error || 'Failed to get findings');
47
+ }
48
+ return { result: response.data };
60
49
  };
61
50
  export const updateFinding = async (args, ctx) => {
62
51
  const { finding_id, status, resolution_note, title, description, severity } = args;
63
52
  validateRequired(finding_id, 'finding_id');
64
53
  validateUUID(finding_id, 'finding_id');
65
- const { supabase, session } = ctx;
66
- const updates = { updated_at: new Date().toISOString() };
67
- if (title)
68
- updates.title = title;
69
- if (description)
70
- updates.description = description;
71
- if (severity)
72
- updates.severity = severity;
73
- if (status) {
74
- updates.status = status;
75
- if (status === 'addressed' || status === 'dismissed' || status === 'wontfix') {
76
- updates.addressed_at = new Date().toISOString();
77
- updates.addressed_by_session_id = session.currentSessionId;
78
- }
54
+ const apiClient = getApiClient();
55
+ const response = await apiClient.updateFinding(finding_id, {
56
+ title,
57
+ description,
58
+ severity,
59
+ status,
60
+ resolution_note
61
+ });
62
+ if (!response.ok) {
63
+ throw new Error(response.error || 'Failed to update finding');
79
64
  }
80
- if (resolution_note)
81
- updates.resolution_note = resolution_note;
82
- const { error } = await supabase
83
- .from('findings')
84
- .update(updates)
85
- .eq('id', finding_id);
86
- if (error)
87
- throw new Error(`Failed to update finding: ${error.message}`);
88
- return { result: { success: true, finding_id } };
65
+ return { result: response.data };
89
66
  };
90
67
  export const deleteFinding = async (args, ctx) => {
91
68
  const { finding_id } = args;
92
69
  validateRequired(finding_id, 'finding_id');
93
70
  validateUUID(finding_id, 'finding_id');
94
- const { error } = await ctx.supabase
95
- .from('findings')
96
- .delete()
97
- .eq('id', finding_id);
98
- if (error)
99
- throw new Error(`Failed to delete finding: ${error.message}`);
100
- return { result: { success: true } };
71
+ const apiClient = getApiClient();
72
+ const response = await apiClient.deleteFinding(finding_id);
73
+ if (!response.ok) {
74
+ throw new Error(response.error || 'Failed to delete finding');
75
+ }
76
+ return { result: response.data };
101
77
  };
102
78
  /**
103
79
  * Findings handlers registry
@@ -1,22 +1,18 @@
1
1
  /**
2
2
  * Git Issues Handlers
3
3
  *
4
- * Handles git-related issue tracking:
5
- * - get_git_issues
6
- * - create_git_issue
7
- * - resolve_git_issue
8
- * - dismiss_git_issue
4
+ * Handles git issue management:
5
+ * - add_git_issue: Record a git-related issue (conflicts, push failures, etc.)
6
+ * - resolve_git_issue: Mark a git issue as resolved
7
+ * - get_git_issues: List git issues for a project
8
+ * - delete_git_issue: Remove a git issue
9
9
  */
10
10
  import type { Handler, HandlerRegistry } from './types.js';
11
- export declare const getGitIssues: Handler;
12
- export declare const createGitIssue: Handler;
11
+ export declare const addGitIssue: Handler;
13
12
  export declare const resolveGitIssue: Handler;
14
- export declare const dismissGitIssue: Handler;
15
- /**
16
- * Auto-resolve git issues for a branch when it becomes mergeable
17
- */
18
- export declare function autoResolveGitIssuesForBranch(supabase: import('@supabase/supabase-js').SupabaseClient, projectId: string, branchName: string, sessionId: string | null): Promise<number>;
13
+ export declare const getGitIssues: Handler;
14
+ export declare const deleteGitIssue: Handler;
19
15
  /**
20
16
  * Git Issues handlers registry
21
17
  */
22
- export declare const gitIssuesHandlers: HandlerRegistry;
18
+ export declare const gitIssueHandlers: HandlerRegistry;