@vibescope/mcp-server 0.2.5 → 0.2.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/cli.js +26 -26
- package/dist/handlers/tool-docs.js +828 -828
- package/dist/index.js +73 -73
- package/dist/templates/agent-guidelines.js +185 -185
- package/dist/token-tracking.js +4 -2
- package/dist/tools.js +65 -65
- package/dist/utils.js +11 -11
- package/docs/TOOLS.md +2053 -2053
- package/package.json +3 -2
- package/scripts/generate-docs.ts +212 -212
- package/scripts/version-bump.ts +203 -203
- package/src/api-client.test.ts +723 -723
- package/src/api-client.ts +2499 -2499
- package/src/cli.ts +212 -212
- package/src/handlers/__test-setup__.ts +236 -236
- package/src/handlers/__test-utils__.ts +87 -87
- package/src/handlers/blockers.test.ts +468 -468
- package/src/handlers/blockers.ts +163 -163
- package/src/handlers/bodies-of-work.test.ts +704 -704
- package/src/handlers/bodies-of-work.ts +526 -526
- 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 +541 -541
- package/src/handlers/discovery.test.ts +206 -206
- package/src/handlers/discovery.ts +390 -390
- 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 +84 -84
- 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 +239 -239
- package/src/handlers/requests.test.ts +303 -303
- package/src/handlers/requests.ts +99 -99
- package/src/handlers/roles.test.ts +303 -303
- package/src/handlers/roles.ts +226 -226
- package/src/handlers/session.test.ts +875 -875
- package/src/handlers/session.ts +738 -738
- package/src/handlers/sprints.test.ts +732 -732
- package/src/handlers/sprints.ts +537 -537
- package/src/handlers/tasks.test.ts +907 -907
- package/src/handlers/tasks.ts +945 -945
- package/src/handlers/tool-categories.test.ts +66 -66
- package/src/handlers/tool-docs.ts +1096 -1096
- package/src/handlers/types.test.ts +259 -259
- package/src/handlers/types.ts +175 -175
- package/src/handlers/validation.test.ts +582 -582
- package/src/handlers/validation.ts +97 -97
- package/src/index.ts +792 -792
- package/src/setup.test.ts +233 -231
- package/src/setup.ts +370 -370
- package/src/templates/agent-guidelines.ts +210 -210
- package/src/token-tracking.test.ts +463 -453
- package/src/token-tracking.ts +166 -164
- package/src/tools.ts +3562 -3562
- package/src/utils.test.ts +683 -683
- package/src/utils.ts +436 -436
- package/src/validators.test.ts +223 -223
- package/src/validators.ts +249 -249
- package/tsconfig.json +16 -16
- package/vitest.config.ts +14 -14
- package/dist/knowledge.d.ts +0 -6
- package/dist/knowledge.js +0 -218
package/src/handlers/fallback.ts
CHANGED
|
@@ -1,194 +1,194 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Fallback Handlers
|
|
3
|
-
*
|
|
4
|
-
* Handles background activities when idle:
|
|
5
|
-
* - start_fallback_activity
|
|
6
|
-
* - stop_fallback_activity
|
|
7
|
-
* - get_activity_history
|
|
8
|
-
* - get_activity_schedules
|
|
9
|
-
*
|
|
10
|
-
* MIGRATED: Uses Vibescope API client instead of direct Supabase
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { Handler, HandlerRegistry } from './types.js';
|
|
14
|
-
import { parseArgs, uuidValidator, createEnumValidator } from '../validators.js';
|
|
15
|
-
import { FALLBACK_ACTIVITIES } from '../utils.js';
|
|
16
|
-
import { getApiClient } from '../api-client.js';
|
|
17
|
-
|
|
18
|
-
const VALID_ACTIVITIES = [
|
|
19
|
-
'feature_ideation',
|
|
20
|
-
'code_review',
|
|
21
|
-
'performance_audit',
|
|
22
|
-
'ux_review',
|
|
23
|
-
'cost_analysis',
|
|
24
|
-
'security_review',
|
|
25
|
-
'test_coverage',
|
|
26
|
-
'documentation_review',
|
|
27
|
-
'dependency_audit',
|
|
28
|
-
'validate_completed_tasks',
|
|
29
|
-
'worktree_cleanup',
|
|
30
|
-
] as const;
|
|
31
|
-
|
|
32
|
-
type FallbackActivity = typeof VALID_ACTIVITIES[number];
|
|
33
|
-
|
|
34
|
-
// Argument schemas for type-safe parsing
|
|
35
|
-
const startFallbackActivitySchema = {
|
|
36
|
-
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
37
|
-
activity: { type: 'string' as const, required: true as const, validate: createEnumValidator(VALID_ACTIVITIES) },
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const stopFallbackActivitySchema = {
|
|
41
|
-
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
42
|
-
summary: { type: 'string' as const },
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const getActivityHistorySchema = {
|
|
46
|
-
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
47
|
-
activity_type: { type: 'string' as const },
|
|
48
|
-
limit: { type: 'number' as const, default: 50 },
|
|
49
|
-
offset: { type: 'number' as const, default: 0 },
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
const getActivitySchedulesSchema = {
|
|
53
|
-
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
54
|
-
limit: { type: 'number' as const, default: 50 },
|
|
55
|
-
offset: { type: 'number' as const, default: 0 },
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
export const startFallbackActivity: Handler = async (args, ctx) => {
|
|
59
|
-
const { project_id, activity } = parseArgs(args, startFallbackActivitySchema);
|
|
60
|
-
|
|
61
|
-
const { session } = ctx;
|
|
62
|
-
const apiClient = getApiClient();
|
|
63
|
-
|
|
64
|
-
const response = await apiClient.startFallbackActivity(project_id, activity as FallbackActivity, session.currentSessionId || undefined);
|
|
65
|
-
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
return { result: { error: response.error || 'Failed to start fallback activity' }, isError: true };
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Get the activity details for the response
|
|
71
|
-
const activityInfo = FALLBACK_ACTIVITIES.find((a) => a.activity === activity);
|
|
72
|
-
|
|
73
|
-
const result: Record<string, unknown> = {
|
|
74
|
-
success: true,
|
|
75
|
-
activity,
|
|
76
|
-
title: activityInfo?.title || activity,
|
|
77
|
-
description: activityInfo?.description || '',
|
|
78
|
-
prompt: activityInfo?.prompt || '',
|
|
79
|
-
message: response.data?.message || `Started fallback activity: ${activityInfo?.title || activity}`,
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
// Pass through worktree guidance if provided
|
|
83
|
-
if (response.data?.git_workflow) {
|
|
84
|
-
result.git_workflow = response.data.git_workflow;
|
|
85
|
-
}
|
|
86
|
-
if (response.data?.worktree_setup) {
|
|
87
|
-
result.worktree_setup = response.data.worktree_setup;
|
|
88
|
-
}
|
|
89
|
-
if (response.data?.next_step) {
|
|
90
|
-
result.next_step = response.data.next_step;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return { result };
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
export const stopFallbackActivity: Handler = async (args, ctx) => {
|
|
97
|
-
const { project_id, summary } = parseArgs(args, stopFallbackActivitySchema);
|
|
98
|
-
|
|
99
|
-
const { session } = ctx;
|
|
100
|
-
const apiClient = getApiClient();
|
|
101
|
-
|
|
102
|
-
const response = await apiClient.stopFallbackActivity(project_id, summary, session.currentSessionId || undefined);
|
|
103
|
-
|
|
104
|
-
if (!response.ok) {
|
|
105
|
-
return { result: { error: response.error || 'Failed to stop fallback activity' }, isError: true };
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return {
|
|
109
|
-
result: {
|
|
110
|
-
success: true,
|
|
111
|
-
message: 'Fallback activity stopped',
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
export const getActivityHistory: Handler = async (args, _ctx) => {
|
|
117
|
-
const { project_id, activity_type, limit, offset } = parseArgs(args, getActivityHistorySchema);
|
|
118
|
-
|
|
119
|
-
const apiClient = getApiClient();
|
|
120
|
-
|
|
121
|
-
// Use proxy for get_activity_history operation
|
|
122
|
-
const response = await apiClient.proxy<{
|
|
123
|
-
history: Array<{
|
|
124
|
-
id: string;
|
|
125
|
-
activity_type: string;
|
|
126
|
-
completed_at: string;
|
|
127
|
-
summary?: string;
|
|
128
|
-
}>;
|
|
129
|
-
latest_by_type?: Record<string, unknown>;
|
|
130
|
-
count: number;
|
|
131
|
-
}>('get_activity_history', {
|
|
132
|
-
project_id,
|
|
133
|
-
activity_type,
|
|
134
|
-
limit,
|
|
135
|
-
offset
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
if (!response.ok) {
|
|
139
|
-
return { result: { error: response.error || 'Failed to get activity history' }, isError: true };
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return {
|
|
143
|
-
result: {
|
|
144
|
-
history: response.data?.history || [],
|
|
145
|
-
latest_by_type: response.data?.latest_by_type || {},
|
|
146
|
-
count: response.data?.count || 0,
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
export const getActivitySchedules: Handler = async (args, _ctx) => {
|
|
152
|
-
const { project_id, limit, offset } = parseArgs(args, getActivitySchedulesSchema);
|
|
153
|
-
|
|
154
|
-
const apiClient = getApiClient();
|
|
155
|
-
|
|
156
|
-
// Use proxy for get_activity_schedules operation
|
|
157
|
-
const response = await apiClient.proxy<{
|
|
158
|
-
schedules: Array<{
|
|
159
|
-
id: string;
|
|
160
|
-
activity_type: string;
|
|
161
|
-
schedule_type: string;
|
|
162
|
-
next_run_at?: string;
|
|
163
|
-
enabled: boolean;
|
|
164
|
-
}>;
|
|
165
|
-
total_count: number;
|
|
166
|
-
has_more: boolean;
|
|
167
|
-
}>('get_activity_schedules', {
|
|
168
|
-
project_id,
|
|
169
|
-
limit,
|
|
170
|
-
offset
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
if (!response.ok) {
|
|
174
|
-
return { result: { error: response.error || 'Failed to get activity schedules' }, isError: true };
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
result: {
|
|
179
|
-
schedules: response.data?.schedules || [],
|
|
180
|
-
total_count: response.data?.total_count || 0,
|
|
181
|
-
has_more: response.data?.has_more || false,
|
|
182
|
-
},
|
|
183
|
-
};
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Fallback handlers registry
|
|
188
|
-
*/
|
|
189
|
-
export const fallbackHandlers: HandlerRegistry = {
|
|
190
|
-
start_fallback_activity: startFallbackActivity,
|
|
191
|
-
stop_fallback_activity: stopFallbackActivity,
|
|
192
|
-
get_activity_history: getActivityHistory,
|
|
193
|
-
get_activity_schedules: getActivitySchedules,
|
|
194
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Fallback Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles background activities when idle:
|
|
5
|
+
* - start_fallback_activity
|
|
6
|
+
* - stop_fallback_activity
|
|
7
|
+
* - get_activity_history
|
|
8
|
+
* - get_activity_schedules
|
|
9
|
+
*
|
|
10
|
+
* MIGRATED: Uses Vibescope API client instead of direct Supabase
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { Handler, HandlerRegistry } from './types.js';
|
|
14
|
+
import { parseArgs, uuidValidator, createEnumValidator } from '../validators.js';
|
|
15
|
+
import { FALLBACK_ACTIVITIES } from '../utils.js';
|
|
16
|
+
import { getApiClient } from '../api-client.js';
|
|
17
|
+
|
|
18
|
+
const VALID_ACTIVITIES = [
|
|
19
|
+
'feature_ideation',
|
|
20
|
+
'code_review',
|
|
21
|
+
'performance_audit',
|
|
22
|
+
'ux_review',
|
|
23
|
+
'cost_analysis',
|
|
24
|
+
'security_review',
|
|
25
|
+
'test_coverage',
|
|
26
|
+
'documentation_review',
|
|
27
|
+
'dependency_audit',
|
|
28
|
+
'validate_completed_tasks',
|
|
29
|
+
'worktree_cleanup',
|
|
30
|
+
] as const;
|
|
31
|
+
|
|
32
|
+
type FallbackActivity = typeof VALID_ACTIVITIES[number];
|
|
33
|
+
|
|
34
|
+
// Argument schemas for type-safe parsing
|
|
35
|
+
const startFallbackActivitySchema = {
|
|
36
|
+
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
37
|
+
activity: { type: 'string' as const, required: true as const, validate: createEnumValidator(VALID_ACTIVITIES) },
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const stopFallbackActivitySchema = {
|
|
41
|
+
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
42
|
+
summary: { type: 'string' as const },
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const getActivityHistorySchema = {
|
|
46
|
+
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
47
|
+
activity_type: { type: 'string' as const },
|
|
48
|
+
limit: { type: 'number' as const, default: 50 },
|
|
49
|
+
offset: { type: 'number' as const, default: 0 },
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const getActivitySchedulesSchema = {
|
|
53
|
+
project_id: { type: 'string' as const, required: true as const, validate: uuidValidator },
|
|
54
|
+
limit: { type: 'number' as const, default: 50 },
|
|
55
|
+
offset: { type: 'number' as const, default: 0 },
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const startFallbackActivity: Handler = async (args, ctx) => {
|
|
59
|
+
const { project_id, activity } = parseArgs(args, startFallbackActivitySchema);
|
|
60
|
+
|
|
61
|
+
const { session } = ctx;
|
|
62
|
+
const apiClient = getApiClient();
|
|
63
|
+
|
|
64
|
+
const response = await apiClient.startFallbackActivity(project_id, activity as FallbackActivity, session.currentSessionId || undefined);
|
|
65
|
+
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
return { result: { error: response.error || 'Failed to start fallback activity' }, isError: true };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Get the activity details for the response
|
|
71
|
+
const activityInfo = FALLBACK_ACTIVITIES.find((a) => a.activity === activity);
|
|
72
|
+
|
|
73
|
+
const result: Record<string, unknown> = {
|
|
74
|
+
success: true,
|
|
75
|
+
activity,
|
|
76
|
+
title: activityInfo?.title || activity,
|
|
77
|
+
description: activityInfo?.description || '',
|
|
78
|
+
prompt: activityInfo?.prompt || '',
|
|
79
|
+
message: response.data?.message || `Started fallback activity: ${activityInfo?.title || activity}`,
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// Pass through worktree guidance if provided
|
|
83
|
+
if (response.data?.git_workflow) {
|
|
84
|
+
result.git_workflow = response.data.git_workflow;
|
|
85
|
+
}
|
|
86
|
+
if (response.data?.worktree_setup) {
|
|
87
|
+
result.worktree_setup = response.data.worktree_setup;
|
|
88
|
+
}
|
|
89
|
+
if (response.data?.next_step) {
|
|
90
|
+
result.next_step = response.data.next_step;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return { result };
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export const stopFallbackActivity: Handler = async (args, ctx) => {
|
|
97
|
+
const { project_id, summary } = parseArgs(args, stopFallbackActivitySchema);
|
|
98
|
+
|
|
99
|
+
const { session } = ctx;
|
|
100
|
+
const apiClient = getApiClient();
|
|
101
|
+
|
|
102
|
+
const response = await apiClient.stopFallbackActivity(project_id, summary, session.currentSessionId || undefined);
|
|
103
|
+
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
return { result: { error: response.error || 'Failed to stop fallback activity' }, isError: true };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
result: {
|
|
110
|
+
success: true,
|
|
111
|
+
message: 'Fallback activity stopped',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export const getActivityHistory: Handler = async (args, _ctx) => {
|
|
117
|
+
const { project_id, activity_type, limit, offset } = parseArgs(args, getActivityHistorySchema);
|
|
118
|
+
|
|
119
|
+
const apiClient = getApiClient();
|
|
120
|
+
|
|
121
|
+
// Use proxy for get_activity_history operation
|
|
122
|
+
const response = await apiClient.proxy<{
|
|
123
|
+
history: Array<{
|
|
124
|
+
id: string;
|
|
125
|
+
activity_type: string;
|
|
126
|
+
completed_at: string;
|
|
127
|
+
summary?: string;
|
|
128
|
+
}>;
|
|
129
|
+
latest_by_type?: Record<string, unknown>;
|
|
130
|
+
count: number;
|
|
131
|
+
}>('get_activity_history', {
|
|
132
|
+
project_id,
|
|
133
|
+
activity_type,
|
|
134
|
+
limit,
|
|
135
|
+
offset
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
if (!response.ok) {
|
|
139
|
+
return { result: { error: response.error || 'Failed to get activity history' }, isError: true };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
result: {
|
|
144
|
+
history: response.data?.history || [],
|
|
145
|
+
latest_by_type: response.data?.latest_by_type || {},
|
|
146
|
+
count: response.data?.count || 0,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export const getActivitySchedules: Handler = async (args, _ctx) => {
|
|
152
|
+
const { project_id, limit, offset } = parseArgs(args, getActivitySchedulesSchema);
|
|
153
|
+
|
|
154
|
+
const apiClient = getApiClient();
|
|
155
|
+
|
|
156
|
+
// Use proxy for get_activity_schedules operation
|
|
157
|
+
const response = await apiClient.proxy<{
|
|
158
|
+
schedules: Array<{
|
|
159
|
+
id: string;
|
|
160
|
+
activity_type: string;
|
|
161
|
+
schedule_type: string;
|
|
162
|
+
next_run_at?: string;
|
|
163
|
+
enabled: boolean;
|
|
164
|
+
}>;
|
|
165
|
+
total_count: number;
|
|
166
|
+
has_more: boolean;
|
|
167
|
+
}>('get_activity_schedules', {
|
|
168
|
+
project_id,
|
|
169
|
+
limit,
|
|
170
|
+
offset
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
if (!response.ok) {
|
|
174
|
+
return { result: { error: response.error || 'Failed to get activity schedules' }, isError: true };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
result: {
|
|
179
|
+
schedules: response.data?.schedules || [],
|
|
180
|
+
total_count: response.data?.total_count || 0,
|
|
181
|
+
has_more: response.data?.has_more || false,
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Fallback handlers registry
|
|
188
|
+
*/
|
|
189
|
+
export const fallbackHandlers: HandlerRegistry = {
|
|
190
|
+
start_fallback_activity: startFallbackActivity,
|
|
191
|
+
stop_fallback_activity: stopFallbackActivity,
|
|
192
|
+
get_activity_history: getActivityHistory,
|
|
193
|
+
get_activity_schedules: getActivitySchedules,
|
|
194
|
+
};
|