wolfpack-mcp 1.0.39 → 1.0.40

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
@@ -164,11 +164,9 @@ export class WolfpackClient {
164
164
  throw error;
165
165
  }
166
166
  }
167
- async updateWorkProgress(workItemId, description) {
167
+ async updateWorkProgress(workItemId, description, teamSlug) {
168
168
  try {
169
- return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/progress`), {
170
- description,
171
- });
169
+ return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/progress`, teamSlug), { description });
172
170
  }
173
171
  catch (error) {
174
172
  if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
@@ -177,11 +175,9 @@ export class WolfpackClient {
177
175
  throw error;
178
176
  }
179
177
  }
180
- async updateWorkItemStatus(workItemId, status) {
178
+ async updateWorkItemStatus(workItemId, status, teamSlug) {
181
179
  try {
182
- return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/status`), {
183
- status,
184
- });
180
+ return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/status`, teamSlug), { status });
185
181
  }
186
182
  catch (error) {
187
183
  if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
@@ -190,9 +186,9 @@ export class WolfpackClient {
190
186
  throw error;
191
187
  }
192
188
  }
193
- async updateWorkItemAssignee(workItemId, data) {
189
+ async updateWorkItemAssignee(workItemId, data, teamSlug) {
194
190
  try {
195
- return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/assignee`), data);
191
+ return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/assignee`, teamSlug), data);
196
192
  }
197
193
  catch (error) {
198
194
  if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
@@ -201,11 +197,9 @@ export class WolfpackClient {
201
197
  throw error;
202
198
  }
203
199
  }
204
- async updateWorkItemTitle(workItemId, title) {
200
+ async updateWorkItemTitle(workItemId, title, teamSlug) {
205
201
  try {
206
- return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/title`), {
207
- title,
208
- });
202
+ return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/title`, teamSlug), { title });
209
203
  }
210
204
  catch (error) {
211
205
  if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
@@ -214,9 +208,9 @@ export class WolfpackClient {
214
208
  throw error;
215
209
  }
216
210
  }
217
- async updateWorkItemInitiative(workItemId, radarItemId) {
211
+ async updateWorkItemInitiative(workItemId, radarItemId, teamSlug) {
218
212
  try {
219
- return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/initiative`), { radarItemId });
213
+ return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/initiative`, teamSlug), { radarItemId });
220
214
  }
221
215
  catch (error) {
222
216
  if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
@@ -225,9 +219,9 @@ export class WolfpackClient {
225
219
  throw error;
226
220
  }
227
221
  }
228
- async pullWorkItem(workItemId, data) {
222
+ async pullWorkItem(workItemId, data, teamSlug) {
229
223
  try {
230
- return await this.api.post(this.withTeamSlug(`/work-items/${workItemId}/pull`), data || {});
224
+ return await this.api.post(this.withTeamSlug(`/work-items/${workItemId}/pull`, teamSlug), data || {});
231
225
  }
232
226
  catch (error) {
233
227
  if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
@@ -236,11 +230,9 @@ export class WolfpackClient {
236
230
  throw error;
237
231
  }
238
232
  }
239
- async submitWorkItemForm(workItemId, formValues) {
233
+ async submitWorkItemForm(workItemId, formValues, teamSlug) {
240
234
  try {
241
- return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/form`), {
242
- formValues,
243
- });
235
+ return await this.api.put(this.withTeamSlug(`/work-items/${workItemId}/form`, teamSlug), { formValues });
244
236
  }
245
237
  catch (error) {
246
238
  if (error && typeof error === 'object' && 'status' in error && error.status === 404) {
@@ -360,8 +352,8 @@ export class WolfpackClient {
360
352
  const { teamSlug, ...rest } = data;
361
353
  return this.api.post('/issues', { ...rest, teamSlug });
362
354
  }
363
- async updateIssue(issueId, data) {
364
- return this.api.patch(this.withTeamSlug(`/issues/${issueId}`), data);
355
+ async updateIssue(issueId, data, teamSlug) {
356
+ return this.api.patch(this.withTeamSlug(`/issues/${issueId}`, teamSlug), data);
365
357
  }
366
358
  // Wiki Page methods
367
359
  async listWikiPages(options) {
@@ -409,8 +401,8 @@ export class WolfpackClient {
409
401
  const { teamSlug, ...rest } = data;
410
402
  return this.api.post('/wiki-pages', { ...rest, teamSlug });
411
403
  }
412
- async updateWikiPage(pageId, data) {
413
- return this.api.patch(this.withTeamSlug(`/wiki-pages/${pageId}`), data);
404
+ async updateWikiPage(pageId, data, teamSlug) {
405
+ return this.api.patch(this.withTeamSlug(`/wiki-pages/${pageId}`, teamSlug), data);
414
406
  }
415
407
  // Journal Entry methods
416
408
  async listJournalEntries(options) {
@@ -458,21 +450,21 @@ export class WolfpackClient {
458
450
  const { teamSlug, ...rest } = data;
459
451
  return this.api.post('/journal-entries', { ...rest, teamSlug });
460
452
  }
461
- async updateJournalEntry(entryId, data) {
462
- return this.api.patch(this.withTeamSlug(`/journal-entries/${entryId}`), data);
453
+ async updateJournalEntry(entryId, data, teamSlug) {
454
+ return this.api.patch(this.withTeamSlug(`/journal-entries/${entryId}`, teamSlug), data);
463
455
  }
464
456
  // Comment methods
465
- async listWorkItemComments(workItemId) {
466
- return this.api.get(this.withTeamSlug(`/work-items/${workItemId}/comments`));
457
+ async listWorkItemComments(workItemId, teamSlug) {
458
+ return this.api.get(this.withTeamSlug(`/work-items/${workItemId}/comments`, teamSlug));
467
459
  }
468
- async listIssueComments(issueId) {
469
- return this.api.get(this.withTeamSlug(`/issues/${issueId}/comments`));
460
+ async listIssueComments(issueId, teamSlug) {
461
+ return this.api.get(this.withTeamSlug(`/issues/${issueId}/comments`, teamSlug));
470
462
  }
471
- async createWorkItemComment(workItemId, data) {
472
- return this.api.post(this.withTeamSlug(`/work-items/${workItemId}/comments`), data);
463
+ async createWorkItemComment(workItemId, data, teamSlug) {
464
+ return this.api.post(this.withTeamSlug(`/work-items/${workItemId}/comments`, teamSlug), data);
473
465
  }
474
- async createIssueComment(issueId, data) {
475
- return this.api.post(this.withTeamSlug(`/issues/${issueId}/comments`), data);
466
+ async createIssueComment(issueId, data, teamSlug) {
467
+ return this.api.post(this.withTeamSlug(`/issues/${issueId}/comments`, teamSlug), data);
476
468
  }
477
469
  /**
478
470
  * Upload an image and get back a URL that can be used in markdown content.
package/dist/index.js CHANGED
@@ -96,6 +96,10 @@ const GetWorkItemSchema = z.object({
96
96
  const UpdateWorkProgressSchema = z.object({
97
97
  work_item_id: z.string().describe('The ID of the work item'),
98
98
  description: z.string().describe('Updated description/notes for the work item'),
99
+ project_slug: z
100
+ .string()
101
+ .optional()
102
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
99
103
  });
100
104
  const VALID_STATUSES = [
101
105
  'pending',
@@ -111,6 +115,10 @@ const VALID_STATUSES = [
111
115
  const UpdateWorkItemStatusSchema = z.object({
112
116
  work_item_id: z.string().describe('The ID of the work item'),
113
117
  status: z.enum(VALID_STATUSES).describe('New status'),
118
+ project_slug: z
119
+ .string()
120
+ .optional()
121
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
114
122
  });
115
123
  const UpdateWorkItemAssigneeSchema = z.object({
116
124
  work_item_id: z.string().describe('The ID of the work item'),
@@ -118,10 +126,18 @@ const UpdateWorkItemAssigneeSchema = z.object({
118
126
  .string()
119
127
  .nullable()
120
128
  .describe('User ID to assign as leading user, or null to unassign'),
129
+ project_slug: z
130
+ .string()
131
+ .optional()
132
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
121
133
  });
122
134
  const UpdateWorkItemTitleSchema = z.object({
123
135
  work_item_id: z.string().describe('The ID of the work item'),
124
136
  title: z.string().describe('New title for the work item'),
137
+ project_slug: z
138
+ .string()
139
+ .optional()
140
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
125
141
  });
126
142
  const UpdateWorkItemInitiativeSchema = z.object({
127
143
  work_item_id: z.string().describe('The ID of the work item'),
@@ -129,6 +145,10 @@ const UpdateWorkItemInitiativeSchema = z.object({
129
145
  .string()
130
146
  .nullable()
131
147
  .describe('Radar/initiative item ID to link to, or null to unlink'),
148
+ project_slug: z
149
+ .string()
150
+ .optional()
151
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
132
152
  });
133
153
  const PullWorkItemSchema = z.object({
134
154
  work_item_id: z.string().describe('The ID of the work item to pull from backlog'),
@@ -136,10 +156,18 @@ const PullWorkItemSchema = z.object({
136
156
  .string()
137
157
  .optional()
138
158
  .describe('User ID to assign as leading user (defaults to API key owner)'),
159
+ project_slug: z
160
+ .string()
161
+ .optional()
162
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
139
163
  });
140
164
  const SubmitWorkItemFormSchema = z.object({
141
165
  work_item_id: z.string().describe('The ID of the work item'),
142
166
  form_values: z.record(z.any()).describe('Key-value pairs matching formDefinition field names'),
167
+ project_slug: z
168
+ .string()
169
+ .optional()
170
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
143
171
  });
144
172
  // Radar Item (Initiative/Roadmap) schemas
145
173
  const ListRadarItemsSchema = z.object({
@@ -245,6 +273,10 @@ const UpdateIssueSchema = z.object({
245
273
  severity: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Updated severity'),
246
274
  assigned_to_id: z.string().optional().describe('Updated assignee'),
247
275
  closing_note: z.string().optional().describe('Closing note (when closing the issue)'),
276
+ project_slug: z
277
+ .string()
278
+ .optional()
279
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
248
280
  });
249
281
  // Wiki Page schemas
250
282
  const ListWikiPagesSchema = z.object({
@@ -284,6 +316,10 @@ const UpdateWikiPageSchema = z.object({
284
316
  page_id: z.string().describe('The page slug'),
285
317
  title: z.string().optional().describe('Updated title'),
286
318
  content: z.string().optional().describe('Updated content (markdown)'),
319
+ project_slug: z
320
+ .string()
321
+ .optional()
322
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
287
323
  });
288
324
  // Journal Entry schemas
289
325
  const ListJournalEntriesSchema = z.object({
@@ -316,21 +352,41 @@ const UpdateJournalEntrySchema = z.object({
316
352
  entry_id: z.string().describe('The entry refId (number)'),
317
353
  title: z.string().optional().describe('Updated title'),
318
354
  content: z.string().optional().describe('Updated content (markdown)'),
355
+ project_slug: z
356
+ .string()
357
+ .optional()
358
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
319
359
  });
320
360
  // Comment schemas
321
361
  const ListWorkItemCommentsSchema = z.object({
322
362
  work_item_id: z.string().describe('The work item refId (number)'),
363
+ project_slug: z
364
+ .string()
365
+ .optional()
366
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
323
367
  });
324
368
  const ListIssueCommentsSchema = z.object({
325
369
  issue_id: z.string().describe('The issue refId (number)'),
370
+ project_slug: z
371
+ .string()
372
+ .optional()
373
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
326
374
  });
327
375
  const CreateWorkItemCommentSchema = z.object({
328
376
  work_item_id: z.string().describe('The work item refId (number)'),
329
377
  content: z.string().describe('Comment content (markdown)'),
378
+ project_slug: z
379
+ .string()
380
+ .optional()
381
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
330
382
  });
331
383
  const CreateIssueCommentSchema = z.object({
332
384
  issue_id: z.string().describe('The issue refId (number)'),
333
385
  content: z.string().describe('Comment content (markdown)'),
386
+ project_slug: z
387
+ .string()
388
+ .optional()
389
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
334
390
  });
335
391
  // Image upload schema
336
392
  const UploadImageSchema = z.object({
@@ -1322,7 +1378,8 @@ class WolfpackMCPServer {
1322
1378
  }
1323
1379
  case 'update_work_progress': {
1324
1380
  const parsed = UpdateWorkProgressSchema.parse(args);
1325
- const workItem = await this.client.updateWorkProgress(parsed.work_item_id, parsed.description);
1381
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1382
+ const workItem = await this.client.updateWorkProgress(parsed.work_item_id, parsed.description, teamSlug);
1326
1383
  if (workItem) {
1327
1384
  return {
1328
1385
  content: [
@@ -1339,7 +1396,8 @@ class WolfpackMCPServer {
1339
1396
  }
1340
1397
  case 'update_work_item_status': {
1341
1398
  const parsed = UpdateWorkItemStatusSchema.parse(args);
1342
- const workItem = await this.client.updateWorkItemStatus(parsed.work_item_id, parsed.status);
1399
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1400
+ const workItem = await this.client.updateWorkItemStatus(parsed.work_item_id, parsed.status, teamSlug);
1343
1401
  if (workItem) {
1344
1402
  return {
1345
1403
  content: [
@@ -1356,9 +1414,10 @@ class WolfpackMCPServer {
1356
1414
  }
1357
1415
  case 'update_work_item_assignee': {
1358
1416
  const parsed = UpdateWorkItemAssigneeSchema.parse(args);
1417
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1359
1418
  const workItem = await this.client.updateWorkItemAssignee(parsed.work_item_id, {
1360
1419
  leadingUserId: parsed.leading_user_id,
1361
- });
1420
+ }, teamSlug);
1362
1421
  if (workItem) {
1363
1422
  const assigneeText = parsed.leading_user_id
1364
1423
  ? `assigned to ${parsed.leading_user_id}`
@@ -1378,7 +1437,8 @@ class WolfpackMCPServer {
1378
1437
  }
1379
1438
  case 'update_work_item_title': {
1380
1439
  const parsed = UpdateWorkItemTitleSchema.parse(args);
1381
- const workItem = await this.client.updateWorkItemTitle(parsed.work_item_id, parsed.title);
1440
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1441
+ const workItem = await this.client.updateWorkItemTitle(parsed.work_item_id, parsed.title, teamSlug);
1382
1442
  if (workItem) {
1383
1443
  return {
1384
1444
  content: [
@@ -1395,7 +1455,8 @@ class WolfpackMCPServer {
1395
1455
  }
1396
1456
  case 'update_work_item_initiative': {
1397
1457
  const parsed = UpdateWorkItemInitiativeSchema.parse(args);
1398
- const workItem = await this.client.updateWorkItemInitiative(parsed.work_item_id, parsed.radar_item_id);
1458
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1459
+ const workItem = await this.client.updateWorkItemInitiative(parsed.work_item_id, parsed.radar_item_id, teamSlug);
1399
1460
  if (workItem) {
1400
1461
  const initiativeText = parsed.radar_item_id
1401
1462
  ? `linked to initiative ${parsed.radar_item_id}`
@@ -1415,9 +1476,10 @@ class WolfpackMCPServer {
1415
1476
  }
1416
1477
  case 'pull_work_item': {
1417
1478
  const parsed = PullWorkItemSchema.parse(args);
1479
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1418
1480
  const workItem = await this.client.pullWorkItem(parsed.work_item_id, {
1419
1481
  leadingUserId: parsed.leading_user_id,
1420
- });
1482
+ }, teamSlug);
1421
1483
  if (workItem) {
1422
1484
  return {
1423
1485
  content: [
@@ -1434,7 +1496,8 @@ class WolfpackMCPServer {
1434
1496
  }
1435
1497
  case 'submit_work_item_form': {
1436
1498
  const parsed = SubmitWorkItemFormSchema.parse(args);
1437
- const workItem = await this.client.submitWorkItemForm(parsed.work_item_id, parsed.form_values);
1499
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1500
+ const workItem = await this.client.submitWorkItemForm(parsed.work_item_id, parsed.form_values, teamSlug);
1438
1501
  if (workItem) {
1439
1502
  return {
1440
1503
  content: [
@@ -1566,6 +1629,7 @@ class WolfpackMCPServer {
1566
1629
  }
1567
1630
  case 'update_issue': {
1568
1631
  const parsed = UpdateIssueSchema.parse(args);
1632
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1569
1633
  const issue = await this.client.updateIssue(parsed.issue_id, {
1570
1634
  title: parsed.title,
1571
1635
  description: parsed.description,
@@ -1573,7 +1637,7 @@ class WolfpackMCPServer {
1573
1637
  severity: parsed.severity,
1574
1638
  assignedToId: parsed.assigned_to_id,
1575
1639
  closingNote: parsed.closing_note,
1576
- });
1640
+ }, teamSlug);
1577
1641
  return {
1578
1642
  content: [
1579
1643
  {
@@ -1633,10 +1697,11 @@ class WolfpackMCPServer {
1633
1697
  }
1634
1698
  case 'update_wiki_page': {
1635
1699
  const parsed = UpdateWikiPageSchema.parse(args);
1700
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1636
1701
  const page = await this.client.updateWikiPage(parsed.page_id, {
1637
1702
  title: parsed.title,
1638
1703
  content: parsed.content,
1639
- });
1704
+ }, teamSlug);
1640
1705
  return {
1641
1706
  content: [
1642
1707
  {
@@ -1695,10 +1760,11 @@ class WolfpackMCPServer {
1695
1760
  }
1696
1761
  case 'update_journal_entry': {
1697
1762
  const parsed = UpdateJournalEntrySchema.parse(args);
1763
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1698
1764
  const entry = await this.client.updateJournalEntry(parsed.entry_id, {
1699
1765
  title: parsed.title,
1700
1766
  content: parsed.content,
1701
- });
1767
+ }, teamSlug);
1702
1768
  return {
1703
1769
  content: [
1704
1770
  {
@@ -1711,23 +1777,26 @@ class WolfpackMCPServer {
1711
1777
  // Comment handlers
1712
1778
  case 'list_work_item_comments': {
1713
1779
  const parsed = ListWorkItemCommentsSchema.parse(args);
1714
- const comments = await this.client.listWorkItemComments(parsed.work_item_id);
1780
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1781
+ const comments = await this.client.listWorkItemComments(parsed.work_item_id, teamSlug);
1715
1782
  return {
1716
1783
  content: [{ type: 'text', text: JSON.stringify(stripUuids(comments), null, 2) }],
1717
1784
  };
1718
1785
  }
1719
1786
  case 'list_issue_comments': {
1720
1787
  const parsed = ListIssueCommentsSchema.parse(args);
1721
- const comments = await this.client.listIssueComments(parsed.issue_id);
1788
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1789
+ const comments = await this.client.listIssueComments(parsed.issue_id, teamSlug);
1722
1790
  return {
1723
1791
  content: [{ type: 'text', text: JSON.stringify(stripUuids(comments), null, 2) }],
1724
1792
  };
1725
1793
  }
1726
1794
  case 'create_work_item_comment': {
1727
1795
  const parsed = CreateWorkItemCommentSchema.parse(args);
1796
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1728
1797
  const comment = await this.client.createWorkItemComment(parsed.work_item_id, {
1729
1798
  content: parsed.content,
1730
- });
1799
+ }, teamSlug);
1731
1800
  return {
1732
1801
  content: [
1733
1802
  {
@@ -1739,9 +1808,10 @@ class WolfpackMCPServer {
1739
1808
  }
1740
1809
  case 'create_issue_comment': {
1741
1810
  const parsed = CreateIssueCommentSchema.parse(args);
1811
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1742
1812
  const comment = await this.client.createIssueComment(parsed.issue_id, {
1743
1813
  content: parsed.content,
1744
- });
1814
+ }, teamSlug);
1745
1815
  return {
1746
1816
  content: [
1747
1817
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.39",
3
+ "version": "1.0.40",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",