wolfpack-mcp 1.0.72 → 1.0.74
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 +4 -0
- package/dist/index.js +14 -4
- package/dist/workItemReminders.js +3 -2
- package/dist/workItemReminders.test.js +4 -4
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -97,6 +97,7 @@ export class WolfpackClient {
|
|
|
97
97
|
items: firstPage.items,
|
|
98
98
|
total: firstPage.total,
|
|
99
99
|
truncated: true,
|
|
100
|
+
notice: firstPage.notice,
|
|
100
101
|
};
|
|
101
102
|
}
|
|
102
103
|
// If all items fit in first page, return them
|
|
@@ -105,6 +106,7 @@ export class WolfpackClient {
|
|
|
105
106
|
items: firstPage.items,
|
|
106
107
|
total: firstPage.total,
|
|
107
108
|
truncated: false,
|
|
109
|
+
notice: firstPage.notice,
|
|
108
110
|
};
|
|
109
111
|
}
|
|
110
112
|
// Fetch remaining pages
|
|
@@ -123,6 +125,7 @@ export class WolfpackClient {
|
|
|
123
125
|
items: allItems,
|
|
124
126
|
total: firstPage.total,
|
|
125
127
|
truncated: false,
|
|
128
|
+
notice: firstPage.notice,
|
|
126
129
|
};
|
|
127
130
|
}
|
|
128
131
|
// Work Item methods
|
|
@@ -172,6 +175,7 @@ export class WolfpackClient {
|
|
|
172
175
|
items: response.items,
|
|
173
176
|
total: response.total,
|
|
174
177
|
truncated: response.total > response.items.length,
|
|
178
|
+
notice: response.notice,
|
|
175
179
|
};
|
|
176
180
|
}
|
|
177
181
|
// Otherwise, fetch all pages automatically
|
package/dist/index.js
CHANGED
|
@@ -100,7 +100,7 @@ const ListWorkItemsSchema = z.object({
|
|
|
100
100
|
approved: z.coerce
|
|
101
101
|
.string()
|
|
102
102
|
.optional()
|
|
103
|
-
.describe('Filter by approval: "true" for approved items, "false" for not-yet-approved.
|
|
103
|
+
.describe('Filter by approval: "true" for approved items, "false" for not-yet-approved. Unassigned backlog items must be approved before agents may pull them; items assigned to you can be pulled regardless.'),
|
|
104
104
|
limit: z.number().optional().describe('Maximum number of items to return'),
|
|
105
105
|
offset: z.number().optional().describe('Number of items to skip'),
|
|
106
106
|
});
|
|
@@ -751,6 +751,9 @@ class WolfpackMCPServer {
|
|
|
751
751
|
description: 'List work items (tasks/tickets) on the Kanban board or backlog. Work items are the PRIMARY entity — bare #N references (e.g. "work on #1") always mean work items. ' +
|
|
752
752
|
'By default lists ALL items in the team, sorted by most recently updated. ' +
|
|
753
753
|
'Use assigned_to_id="me" to filter to only your assigned items. ' +
|
|
754
|
+
'AGENTS: unless granted the mcp:work_items:read_all permission, your results are always ' +
|
|
755
|
+
'narrowed to items assigned to you or routed to a work pool you belong to, whatever ' +
|
|
756
|
+
'assigned_to_id you pass; the response says so when this applies. ' +
|
|
754
757
|
'TERMINOLOGY: "board" and "kanban" are synonymous - both refer to the Kanban board of work items. ' +
|
|
755
758
|
'The board has columns: "new" (to do), "doing" (in progress), "review" (pending review), "ready" (code done, awaiting deployment), "blocked", "completed" (deployed). ' +
|
|
756
759
|
'The "backlog" or "pending" status represents items not yet on the board. ' +
|
|
@@ -811,7 +814,8 @@ class WolfpackMCPServer {
|
|
|
811
814
|
approved: {
|
|
812
815
|
type: 'string',
|
|
813
816
|
description: 'Filter by approval: "true" for approved items, "false" for not-yet-approved. ' +
|
|
814
|
-
'
|
|
817
|
+
'Unassigned backlog ("pending") items must be approved by a human before agents may ' +
|
|
818
|
+
'pull them; items assigned to you can be pulled regardless.',
|
|
815
819
|
},
|
|
816
820
|
limit: { type: 'number', description: 'Maximum number of items to return' },
|
|
817
821
|
offset: { type: 'number', description: 'Number of items to skip' },
|
|
@@ -965,8 +969,11 @@ class WolfpackMCPServer {
|
|
|
965
969
|
description: 'Pull a specific work item from the backlog to the board. ' +
|
|
966
970
|
'REQUIRED: Use this when starting work on a "pending" (backlog) item. ' +
|
|
967
971
|
'This claims the item (assigns to you) and sets status to "new". ' +
|
|
968
|
-
'
|
|
969
|
-
'
|
|
972
|
+
'AGENTS: an item already assigned to you is always pullable, approved or not. An item ' +
|
|
973
|
+
'that is NOT assigned to you is pullable only if it is routed to a work pool you belong ' +
|
|
974
|
+
'to AND a human has approved it (approved=true) — pool membership grants the access, ' +
|
|
975
|
+
'approval grants the go-ahead. An unassigned item in no work pool cannot be pulled by an ' +
|
|
976
|
+
'agent and will return 403: ask a human to route it to your pool or assign it to you. ' +
|
|
970
977
|
'After pulling, move to "doing" to indicate active work, then "review" when done. ' +
|
|
971
978
|
'If no assignee is specified, assigns to the API key owner. ' +
|
|
972
979
|
'In personal projects, items are always assigned to the owner.',
|
|
@@ -2090,6 +2097,9 @@ class WolfpackMCPServer {
|
|
|
2090
2097
|
offset: parsed.offset,
|
|
2091
2098
|
});
|
|
2092
2099
|
let text = JSON.stringify(stripUuids(result.items), null, 2);
|
|
2100
|
+
if (result.notice) {
|
|
2101
|
+
text = `Note: ${result.notice}\n\n${text}`;
|
|
2102
|
+
}
|
|
2093
2103
|
if (result.truncated) {
|
|
2094
2104
|
text = `Note: Results truncated. Showing ${result.items.length} of ${result.total} items. Use filters or limit/offset for pagination.\n\n${text}`;
|
|
2095
2105
|
}
|
|
@@ -30,8 +30,9 @@ const STATUS_REMINDERS = {
|
|
|
30
30
|
export function getWorkItemReminders(status, description, approved) {
|
|
31
31
|
const reminders = [];
|
|
32
32
|
if (status === 'pending' && approved === false) {
|
|
33
|
-
// Overrides the generic pending reminder:
|
|
34
|
-
reminders.push('REMINDER: This backlog item has NOT been approved.
|
|
33
|
+
// Overrides the generic pending reminder: approval only gates unassigned items
|
|
34
|
+
reminders.push('REMINDER: This backlog item has NOT been approved. If it is assigned to you, that assignment ' +
|
|
35
|
+
'overrides approval — pull it with pull_work_item and start work. If it is not assigned to you, ' +
|
|
35
36
|
'leave it in the backlog until a human approves it.');
|
|
36
37
|
}
|
|
37
38
|
else {
|
|
@@ -35,10 +35,10 @@ describe('getWorkItemReminders', () => {
|
|
|
35
35
|
expect.stringContaining('pull_work_item'),
|
|
36
36
|
]);
|
|
37
37
|
});
|
|
38
|
-
it('
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
]);
|
|
38
|
+
it('explains the assignment override on unapproved pending items', () => {
|
|
39
|
+
const reminders = getWorkItemReminders('pending', PLAN, false);
|
|
40
|
+
expect(reminders).toEqual([expect.stringContaining('NOT been approved')]);
|
|
41
|
+
expect(reminders[0]).toContain('assignment overrides approval');
|
|
42
42
|
});
|
|
43
43
|
it('tells agents to move new items to doing', () => {
|
|
44
44
|
expect(getWorkItemReminders('new', PLAN)).toEqual([
|