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 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. `![alt](/api/files/...)`) 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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.80",
3
+ "version": "1.0.81",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",