wolfpack-mcp 1.0.77 → 1.0.78
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/README.md +2 -1
- package/dist/index.js +31 -6
- package/dist/workItemReminders.js +3 -0
- package/dist/workItemReminders.test.js +6 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -232,7 +232,8 @@ Get a specific issue.
|
|
|
232
232
|
|
|
233
233
|
#### `create_issue`
|
|
234
234
|
|
|
235
|
-
Create a new issue.
|
|
235
|
+
Create a new issue. Human callers only — issues are how the people using the product report problems
|
|
236
|
+
they hit, so an agent files what it finds with `create_work_item` instead.
|
|
236
237
|
|
|
237
238
|
- `title` (required): Issue title
|
|
238
239
|
- `description`, `severity`, `type`, `assigned_to_id`, `environment`, `affected_version`, `reproducible`,
|
package/dist/index.js
CHANGED
|
@@ -828,7 +828,8 @@ class WolfpackMCPServer {
|
|
|
828
828
|
'Returns full details including description (markdown notes). ' +
|
|
829
829
|
'Call this before updating to see current content. ' +
|
|
830
830
|
'WORKFLOW: When asked to work on an item, check its status and follow the required state transitions ' +
|
|
831
|
-
'(pending→pull first, new→doing,
|
|
831
|
+
'(pending→pull first, new→doing, review→doing when you are picking the work back up, ' +
|
|
832
|
+
'blocked/ready/completed/closed→new→doing, then review when done). ' +
|
|
832
833
|
'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. ' +
|
|
833
834
|
'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. ' +
|
|
834
835
|
'IMAGES: Image references in the description (e.g. ``) can be viewed using the download_image tool.',
|
|
@@ -850,7 +851,7 @@ class WolfpackMCPServer {
|
|
|
850
851
|
{
|
|
851
852
|
name: 'update_work_progress',
|
|
852
853
|
description: 'Update work item description/notes with your progress. WORKFLOW: 1) get_work_item to read current notes 2) Modify the markdown description with new findings/progress 3) Call this with the complete updated description. The full description replaces the existing one. ' +
|
|
853
|
-
'STATUS: Items in "new" are auto-advanced to "doing" (
|
|
854
|
+
'STATUS: Items in "new" — and items in "review" you are picking back up — are auto-advanced to "doing" (recording progress means work is under way). Completing the work is NOT auto-detected: when done, set status to "review" via update_work_item and add a completion comment. ' +
|
|
854
855
|
'CRITICAL: NEVER overwrite or remove the original description text. Preserve all existing content exactly as-is. Append your plan below a "---" separator. You may only modify content you previously added (your plan section). ' +
|
|
855
856
|
'BEST PRACTICE: Append a plan with markdown checkboxes (- [ ] task). Check off completed tasks (- [x] task) as you progress. Include sections for: Plan (checklist), Approach (strategy), and Notes (discoveries/decisions). ' +
|
|
856
857
|
CONTENT_LINKING_HELP,
|
|
@@ -881,6 +882,7 @@ class WolfpackMCPServer {
|
|
|
881
882
|
'Take it with pull_work_item, which assigns it to you and puts it in "doing"; that is ' +
|
|
882
883
|
'what makes the board show who is working on what. ' +
|
|
883
884
|
'When moving to "review", add a completion comment via create_work_item_comment. When moving to "blocked", add a comment explaining the blocker. ' +
|
|
885
|
+
'When you take an item back out of "review" to rework it, set it to "doing" first — an item being changed is not an item waiting to be reviewed. ' +
|
|
884
886
|
'closing_comment is only accepted together with status "closed" — never use it for progress or completion notes.',
|
|
885
887
|
inputSchema: {
|
|
886
888
|
type: 'object',
|
|
@@ -1271,6 +1273,7 @@ class WolfpackMCPServer {
|
|
|
1271
1273
|
{
|
|
1272
1274
|
name: 'create_issue',
|
|
1273
1275
|
description: 'Create a new issue in your current project (auto-selected for single-project users, or use list_projects first for multi-project). Requires mcp:issues:create permission. ' +
|
|
1276
|
+
'Agents: not for you. Issues are how the people using the product report problems they hit — file what you found with create_work_item instead. ' +
|
|
1274
1277
|
CONTENT_LINKING_HELP,
|
|
1275
1278
|
inputSchema: {
|
|
1276
1279
|
type: 'object',
|
|
@@ -2136,12 +2139,16 @@ class WolfpackMCPServer {
|
|
|
2136
2139
|
let workItem = await this.client.updateWorkProgress(parsed.work_item_id, parsed.description, teamSlug);
|
|
2137
2140
|
if (workItem) {
|
|
2138
2141
|
let summary = `Updated description on: ${workItem.title}`;
|
|
2139
|
-
//
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
+
// Recording progress means the work is under way: a "new" item starts, and an
|
|
2143
|
+
// item in "review" comes back to "doing" because its developer is working on it
|
|
2144
|
+
// again (#1787) — otherwise the board keeps showing handed-over work that is
|
|
2145
|
+
// still being changed.
|
|
2146
|
+
const previousStatus = workItem.status;
|
|
2147
|
+
if (previousStatus === 'new' || previousStatus === 'review') {
|
|
2148
|
+
const advanced = await this.moveToDoing(parsed.work_item_id, teamSlug);
|
|
2142
2149
|
if (advanced) {
|
|
2143
2150
|
workItem = advanced;
|
|
2144
|
-
summary +=
|
|
2151
|
+
summary += ` (status auto-advanced ${previousStatus} → doing)`;
|
|
2145
2152
|
}
|
|
2146
2153
|
}
|
|
2147
2154
|
let text = `${summary}\n\n${JSON.stringify(stripUuids(workItem), null, 2)}`;
|
|
@@ -2971,6 +2978,24 @@ class WolfpackMCPServer {
|
|
|
2971
2978
|
}
|
|
2972
2979
|
});
|
|
2973
2980
|
}
|
|
2981
|
+
/**
|
|
2982
|
+
* Put a work item in "doing" after progress was recorded on it, and report whether that
|
|
2983
|
+
* stuck. An agent whose work pool may not set "doing" — a reviewer annotating an item in
|
|
2984
|
+
* "review" rather than the developer resuming it — is refused by the backend status
|
|
2985
|
+
* policy; that refusal is the right answer, so it leaves the saved note alone instead of
|
|
2986
|
+
* failing the call the agent actually made.
|
|
2987
|
+
*/
|
|
2988
|
+
async moveToDoing(workItemId, teamSlug) {
|
|
2989
|
+
try {
|
|
2990
|
+
return await this.client.updateWorkItem(workItemId, { status: 'doing' }, teamSlug);
|
|
2991
|
+
}
|
|
2992
|
+
catch (error) {
|
|
2993
|
+
if (error && typeof error === 'object' && 'status' in error && error.status === 403) {
|
|
2994
|
+
return null;
|
|
2995
|
+
}
|
|
2996
|
+
throw error;
|
|
2997
|
+
}
|
|
2998
|
+
}
|
|
2974
2999
|
isImageBuffer(buffer) {
|
|
2975
3000
|
if (buffer.length < 4)
|
|
2976
3001
|
return false;
|
|
@@ -25,6 +25,9 @@ const STATUS_REMINDERS = {
|
|
|
25
25
|
'BEFORE starting work.',
|
|
26
26
|
doing: 'REMINDER: This work item is in "doing". The moment the work is complete, set status to "review" ' +
|
|
27
27
|
'(update_work_item) and add a completion comment — do not leave it sitting in "doing".',
|
|
28
|
+
review: 'REMINDER: This work item is in "review" — the work was handed over. If you are picking it back ' +
|
|
29
|
+
'up (rework, review feedback, a follow-up change), set status to "doing" (update_work_item) BEFORE ' +
|
|
30
|
+
'starting, so the board shows the work is under way again. If you are reviewing it, leave it where it is.',
|
|
28
31
|
};
|
|
29
32
|
// Reminders to prepend to a get_work_item response, most urgent first.
|
|
30
33
|
export function getWorkItemReminders(status, description, approved) {
|
|
@@ -50,13 +50,18 @@ describe('getWorkItemReminders', () => {
|
|
|
50
50
|
expect.stringContaining('set status to "review"'),
|
|
51
51
|
]);
|
|
52
52
|
});
|
|
53
|
+
it('tells agents picking a reviewed item back up to move it to doing', () => {
|
|
54
|
+
const reminders = getWorkItemReminders('review', PLAN);
|
|
55
|
+
expect(reminders).toEqual([expect.stringContaining('set status to "doing"')]);
|
|
56
|
+
expect(reminders[0]).toContain('If you are reviewing it, leave it where it is');
|
|
57
|
+
});
|
|
53
58
|
it('adds the no-plan reminder when the description has no plan', () => {
|
|
54
59
|
const reminders = getWorkItemReminders('new', 'Just a description');
|
|
55
60
|
expect(reminders).toHaveLength(2);
|
|
56
61
|
expect(reminders[1]).toContain('no plan');
|
|
57
62
|
});
|
|
58
63
|
it('stays quiet for statuses with no required action', () => {
|
|
59
|
-
expect(getWorkItemReminders('review', PLAN)).toEqual([]);
|
|
60
64
|
expect(getWorkItemReminders('completed', PLAN)).toEqual([]);
|
|
65
|
+
expect(getWorkItemReminders('ready', PLAN)).toEqual([]);
|
|
61
66
|
});
|
|
62
67
|
});
|