wolfpack-mcp 1.0.80 → 1.0.81
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/dist/client.js +16 -0
- package/dist/index.js +138 -0
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -240,6 +240,22 @@ export class WolfpackClient {
|
|
|
240
240
|
throw error;
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
|
+
// Review check methods
|
|
244
|
+
async listWorkItemChecks(filter, teamSlug) {
|
|
245
|
+
const params = new URLSearchParams();
|
|
246
|
+
if (filter.workItemId)
|
|
247
|
+
params.set('workItemId', filter.workItemId);
|
|
248
|
+
if (filter.status)
|
|
249
|
+
params.set('status', filter.status);
|
|
250
|
+
const query = params.toString();
|
|
251
|
+
return this.api.get(this.withTeamSlug(`/work-item-checks${query ? `?${query}` : ''}`, teamSlug));
|
|
252
|
+
}
|
|
253
|
+
async claimWorkItemCheck(workItemId, checkId, teamSlug) {
|
|
254
|
+
return this.api.post(this.withTeamSlug(`/work-items/${workItemId}/checks/${checkId}/claim`, teamSlug), {});
|
|
255
|
+
}
|
|
256
|
+
async completeWorkItemCheck(workItemId, checkId, data, teamSlug) {
|
|
257
|
+
return this.api.post(this.withTeamSlug(`/work-items/${workItemId}/checks/${checkId}/complete`, teamSlug), data);
|
|
258
|
+
}
|
|
243
259
|
// Radar Item (Initiative/Roadmap) methods
|
|
244
260
|
async listRadarItems(options) {
|
|
245
261
|
const params = new URLSearchParams();
|
package/dist/index.js
CHANGED
|
@@ -214,6 +214,28 @@ const SubmitWorkItemFormSchema = z.object({
|
|
|
214
214
|
.optional()
|
|
215
215
|
.describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
|
|
216
216
|
});
|
|
217
|
+
const ListWorkItemChecksSchema = z.object({
|
|
218
|
+
work_item_id: refIdString()
|
|
219
|
+
.optional()
|
|
220
|
+
.describe('The refId of a work item; omit for your reviewer inbox'),
|
|
221
|
+
status: z.enum(['pending', 'passed', 'failed']).optional().describe('Filter by check status'),
|
|
222
|
+
project_slug: z
|
|
223
|
+
.string()
|
|
224
|
+
.optional()
|
|
225
|
+
.describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
|
|
226
|
+
});
|
|
227
|
+
const ClaimWorkItemCheckSchema = z.object({
|
|
228
|
+
work_item_id: refIdString().describe('The refId of the work item'),
|
|
229
|
+
check_id: z.string().describe('The check ID (from list_work_item_checks)'),
|
|
230
|
+
project_slug: z
|
|
231
|
+
.string()
|
|
232
|
+
.optional()
|
|
233
|
+
.describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
|
|
234
|
+
});
|
|
235
|
+
const CompleteWorkItemCheckSchema = ClaimWorkItemCheckSchema.extend({
|
|
236
|
+
status: z.enum(['passed', 'failed']).describe('The verdict'),
|
|
237
|
+
summary: z.string().optional().describe('Short summary of the review findings'),
|
|
238
|
+
});
|
|
217
239
|
// Radar Item (Initiative/Roadmap) schemas
|
|
218
240
|
const ListRadarItemsSchema = z.object({
|
|
219
241
|
project_slug: z.string().optional().describe('Project slug to filter radar items'),
|
|
@@ -641,6 +663,11 @@ const AddDiscussionCommentSchema = z.object({
|
|
|
641
663
|
const PASSTHROUGH_FIELDS = new Set(['formDefinition', 'formValues', 'formContent']);
|
|
642
664
|
// Strip UUID v4 fields from response objects so agents use refId/slug instead.
|
|
643
665
|
// Preserves Clerk user IDs (user_xxx format) and operational fields (categoryId, radarItemId).
|
|
666
|
+
/** Present a review check with its ID under `checkId` (stripUuids would drop `id`). */
|
|
667
|
+
function formatWorkItemCheck(check) {
|
|
668
|
+
const { id, workItemId: _workItemId, ...rest } = check;
|
|
669
|
+
return { checkId: id, ...rest };
|
|
670
|
+
}
|
|
644
671
|
function stripUuids(obj) {
|
|
645
672
|
if (obj === null || obj === undefined)
|
|
646
673
|
return obj;
|
|
@@ -838,6 +865,7 @@ class WolfpackMCPServer {
|
|
|
838
865
|
'blocked/ready/completed/closed→new→doing, then review when done). ' +
|
|
839
866
|
'PLANNING: Check if the description contains a plan (markdown checklist). If not, APPEND one using update_work_progress - preserve all original description text and add your plan below a "---" separator. ' +
|
|
840
867
|
'FORMS: Procedure-created work items may include formDefinition (field definitions with name, label, type, required, options) and formValues (current values). Use submit_work_item_form to fill in form values. ' +
|
|
868
|
+
'REVIEW CHECKS: items under review may carry review checks (code-review, security-review, ...); see list_work_item_checks and claim/complete_work_item_check. ' +
|
|
841
869
|
'IMAGES: Image references in the description (e.g. ``) can be viewed using the download_image tool.',
|
|
842
870
|
inputSchema: {
|
|
843
871
|
type: 'object',
|
|
@@ -1035,6 +1063,79 @@ class WolfpackMCPServer {
|
|
|
1035
1063
|
required: ['work_item_id', 'form_values'],
|
|
1036
1064
|
},
|
|
1037
1065
|
},
|
|
1066
|
+
{
|
|
1067
|
+
name: 'list_work_item_checks',
|
|
1068
|
+
description: 'List review checks (key controls such as code-review, security-review, e2e-review) on work items. ' +
|
|
1069
|
+
'With work_item_id: every check on that item. Without it: your REVIEWER INBOX — pending checks on ' +
|
|
1070
|
+
'work items in the work pools you belong to that are unclaimed or held by you, each with workItemRefId and workItemTitle. ' +
|
|
1071
|
+
'REVIEW WORKFLOW: claim a check with claim_work_item_check, get_work_item to read the work, review it, ' +
|
|
1072
|
+
'then complete_work_item_check with "passed" or "failed" and a short summary. ' +
|
|
1073
|
+
'A failed check sends the item back to its developer with your summary as feedback; do not change the item status yourself.',
|
|
1074
|
+
inputSchema: {
|
|
1075
|
+
type: 'object',
|
|
1076
|
+
properties: {
|
|
1077
|
+
work_item_id: {
|
|
1078
|
+
type: 'string',
|
|
1079
|
+
description: 'The refId of a work item; omit for your reviewer inbox',
|
|
1080
|
+
},
|
|
1081
|
+
status: {
|
|
1082
|
+
type: 'string',
|
|
1083
|
+
enum: ['pending', 'passed', 'failed'],
|
|
1084
|
+
description: 'Filter by check status',
|
|
1085
|
+
},
|
|
1086
|
+
project_slug: {
|
|
1087
|
+
type: 'string',
|
|
1088
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1089
|
+
},
|
|
1090
|
+
},
|
|
1091
|
+
},
|
|
1092
|
+
},
|
|
1093
|
+
{
|
|
1094
|
+
name: 'claim_work_item_check',
|
|
1095
|
+
description: 'Claim a pending, unclaimed review check on a work item so other reviewers know it is being handled. ' +
|
|
1096
|
+
'Only one reviewer can hold a check; the claim is refused if someone else got there first.',
|
|
1097
|
+
inputSchema: {
|
|
1098
|
+
type: 'object',
|
|
1099
|
+
properties: {
|
|
1100
|
+
work_item_id: { type: 'string', description: 'The refId of the work item' },
|
|
1101
|
+
check_id: {
|
|
1102
|
+
type: 'string',
|
|
1103
|
+
description: 'The check ID (checkId from list_work_item_checks)',
|
|
1104
|
+
},
|
|
1105
|
+
project_slug: {
|
|
1106
|
+
type: 'string',
|
|
1107
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1108
|
+
},
|
|
1109
|
+
},
|
|
1110
|
+
required: ['work_item_id', 'check_id'],
|
|
1111
|
+
},
|
|
1112
|
+
},
|
|
1113
|
+
{
|
|
1114
|
+
name: 'complete_work_item_check',
|
|
1115
|
+
description: 'Record the verdict on a review check: "passed" or "failed", with a short summary of the findings. ' +
|
|
1116
|
+
'A claimed check can only be completed by its claimant (or an admin). When every check on the item is ' +
|
|
1117
|
+
'resolved the owning procedure continues — with a failed check it returns the item to the developer with the summaries as feedback.',
|
|
1118
|
+
inputSchema: {
|
|
1119
|
+
type: 'object',
|
|
1120
|
+
properties: {
|
|
1121
|
+
work_item_id: { type: 'string', description: 'The refId of the work item' },
|
|
1122
|
+
check_id: {
|
|
1123
|
+
type: 'string',
|
|
1124
|
+
description: 'The check ID (checkId from list_work_item_checks)',
|
|
1125
|
+
},
|
|
1126
|
+
status: { type: 'string', enum: ['passed', 'failed'], description: 'The verdict' },
|
|
1127
|
+
summary: {
|
|
1128
|
+
type: 'string',
|
|
1129
|
+
description: 'Short summary of the review findings (what was checked, what failed)',
|
|
1130
|
+
},
|
|
1131
|
+
project_slug: {
|
|
1132
|
+
type: 'string',
|
|
1133
|
+
description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
|
|
1134
|
+
},
|
|
1135
|
+
},
|
|
1136
|
+
required: ['work_item_id', 'check_id', 'status'],
|
|
1137
|
+
},
|
|
1138
|
+
},
|
|
1038
1139
|
// Radar Item (Initiative/Roadmap) tools
|
|
1039
1140
|
{
|
|
1040
1141
|
name: 'list_radar_items',
|
|
@@ -2314,6 +2415,43 @@ class WolfpackMCPServer {
|
|
|
2314
2415
|
content: [{ type: 'text', text: 'Work item not found' }],
|
|
2315
2416
|
};
|
|
2316
2417
|
}
|
|
2418
|
+
case 'list_work_item_checks': {
|
|
2419
|
+
const parsed = ListWorkItemChecksSchema.parse(args);
|
|
2420
|
+
const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
|
|
2421
|
+
const checks = await this.client.listWorkItemChecks({ workItemId: parsed.work_item_id, status: parsed.status }, teamSlug);
|
|
2422
|
+
const text = checks.length === 0
|
|
2423
|
+
? parsed.work_item_id
|
|
2424
|
+
? 'No review checks on this work item'
|
|
2425
|
+
: 'No review checks waiting for you'
|
|
2426
|
+
: JSON.stringify(checks.map(formatWorkItemCheck), null, 2);
|
|
2427
|
+
return { content: [{ type: 'text', text }] };
|
|
2428
|
+
}
|
|
2429
|
+
case 'claim_work_item_check': {
|
|
2430
|
+
const parsed = ClaimWorkItemCheckSchema.parse(args);
|
|
2431
|
+
const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
|
|
2432
|
+
const check = await this.client.claimWorkItemCheck(parsed.work_item_id, parsed.check_id, teamSlug);
|
|
2433
|
+
return {
|
|
2434
|
+
content: [
|
|
2435
|
+
{
|
|
2436
|
+
type: 'text',
|
|
2437
|
+
text: `Claimed ${check.kind} check on #${check.workItemRefId} "${check.workItemTitle}"\n\n${JSON.stringify(formatWorkItemCheck(check), null, 2)}`,
|
|
2438
|
+
},
|
|
2439
|
+
],
|
|
2440
|
+
};
|
|
2441
|
+
}
|
|
2442
|
+
case 'complete_work_item_check': {
|
|
2443
|
+
const parsed = CompleteWorkItemCheckSchema.parse(args);
|
|
2444
|
+
const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
|
|
2445
|
+
const check = await this.client.completeWorkItemCheck(parsed.work_item_id, parsed.check_id, { status: parsed.status, summary: parsed.summary }, teamSlug);
|
|
2446
|
+
return {
|
|
2447
|
+
content: [
|
|
2448
|
+
{
|
|
2449
|
+
type: 'text',
|
|
2450
|
+
text: `Marked ${check.kind} check on #${check.workItemRefId} as ${check.status}\n\n${JSON.stringify(formatWorkItemCheck(check), null, 2)}`,
|
|
2451
|
+
},
|
|
2452
|
+
],
|
|
2453
|
+
};
|
|
2454
|
+
}
|
|
2317
2455
|
// Radar Item handlers
|
|
2318
2456
|
case 'list_radar_items': {
|
|
2319
2457
|
const parsed = ListRadarItemsSchema.parse(args);
|