@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.
- package/README.md +113 -98
- package/dist/api-client.d.ts +1114 -0
- package/dist/api-client.js +698 -0
- package/dist/cli.d.ts +1 -6
- package/dist/cli.js +39 -240
- package/dist/config/tool-categories.d.ts +31 -0
- package/dist/config/tool-categories.js +253 -0
- package/dist/handlers/blockers.js +57 -58
- package/dist/handlers/bodies-of-work.d.ts +2 -0
- package/dist/handlers/bodies-of-work.js +106 -476
- package/dist/handlers/cost.d.ts +1 -0
- package/dist/handlers/cost.js +35 -113
- package/dist/handlers/decisions.d.ts +2 -0
- package/dist/handlers/decisions.js +28 -27
- package/dist/handlers/deployment.js +112 -828
- package/dist/handlers/discovery.js +31 -0
- package/dist/handlers/fallback.d.ts +2 -0
- package/dist/handlers/fallback.js +39 -134
- package/dist/handlers/findings.js +43 -67
- package/dist/handlers/git-issues.d.ts +9 -13
- package/dist/handlers/git-issues.js +80 -225
- package/dist/handlers/ideas.d.ts +3 -0
- package/dist/handlers/ideas.js +53 -134
- package/dist/handlers/index.d.ts +2 -0
- package/dist/handlers/index.js +6 -0
- package/dist/handlers/milestones.d.ts +2 -0
- package/dist/handlers/milestones.js +51 -98
- package/dist/handlers/organizations.js +79 -275
- package/dist/handlers/progress.d.ts +2 -0
- package/dist/handlers/progress.js +25 -123
- package/dist/handlers/project.js +42 -221
- package/dist/handlers/requests.d.ts +2 -0
- package/dist/handlers/requests.js +23 -83
- package/dist/handlers/session.js +99 -585
- package/dist/handlers/sprints.d.ts +32 -0
- package/dist/handlers/sprints.js +274 -0
- package/dist/handlers/tasks.d.ts +7 -10
- package/dist/handlers/tasks.js +230 -900
- package/dist/handlers/tool-docs.d.ts +8 -0
- package/dist/handlers/tool-docs.js +657 -0
- package/dist/handlers/types.d.ts +11 -3
- package/dist/handlers/validation.d.ts +1 -1
- package/dist/handlers/validation.js +26 -153
- package/dist/index.js +473 -160
- package/dist/knowledge.js +106 -9
- package/dist/tools.js +4 -0
- package/dist/validators.d.ts +21 -0
- package/dist/validators.js +91 -0
- package/package.json +2 -3
- package/src/api-client.ts +1752 -0
- package/src/cli.test.ts +128 -302
- package/src/cli.ts +41 -285
- package/src/handlers/__test-setup__.ts +210 -0
- package/src/handlers/__test-utils__.ts +4 -134
- package/src/handlers/blockers.test.ts +114 -124
- package/src/handlers/blockers.ts +68 -70
- package/src/handlers/bodies-of-work.test.ts +236 -831
- package/src/handlers/bodies-of-work.ts +194 -525
- package/src/handlers/cost.test.ts +149 -113
- package/src/handlers/cost.ts +44 -132
- package/src/handlers/decisions.test.ts +111 -209
- package/src/handlers/decisions.ts +35 -27
- package/src/handlers/deployment.test.ts +193 -239
- package/src/handlers/deployment.ts +140 -895
- package/src/handlers/discovery.test.ts +20 -67
- package/src/handlers/discovery.ts +32 -0
- package/src/handlers/fallback.test.ts +128 -361
- package/src/handlers/fallback.ts +62 -148
- package/src/handlers/findings.test.ts +127 -345
- package/src/handlers/findings.ts +49 -66
- package/src/handlers/git-issues.test.ts +623 -0
- package/src/handlers/git-issues.ts +174 -0
- package/src/handlers/ideas.test.ts +229 -343
- package/src/handlers/ideas.ts +69 -143
- package/src/handlers/index.ts +6 -0
- package/src/handlers/milestones.test.ts +167 -281
- package/src/handlers/milestones.ts +54 -93
- package/src/handlers/organizations.test.ts +275 -467
- package/src/handlers/organizations.ts +84 -294
- package/src/handlers/progress.test.ts +112 -218
- package/src/handlers/progress.ts +29 -142
- package/src/handlers/project.test.ts +203 -226
- package/src/handlers/project.ts +48 -238
- package/src/handlers/requests.test.ts +74 -342
- package/src/handlers/requests.ts +25 -83
- package/src/handlers/session.test.ts +241 -206
- package/src/handlers/session.ts +110 -657
- package/src/handlers/sprints.test.ts +711 -0
- package/src/handlers/sprints.ts +497 -0
- package/src/handlers/tasks.test.ts +608 -353
- package/src/handlers/tasks.ts +248 -1025
- package/src/handlers/types.ts +12 -4
- package/src/handlers/validation.test.ts +189 -572
- package/src/handlers/validation.ts +29 -166
- package/src/index.ts +473 -184
- package/src/knowledge.ts +107 -9
- package/src/tools.ts +2506 -0
- package/src/validators.test.ts +223 -223
- package/src/validators.ts +127 -0
- package/tsconfig.json +1 -1
- package/vitest.config.ts +14 -13
- package/dist/cli.test.d.ts +0 -1
- package/dist/cli.test.js +0 -367
- package/dist/handlers/__test-utils__.d.ts +0 -72
- package/dist/handlers/__test-utils__.js +0 -176
- package/dist/handlers/checkouts.d.ts +0 -37
- package/dist/handlers/checkouts.js +0 -377
- package/dist/handlers/knowledge-query.d.ts +0 -22
- package/dist/handlers/knowledge-query.js +0 -253
- package/dist/handlers/knowledge.d.ts +0 -12
- package/dist/handlers/knowledge.js +0 -108
- package/dist/handlers/roles.d.ts +0 -30
- package/dist/handlers/roles.js +0 -281
- package/dist/handlers/tasks.test.d.ts +0 -1
- package/dist/handlers/tasks.test.js +0 -431
- package/dist/utils.test.d.ts +0 -1
- package/dist/utils.test.js +0 -532
- package/dist/validators.test.d.ts +0 -1
- package/dist/validators.test.js +0 -176
- package/src/tmpclaude-0078-cwd +0 -1
- package/src/tmpclaude-0ee1-cwd +0 -1
- package/src/tmpclaude-2dd5-cwd +0 -1
- package/src/tmpclaude-344c-cwd +0 -1
- package/src/tmpclaude-3860-cwd +0 -1
- package/src/tmpclaude-4b63-cwd +0 -1
- package/src/tmpclaude-5c73-cwd +0 -1
- package/src/tmpclaude-5ee3-cwd +0 -1
- package/src/tmpclaude-6795-cwd +0 -1
- package/src/tmpclaude-709e-cwd +0 -1
- package/src/tmpclaude-9839-cwd +0 -1
- package/src/tmpclaude-d829-cwd +0 -1
- package/src/tmpclaude-e072-cwd +0 -1
- package/src/tmpclaude-f6ee-cwd +0 -1
- package/tmpclaude-0439-cwd +0 -1
- package/tmpclaude-132f-cwd +0 -1
- package/tmpclaude-15bb-cwd +0 -1
- package/tmpclaude-165a-cwd +0 -1
- package/tmpclaude-1ba9-cwd +0 -1
- package/tmpclaude-21a3-cwd +0 -1
- package/tmpclaude-2a38-cwd +0 -1
- package/tmpclaude-2adf-cwd +0 -1
- package/tmpclaude-2f56-cwd +0 -1
- package/tmpclaude-3626-cwd +0 -1
- package/tmpclaude-3727-cwd +0 -1
- package/tmpclaude-40bc-cwd +0 -1
- package/tmpclaude-436f-cwd +0 -1
- package/tmpclaude-4783-cwd +0 -1
- package/tmpclaude-4b6d-cwd +0 -1
- package/tmpclaude-4ba4-cwd +0 -1
- package/tmpclaude-51e6-cwd +0 -1
- package/tmpclaude-5ecf-cwd +0 -1
- package/tmpclaude-6f97-cwd +0 -1
- package/tmpclaude-7fb2-cwd +0 -1
- package/tmpclaude-825c-cwd +0 -1
- package/tmpclaude-8baf-cwd +0 -1
- package/tmpclaude-8d9f-cwd +0 -1
- package/tmpclaude-975c-cwd +0 -1
- package/tmpclaude-9983-cwd +0 -1
- package/tmpclaude-a045-cwd +0 -1
- package/tmpclaude-ac4a-cwd +0 -1
- package/tmpclaude-b593-cwd +0 -1
- package/tmpclaude-b891-cwd +0 -1
- package/tmpclaude-c032-cwd +0 -1
- package/tmpclaude-cf43-cwd +0 -1
- package/tmpclaude-d040-cwd +0 -1
- package/tmpclaude-dcdd-cwd +0 -1
- package/tmpclaude-dcee-cwd +0 -1
- package/tmpclaude-e16b-cwd +0 -1
- package/tmpclaude-ecd2-cwd +0 -1
- 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 {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.
|
|
37
|
-
|
|
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 {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
.
|
|
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:
|
|
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
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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:
|
|
179
|
-
count:
|
|
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
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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:
|
|
204
|
-
count:
|
|
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
|
|
19
|
-
const
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
.
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (
|
|
74
|
-
|
|
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
|
-
|
|
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
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
.
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
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
|
|
12
|
-
export declare const createGitIssue: Handler;
|
|
11
|
+
export declare const addGitIssue: Handler;
|
|
13
12
|
export declare const resolveGitIssue: Handler;
|
|
14
|
-
export declare const
|
|
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
|
|
18
|
+
export declare const gitIssueHandlers: HandlerRegistry;
|