wolfpack-mcp 1.0.53 → 1.0.54

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.
@@ -61,6 +61,14 @@ export const AGENT_BUILDER_TOOLS = [
61
61
  type: 'string',
62
62
  description: 'Username for the agent (e.g. "k9"). Set to null to clear.',
63
63
  },
64
+ specialisation: {
65
+ type: 'string',
66
+ description: 'Short label describing the agent\'s area of expertise (e.g. "Frontend Engineer"). Set to null to clear.',
67
+ },
68
+ description: {
69
+ type: 'string',
70
+ description: 'README-style description for human reference. Not used in any agent context. Set to null to clear.',
71
+ },
64
72
  instructions: {
65
73
  type: 'string',
66
74
  description: 'Agent-specific instructions (supplements template instructions). Set to null to clear.',
@@ -573,6 +581,8 @@ export async function handleAgentBuilderTool(name, args, client) {
573
581
  agent_id: z.string(),
574
582
  name: z.string().optional(),
575
583
  username: z.string().nullable().optional(),
584
+ specialisation: z.string().nullable().optional(),
585
+ description: z.string().nullable().optional(),
576
586
  instructions: z.string().nullable().optional(),
577
587
  llm_provider: z.string().nullable().optional(),
578
588
  llm_model: z.string().nullable().optional(),
@@ -587,6 +597,10 @@ export async function handleAgentBuilderTool(name, args, client) {
587
597
  fields.name = rest.name;
588
598
  if (rest.username !== undefined)
589
599
  fields.username = rest.username;
600
+ if (rest.specialisation !== undefined)
601
+ fields.specialisation = rest.specialisation;
602
+ if (rest.description !== undefined)
603
+ fields.description = rest.description;
590
604
  if (rest.instructions !== undefined)
591
605
  fields.instructions = rest.instructions;
592
606
  if (rest.llm_provider !== undefined)
@@ -880,8 +894,8 @@ export async function handleAgentBuilderTool(name, args, client) {
880
894
  }
881
895
  // ─── Skills (reading) ─────────────────────────────────────────────────────
882
896
  case 'list_agent_skills': {
883
- const parsed = z.object({ agent_id: z.string() }).parse(args);
884
- const skills = await client.listAgentSkills(parsed.agent_id);
897
+ const parsed = z.object({ agent_id: z.string(), org_slug: orgSlugField }).parse(args);
898
+ const skills = await client.listAgentSkills(parsed.agent_id, resolveOrg(parsed));
885
899
  return { content: [{ type: 'text', text: text(skills) }] };
886
900
  }
887
901
  case 'get_skill_detail': {
package/dist/client.js CHANGED
@@ -725,8 +725,9 @@ export class WolfpackClient {
725
725
  return this.api.post(this.withOrgSlug(`/skills/agent-assignments/${agentId}`, orgSlug), { skillIds });
726
726
  }
727
727
  // ─── Agent Builder: Skills (read) ──────────────────────────────────────────
728
- async listAgentSkills(agentId) {
729
- return this.api.get(`/skills/agent-profiles/${agentId}`);
728
+ async listAgentSkills(agentId, orgSlug) {
729
+ const agent = await this.getAgent(agentId, orgSlug);
730
+ return agent?.skills ?? [];
730
731
  }
731
732
  async listOrgSkills(orgSlug) {
732
733
  return this.api.get(this.withOrgSlug('/agents/org-skills', orgSlug));
package/dist/index.js CHANGED
@@ -53,6 +53,8 @@ const CONTENT_LINKING_HELP = 'CROSS-REFERENCES: In any markdown content, you can
53
53
  '#j123 or #journal-123 for journal entries, #c123 or #case-123 for cases, #p123 or #proc-123 for procedures. ' +
54
54
  'Use @username to mention team members (triggers notifications). ' +
55
55
  'Standard markdown links also work: [link text](/project/{slug}/work-items/123).';
56
+ /** Zod string that strips a leading '#' so agents can pass "#42" or "42". */
57
+ const refIdString = () => z.string().transform((v) => v.replace(/^#/, ''));
56
58
  // Work Item schemas
57
59
  // Use z.coerce.string() to handle any type coercion issues from MCP args
58
60
  const ListWorkItemsSchema = z.object({
@@ -94,11 +96,11 @@ const ListWorkItemsSchema = z.object({
94
96
  offset: z.number().optional().describe('Number of items to skip'),
95
97
  });
96
98
  const GetWorkItemSchema = z.object({
97
- work_item_id: z.string().describe('The refId (number) of the work item'),
99
+ work_item_id: refIdString().describe('The refId (number) of the work item'),
98
100
  project_slug: z.string().optional().describe('Project slug (required when looking up by refId)'),
99
101
  });
100
102
  const UpdateWorkProgressSchema = z.object({
101
- work_item_id: z.string().describe('The ID of the work item'),
103
+ work_item_id: refIdString().describe('The ID of the work item'),
102
104
  description: z.string().describe('Updated description/notes for the work item'),
103
105
  project_slug: z
104
106
  .string()
@@ -117,7 +119,7 @@ const VALID_STATUSES = [
117
119
  'archived',
118
120
  ];
119
121
  const UpdateWorkItemSchema = z.object({
120
- work_item_id: z.string().describe('The ID of the work item'),
122
+ work_item_id: refIdString().describe('The ID of the work item'),
121
123
  title: z.string().optional().describe('New title for the work item'),
122
124
  description: z
123
125
  .string()
@@ -172,7 +174,7 @@ const UpdateWorkItemSchema = z.object({
172
174
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
173
175
  });
174
176
  const PullWorkItemSchema = z.object({
175
- work_item_id: z.string().describe('The ID of the work item to pull from backlog'),
177
+ work_item_id: refIdString().describe('The ID of the work item to pull from backlog'),
176
178
  leading_user_id: z
177
179
  .string()
178
180
  .optional()
@@ -183,7 +185,7 @@ const PullWorkItemSchema = z.object({
183
185
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
184
186
  });
185
187
  const SubmitWorkItemFormSchema = z.object({
186
- work_item_id: z.string().describe('The ID of the work item'),
188
+ work_item_id: refIdString().describe('The ID of the work item'),
187
189
  form_values: z.record(z.any()).describe('Key-value pairs matching formDefinition field names'),
188
190
  project_slug: z
189
191
  .string()
@@ -264,7 +266,7 @@ const ListIssuesSchema = z.object({
264
266
  offset: z.number().optional().describe('Number of items to skip'),
265
267
  });
266
268
  const GetIssueSchema = z.object({
267
- issue_id: z.string().describe('The refId (number) of the issue'),
269
+ issue_id: refIdString().describe('The refId (number) of the issue'),
268
270
  project_slug: z.string().optional().describe('Project slug (required when looking up by refId)'),
269
271
  });
270
272
  // Create schemas
@@ -309,7 +311,7 @@ const CreateIssueSchema = z.object({
309
311
  actual_behavior: z.string().optional().describe('Actual behavior observed'),
310
312
  });
311
313
  const UpdateIssueSchema = z.object({
312
- issue_id: z.string().describe('The refId (number) of the issue to update'),
314
+ issue_id: refIdString().describe('The refId (number) of the issue to update'),
313
315
  title: z.string().optional().describe('Updated title'),
314
316
  description: z.string().optional().describe('Updated description'),
315
317
  status: z
@@ -415,21 +417,21 @@ const UpdateJournalEntrySchema = z.object({
415
417
  });
416
418
  // Comment schemas
417
419
  const ListWorkItemCommentsSchema = z.object({
418
- work_item_id: z.string().describe('The work item refId (number)'),
420
+ work_item_id: refIdString().describe('The work item refId (number)'),
419
421
  project_slug: z
420
422
  .string()
421
423
  .optional()
422
424
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
423
425
  });
424
426
  const ListIssueCommentsSchema = z.object({
425
- issue_id: z.string().describe('The issue refId (number)'),
427
+ issue_id: refIdString().describe('The issue refId (number)'),
426
428
  project_slug: z
427
429
  .string()
428
430
  .optional()
429
431
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
430
432
  });
431
433
  const CreateWorkItemCommentSchema = z.object({
432
- work_item_id: z.string().describe('The work item refId (number)'),
434
+ work_item_id: refIdString().describe('The work item refId (number)'),
433
435
  content: z.string().describe('Comment content (markdown)'),
434
436
  project_slug: z
435
437
  .string()
@@ -437,7 +439,7 @@ const CreateWorkItemCommentSchema = z.object({
437
439
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
438
440
  });
439
441
  const CreateIssueCommentSchema = z.object({
440
- issue_id: z.string().describe('The issue refId (number)'),
442
+ issue_id: refIdString().describe('The issue refId (number)'),
441
443
  content: z.string().describe('Comment content (markdown)'),
442
444
  project_slug: z
443
445
  .string()
@@ -445,7 +447,7 @@ const CreateIssueCommentSchema = z.object({
445
447
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
446
448
  });
447
449
  const DeleteWorkItemCommentSchema = z.object({
448
- work_item_id: z.string().describe('The work item refId (number)'),
450
+ work_item_id: refIdString().describe('The work item refId (number)'),
449
451
  comment_id: z.string().describe('The comment ID to delete'),
450
452
  project_slug: z
451
453
  .string()
@@ -453,7 +455,7 @@ const DeleteWorkItemCommentSchema = z.object({
453
455
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
454
456
  });
455
457
  const DeleteIssueCommentSchema = z.object({
456
- issue_id: z.string().describe('The issue refId (number)'),
458
+ issue_id: refIdString().describe('The issue refId (number)'),
457
459
  comment_id: z.string().describe('The comment ID to delete'),
458
460
  project_slug: z
459
461
  .string()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.53",
3
+ "version": "1.0.54",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",