wolfpack-mcp 1.0.80 → 1.0.82

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;
@@ -835,9 +862,12 @@ class WolfpackMCPServer {
835
862
  'Call this before updating to see current content. ' +
836
863
  'WORKFLOW: When asked to work on an item, check its status and follow the required state transitions ' +
837
864
  '(pending→pull first, new→doing, review→doing when you are picking the work back up, ' +
838
- 'blocked/ready/completed/closed→new→doing, then review when done). ' +
865
+ 'ready/completed/closed→new→doing, then review when done). ' +
866
+ 'AGENTS: a "blocked" item is not yours to restart — a human clears the blocker. Leave it where it is, ' +
867
+ 'comment if you can help clear it, and take the next claimable item instead. ' +
839
868
  '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
869
  '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. ' +
870
+ '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
871
  'IMAGES: Image references in the description (e.g. `![alt](/api/files/...)`) can be viewed using the download_image tool.',
842
872
  inputSchema: {
843
873
  type: 'object',
@@ -885,6 +915,7 @@ class WolfpackMCPServer {
885
915
  'STATUS WORKFLOW: "pending" (backlog) → "new" (to do) → "doing" (in progress) → "review" (work done) → "ready" (awaiting deployment) → "completed" (deployed). ' +
886
916
  'Use "blocked" when work cannot proceed. AGENTS: you cannot start un-started work here — ' +
887
917
  'a status change on a "pending" or "new" item that is not assigned to you is refused. ' +
918
+ 'Nor can you move an item OUT of "blocked": clearing a blocker is a human decision. ' +
888
919
  'Take it with pull_work_item, which assigns it to you and puts it in "doing"; that is ' +
889
920
  'what makes the board show who is working on what. ' +
890
921
  'When moving to "review", add a completion comment via create_work_item_comment. When moving to "blocked", add a comment explaining the blocker. ' +
@@ -1035,6 +1066,80 @@ class WolfpackMCPServer {
1035
1066
  required: ['work_item_id', 'form_values'],
1036
1067
  },
1037
1068
  },
1069
+ {
1070
+ name: 'list_work_item_checks',
1071
+ description: 'List review checks (key controls such as code-review, security-review, e2e-review) on work items. ' +
1072
+ 'With work_item_id: every check on that item. Without it: your REVIEWER INBOX — pending checks on ' +
1073
+ 'work items in the work pools you belong to that are unclaimed or held by you, each with workItemRefId and workItemTitle. ' +
1074
+ 'Checks on blocked items are left out — blocked work is not picked up, and claiming one is refused. ' +
1075
+ 'REVIEW WORKFLOW: claim a check with claim_work_item_check, get_work_item to read the work, review it, ' +
1076
+ 'then complete_work_item_check with "passed" or "failed" and a short summary. ' +
1077
+ 'A failed check sends the item back to its developer with your summary as feedback; do not change the item status yourself.',
1078
+ inputSchema: {
1079
+ type: 'object',
1080
+ properties: {
1081
+ work_item_id: {
1082
+ type: 'string',
1083
+ description: 'The refId of a work item; omit for your reviewer inbox',
1084
+ },
1085
+ status: {
1086
+ type: 'string',
1087
+ enum: ['pending', 'passed', 'failed'],
1088
+ description: 'Filter by check status',
1089
+ },
1090
+ project_slug: {
1091
+ type: 'string',
1092
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1093
+ },
1094
+ },
1095
+ },
1096
+ },
1097
+ {
1098
+ name: 'claim_work_item_check',
1099
+ description: 'Claim a pending, unclaimed review check on a work item so other reviewers know it is being handled. ' +
1100
+ 'Only one reviewer can hold a check; the claim is refused if someone else got there first.',
1101
+ inputSchema: {
1102
+ type: 'object',
1103
+ properties: {
1104
+ work_item_id: { type: 'string', description: 'The refId of the work item' },
1105
+ check_id: {
1106
+ type: 'string',
1107
+ description: 'The check ID (checkId from list_work_item_checks)',
1108
+ },
1109
+ project_slug: {
1110
+ type: 'string',
1111
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1112
+ },
1113
+ },
1114
+ required: ['work_item_id', 'check_id'],
1115
+ },
1116
+ },
1117
+ {
1118
+ name: 'complete_work_item_check',
1119
+ description: 'Record the verdict on a review check: "passed" or "failed", with a short summary of the findings. ' +
1120
+ 'A claimed check can only be completed by its claimant (or an admin). When every check on the item is ' +
1121
+ 'resolved the owning procedure continues — with a failed check it returns the item to the developer with the summaries as feedback.',
1122
+ inputSchema: {
1123
+ type: 'object',
1124
+ properties: {
1125
+ work_item_id: { type: 'string', description: 'The refId of the work item' },
1126
+ check_id: {
1127
+ type: 'string',
1128
+ description: 'The check ID (checkId from list_work_item_checks)',
1129
+ },
1130
+ status: { type: 'string', enum: ['passed', 'failed'], description: 'The verdict' },
1131
+ summary: {
1132
+ type: 'string',
1133
+ description: 'Short summary of the review findings (what was checked, what failed)',
1134
+ },
1135
+ project_slug: {
1136
+ type: 'string',
1137
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1138
+ },
1139
+ },
1140
+ required: ['work_item_id', 'check_id', 'status'],
1141
+ },
1142
+ },
1038
1143
  // Radar Item (Initiative/Roadmap) tools
1039
1144
  {
1040
1145
  name: 'list_radar_items',
@@ -2314,6 +2419,43 @@ class WolfpackMCPServer {
2314
2419
  content: [{ type: 'text', text: 'Work item not found' }],
2315
2420
  };
2316
2421
  }
2422
+ case 'list_work_item_checks': {
2423
+ const parsed = ListWorkItemChecksSchema.parse(args);
2424
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
2425
+ const checks = await this.client.listWorkItemChecks({ workItemId: parsed.work_item_id, status: parsed.status }, teamSlug);
2426
+ const text = checks.length === 0
2427
+ ? parsed.work_item_id
2428
+ ? 'No review checks on this work item'
2429
+ : 'No review checks waiting for you'
2430
+ : JSON.stringify(checks.map(formatWorkItemCheck), null, 2);
2431
+ return { content: [{ type: 'text', text }] };
2432
+ }
2433
+ case 'claim_work_item_check': {
2434
+ const parsed = ClaimWorkItemCheckSchema.parse(args);
2435
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
2436
+ const check = await this.client.claimWorkItemCheck(parsed.work_item_id, parsed.check_id, teamSlug);
2437
+ return {
2438
+ content: [
2439
+ {
2440
+ type: 'text',
2441
+ text: `Claimed ${check.kind} check on #${check.workItemRefId} "${check.workItemTitle}"\n\n${JSON.stringify(formatWorkItemCheck(check), null, 2)}`,
2442
+ },
2443
+ ],
2444
+ };
2445
+ }
2446
+ case 'complete_work_item_check': {
2447
+ const parsed = CompleteWorkItemCheckSchema.parse(args);
2448
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
2449
+ const check = await this.client.completeWorkItemCheck(parsed.work_item_id, parsed.check_id, { status: parsed.status, summary: parsed.summary }, teamSlug);
2450
+ return {
2451
+ content: [
2452
+ {
2453
+ type: 'text',
2454
+ text: `Marked ${check.kind} check on #${check.workItemRefId} as ${check.status}\n\n${JSON.stringify(formatWorkItemCheck(check), null, 2)}`,
2455
+ },
2456
+ ],
2457
+ };
2458
+ }
2317
2459
  // Radar Item handlers
2318
2460
  case 'list_radar_items': {
2319
2461
  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.82",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",