@brxce/mcp-server 1.0.3 ā 1.1.0
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 +11 -4
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/environment.js +6 -7
- package/dist/config/environment.js.map +1 -1
- package/dist/constants/enums.d.ts +11 -0
- package/dist/constants/enums.d.ts.map +1 -0
- package/dist/constants/enums.js +39 -0
- package/dist/constants/enums.js.map +1 -0
- package/dist/http-server.d.ts +5 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +154 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts/worknode-prompts.d.ts.map +1 -1
- package/dist/prompts/worknode-prompts.js +5 -4
- package/dist/prompts/worknode-prompts.js.map +1 -1
- package/dist/prompts/workspace-context-prompt.d.ts.map +1 -1
- package/dist/prompts/workspace-context-prompt.js +2 -1
- package/dist/prompts/workspace-context-prompt.js.map +1 -1
- package/dist/resources/user-resource.d.ts.map +1 -1
- package/dist/resources/user-resource.js +2 -1
- package/dist/resources/user-resource.js.map +1 -1
- package/dist/resources/workspace-members-resource.d.ts.map +1 -1
- package/dist/resources/workspace-members-resource.js +6 -3
- package/dist/resources/workspace-members-resource.js.map +1 -1
- package/dist/resources/workspace-resource.d.ts.map +1 -1
- package/dist/resources/workspace-resource.js +2 -1
- package/dist/resources/workspace-resource.js.map +1 -1
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +212 -0
- package/dist/server.js.map +1 -0
- package/dist/services/api-client.d.ts +36 -2
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +153 -64
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/workspace-context.d.ts +56 -0
- package/dist/services/workspace-context.d.ts.map +1 -0
- package/dist/services/workspace-context.js +104 -0
- package/dist/services/workspace-context.js.map +1 -0
- package/dist/tools/comment-tool.d.ts +4 -0
- package/dist/tools/comment-tool.d.ts.map +1 -0
- package/dist/tools/comment-tool.js +154 -0
- package/dist/tools/comment-tool.js.map +1 -0
- package/dist/tools/criteria-tool.d.ts +4 -0
- package/dist/tools/criteria-tool.d.ts.map +1 -0
- package/dist/tools/criteria-tool.js +208 -0
- package/dist/tools/criteria-tool.js.map +1 -0
- package/dist/tools/invitation-tool.d.ts +19 -0
- package/dist/tools/invitation-tool.d.ts.map +1 -0
- package/dist/tools/invitation-tool.js +501 -0
- package/dist/tools/invitation-tool.js.map +1 -0
- package/dist/tools/meeting-agenda-notes-tool.d.ts +7 -0
- package/dist/tools/meeting-agenda-notes-tool.d.ts.map +1 -0
- package/dist/tools/meeting-agenda-notes-tool.js +326 -0
- package/dist/tools/meeting-agenda-notes-tool.js.map +1 -0
- package/dist/tools/meeting-agenda-tool.d.ts.map +1 -1
- package/dist/tools/meeting-agenda-tool.js +12 -11
- package/dist/tools/meeting-agenda-tool.js.map +1 -1
- package/dist/tools/meeting-create-tool.d.ts.map +1 -1
- package/dist/tools/meeting-create-tool.js +74 -139
- package/dist/tools/meeting-create-tool.js.map +1 -1
- package/dist/tools/meeting-decisions-tool.d.ts.map +1 -1
- package/dist/tools/meeting-decisions-tool.js +12 -11
- package/dist/tools/meeting-decisions-tool.js.map +1 -1
- package/dist/tools/meeting-delete-tool.d.ts +7 -0
- package/dist/tools/meeting-delete-tool.d.ts.map +1 -0
- package/dist/tools/meeting-delete-tool.js +58 -0
- package/dist/tools/meeting-delete-tool.js.map +1 -0
- package/dist/tools/meeting-list-tool.d.ts.map +1 -1
- package/dist/tools/meeting-list-tool.js +14 -100
- package/dist/tools/meeting-list-tool.js.map +1 -1
- package/dist/tools/meeting-notes-tool.d.ts.map +1 -1
- package/dist/tools/meeting-notes-tool.js +12 -11
- package/dist/tools/meeting-notes-tool.js.map +1 -1
- package/dist/tools/meeting-update-tool.d.ts.map +1 -1
- package/dist/tools/meeting-update-tool.js +8 -135
- package/dist/tools/meeting-update-tool.js.map +1 -1
- package/dist/tools/my-work-tool.d.ts +7 -0
- package/dist/tools/my-work-tool.d.ts.map +1 -0
- package/dist/tools/my-work-tool.js +283 -0
- package/dist/tools/my-work-tool.js.map +1 -0
- package/dist/tools/notification-tool.d.ts +23 -0
- package/dist/tools/notification-tool.d.ts.map +1 -0
- package/dist/tools/notification-tool.js +330 -0
- package/dist/tools/notification-tool.js.map +1 -0
- package/dist/tools/tag-category-tool.d.ts.map +1 -1
- package/dist/tools/tag-category-tool.js +15 -6
- package/dist/tools/tag-category-tool.js.map +1 -1
- package/dist/tools/tag-changes-tool.d.ts +4 -0
- package/dist/tools/tag-changes-tool.d.ts.map +1 -0
- package/dist/tools/tag-changes-tool.js +79 -0
- package/dist/tools/tag-changes-tool.js.map +1 -0
- package/dist/tools/tag-search-tool.d.ts.map +1 -1
- package/dist/tools/tag-search-tool.js +13 -6
- package/dist/tools/tag-search-tool.js.map +1 -1
- package/dist/tools/tag-tool.d.ts.map +1 -1
- package/dist/tools/tag-tool.js +26 -15
- package/dist/tools/tag-tool.js.map +1 -1
- package/dist/tools/user-search-tool.d.ts +8 -0
- package/dist/tools/user-search-tool.d.ts.map +1 -0
- package/dist/tools/user-search-tool.js +164 -0
- package/dist/tools/user-search-tool.js.map +1 -0
- package/dist/tools/worknode-archive-tool.d.ts.map +1 -1
- package/dist/tools/worknode-archive-tool.js +15 -52
- package/dist/tools/worknode-archive-tool.js.map +1 -1
- package/dist/tools/worknode-batch-tool.d.ts +4 -0
- package/dist/tools/worknode-batch-tool.d.ts.map +1 -0
- package/dist/tools/worknode-batch-tool.js +117 -0
- package/dist/tools/worknode-batch-tool.js.map +1 -0
- package/dist/tools/worknode-by-member-tool.d.ts +4 -0
- package/dist/tools/worknode-by-member-tool.d.ts.map +1 -0
- package/dist/tools/worknode-by-member-tool.js +171 -0
- package/dist/tools/worknode-by-member-tool.js.map +1 -0
- package/dist/tools/worknode-complete-tool.d.ts +4 -0
- package/dist/tools/worknode-complete-tool.d.ts.map +1 -0
- package/dist/tools/worknode-complete-tool.js +95 -0
- package/dist/tools/worknode-complete-tool.js.map +1 -0
- package/dist/tools/worknode-create-tool.d.ts.map +1 -1
- package/dist/tools/worknode-create-tool.js +40 -126
- package/dist/tools/worknode-create-tool.js.map +1 -1
- package/dist/tools/worknode-delete-tool.d.ts +4 -0
- package/dist/tools/worknode-delete-tool.d.ts.map +1 -0
- package/dist/tools/worknode-delete-tool.js +64 -0
- package/dist/tools/worknode-delete-tool.js.map +1 -0
- package/dist/tools/worknode-history-tool.d.ts +4 -0
- package/dist/tools/worknode-history-tool.d.ts.map +1 -0
- package/dist/tools/worknode-history-tool.js +103 -0
- package/dist/tools/worknode-history-tool.js.map +1 -0
- package/dist/tools/worknode-move-tool.d.ts +4 -0
- package/dist/tools/worknode-move-tool.d.ts.map +1 -0
- package/dist/tools/worknode-move-tool.js +80 -0
- package/dist/tools/worknode-move-tool.js.map +1 -0
- package/dist/tools/worknode-permanent-delete-tool.d.ts +10 -0
- package/dist/tools/worknode-permanent-delete-tool.d.ts.map +1 -0
- package/dist/tools/worknode-permanent-delete-tool.js +131 -0
- package/dist/tools/worknode-permanent-delete-tool.js.map +1 -0
- package/dist/tools/worknode-plan-organize-tool.d.ts.map +1 -1
- package/dist/tools/worknode-plan-organize-tool.js +10 -118
- package/dist/tools/worknode-plan-organize-tool.js.map +1 -1
- package/dist/tools/worknode-read-tool.d.ts.map +1 -1
- package/dist/tools/worknode-read-tool.js +23 -117
- package/dist/tools/worknode-read-tool.js.map +1 -1
- package/dist/tools/worknode-subtree-tool.d.ts.map +1 -1
- package/dist/tools/worknode-subtree-tool.js +153 -99
- package/dist/tools/worknode-subtree-tool.js.map +1 -1
- package/dist/tools/worknode-tag-relations-tool.d.ts +4 -0
- package/dist/tools/worknode-tag-relations-tool.d.ts.map +1 -0
- package/dist/tools/worknode-tag-relations-tool.js +143 -0
- package/dist/tools/worknode-tag-relations-tool.js.map +1 -0
- package/dist/tools/worknode-tag-tool.d.ts.map +1 -1
- package/dist/tools/worknode-tag-tool.js +17 -8
- package/dist/tools/worknode-tag-tool.js.map +1 -1
- package/dist/tools/worknode-update-tool.d.ts.map +1 -1
- package/dist/tools/worknode-update-tool.js +37 -120
- package/dist/tools/worknode-update-tool.js.map +1 -1
- package/dist/tools/workspace-ascii-export-tool.d.ts +4 -0
- package/dist/tools/workspace-ascii-export-tool.d.ts.map +1 -0
- package/dist/tools/workspace-ascii-export-tool.js +99 -0
- package/dist/tools/workspace-ascii-export-tool.js.map +1 -0
- package/dist/tools/workspace-inbox-tool.d.ts.map +1 -1
- package/dist/tools/workspace-inbox-tool.js +8 -77
- package/dist/tools/workspace-inbox-tool.js.map +1 -1
- package/dist/tools/workspace-list-tool.d.ts.map +1 -1
- package/dist/tools/workspace-list-tool.js +5 -50
- package/dist/tools/workspace-list-tool.js.map +1 -1
- package/dist/tools/workspace-member-tool.d.ts +15 -0
- package/dist/tools/workspace-member-tool.d.ts.map +1 -0
- package/dist/tools/workspace-member-tool.js +518 -0
- package/dist/tools/workspace-member-tool.js.map +1 -0
- package/dist/tools/workspace-members-list-tool.d.ts.map +1 -1
- package/dist/tools/workspace-members-list-tool.js +10 -87
- package/dist/tools/workspace-members-list-tool.js.map +1 -1
- package/dist/tools/workspace-statistics-tool.d.ts.map +1 -1
- package/dist/tools/workspace-statistics-tool.js +8 -172
- package/dist/tools/workspace-statistics-tool.js.map +1 -1
- package/dist/tools/workspace-tree-tool.d.ts.map +1 -1
- package/dist/tools/workspace-tree-tool.js +37 -185
- package/dist/tools/workspace-tree-tool.js.map +1 -1
- package/dist/utils/error-utils.d.ts +58 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +118 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +13 -11
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getErrorMessage } from '../utils/error-utils.js';
|
|
3
|
+
import { workspaceContext } from '../services/workspace-context.js';
|
|
4
|
+
const CompleteWorknodeSchema = z.object({
|
|
5
|
+
nodeId: z.string().describe('WorkNode ID (UUID or displayId like #123 or 123)'),
|
|
6
|
+
cascade: z.boolean().optional().default(false).describe('If true, complete all descendants. Default: false (warns about incomplete children)'),
|
|
7
|
+
});
|
|
8
|
+
export function registerWorknodeCompleteTool(server, apiClient) {
|
|
9
|
+
server.registerTool('brxce_complete_worknode', {
|
|
10
|
+
description: `Complete a WorkNode (statusācompleted).
|
|
11
|
+
|
|
12
|
+
Params: nodeId (required), cascade (complete all descendants, default: false)
|
|
13
|
+
Without cascade: warns about incomplete children. With cascade: completes entire subtree.`,
|
|
14
|
+
inputSchema: {
|
|
15
|
+
nodeId: z.string().describe('WorkNode ID (UUID or displayId like #123 or 123)'),
|
|
16
|
+
workspaceId: z.string().uuid().optional().describe('Workspace ID (required when using displayId format)'),
|
|
17
|
+
cascade: z.boolean().optional().describe('Complete all descendants'),
|
|
18
|
+
},
|
|
19
|
+
}, async (args) => {
|
|
20
|
+
const { nodeId, workspaceId: providedWorkspaceId, cascade } = args;
|
|
21
|
+
// Auto-resolve workspaceId from context if using displayId
|
|
22
|
+
const resolvedWorkspaceId = workspaceContext.resolveWorkspaceId(providedWorkspaceId, nodeId);
|
|
23
|
+
const request = {
|
|
24
|
+
nodeId,
|
|
25
|
+
workspaceId: resolvedWorkspaceId || undefined,
|
|
26
|
+
cascade
|
|
27
|
+
};
|
|
28
|
+
try {
|
|
29
|
+
const response = await apiClient.post('/mcp/worknodes/complete', request);
|
|
30
|
+
if (!response.success) {
|
|
31
|
+
return {
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: `Failed to complete WorkNode: ${response.message || 'Unknown error'}`,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
isError: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const { data } = response;
|
|
42
|
+
let resultText = '## WorkNode Completion Result\n\n';
|
|
43
|
+
resultText += `ā
**Completed**: ${data.completedCount} WorkNode(s)\n\n`;
|
|
44
|
+
resultText += `### Node: ${data.node.title}\n`;
|
|
45
|
+
resultText += `- **ID**: ${data.node.id}\n`;
|
|
46
|
+
resultText += `- **Status**: ${data.node.status}\n`;
|
|
47
|
+
if (data.node.completedAt) {
|
|
48
|
+
resultText += `- **Completed At**: ${data.node.completedAt}\n`;
|
|
49
|
+
}
|
|
50
|
+
resultText += '\n';
|
|
51
|
+
if (data.completedCount > 1) {
|
|
52
|
+
resultText += `### Cascade Details\n`;
|
|
53
|
+
resultText += `- Completed ${data.completedCount} nodes in total\n`;
|
|
54
|
+
resultText += `- Completed IDs: ${data.completedNodeIds.length} nodes\n\n`;
|
|
55
|
+
}
|
|
56
|
+
if (data.warnings && data.warnings.length > 0) {
|
|
57
|
+
resultText += `### ā ļø Warnings\n`;
|
|
58
|
+
data.warnings.forEach((warning) => {
|
|
59
|
+
resultText += `- ${warning}\n`;
|
|
60
|
+
});
|
|
61
|
+
resultText += '\n';
|
|
62
|
+
}
|
|
63
|
+
if (data.incompleteChildren && data.incompleteChildren.length > 0) {
|
|
64
|
+
resultText += `### Incomplete Children\n`;
|
|
65
|
+
resultText += `The following children are still incomplete:\n\n`;
|
|
66
|
+
data.incompleteChildren.forEach((child) => {
|
|
67
|
+
resultText += `- **${child.title}** (${child.status})\n`;
|
|
68
|
+
resultText += ` - ID: ${child.id}\n`;
|
|
69
|
+
});
|
|
70
|
+
resultText += '\n';
|
|
71
|
+
resultText += `š” **Tip**: Use \`cascade: true\` to complete all children automatically.\n`;
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: 'text',
|
|
77
|
+
text: resultText,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return {
|
|
84
|
+
content: [
|
|
85
|
+
{
|
|
86
|
+
type: 'text',
|
|
87
|
+
text: `Error completing WorkNode: ${getErrorMessage(error)}`,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
isError: true,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=worknode-complete-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worknode-complete-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-complete-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC/E,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CACrD,qFAAqF,CACtF;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,SAAoB;IAClF,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,WAAW,EAAE;;;0FAGuE;QACpF,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;YAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACzG,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;SACrE;KACF,EACD,KAAK,EAAE,IAAyB,EAAE,EAAE;QAClC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,GAAG,IAI7D,CAAC;QAEF,2DAA2D;QAC3D,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG;YACd,MAAM;YACN,WAAW,EAAE,mBAAmB,IAAI,SAAS;YAC7C,OAAO;SACR,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAmBlC,yBAAyB,EAAE,OAAO,CAAC,CAAC;YAEvC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,gCAAgC,QAAQ,CAAC,OAAO,IAAI,eAAe,EAAE;yBAC5E;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YAE1B,IAAI,UAAU,GAAG,mCAAmC,CAAC;YAErD,UAAU,IAAI,oBAAoB,IAAI,CAAC,cAAc,kBAAkB,CAAC;YAExE,UAAU,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;YAC/C,UAAU,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;YAC5C,UAAU,IAAI,iBAAiB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;YACpD,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC1B,UAAU,IAAI,uBAAuB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC;YACjE,CAAC;YACD,UAAU,IAAI,IAAI,CAAC;YAEnB,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;gBAC5B,UAAU,IAAI,uBAAuB,CAAC;gBACtC,UAAU,IAAI,eAAe,IAAI,CAAC,cAAc,mBAAmB,CAAC;gBACpE,UAAU,IAAI,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,MAAM,YAAY,CAAC;YAC7E,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,UAAU,IAAI,mBAAmB,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAChC,UAAU,IAAI,KAAK,OAAO,IAAI,CAAC;gBACjC,CAAC,CAAC,CAAC;gBACH,UAAU,IAAI,IAAI,CAAC;YACrB,CAAC;YAED,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,UAAU,IAAI,2BAA2B,CAAC;gBAC1C,UAAU,IAAI,kDAAkD,CAAC;gBACjE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACxC,UAAU,IAAI,OAAO,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;oBACzD,UAAU,IAAI,WAAW,KAAK,CAAC,EAAE,IAAI,CAAC;gBACxC,CAAC,CAAC,CAAC;gBACH,UAAU,IAAI,IAAI,CAAC;gBACnB,UAAU,IAAI,6EAA6E,CAAC;YAC9F,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,8BAA8B,eAAe,CAAC,KAAK,CAAC,EAAE;qBAC7D;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worknode-create-tool.d.ts","sourceRoot":"","sources":["../../src/tools/worknode-create-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"worknode-create-tool.d.ts","sourceRoot":"","sources":["../../src/tools/worknode-create-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAoFtD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA6KjF"}
|
|
@@ -1,32 +1,46 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
const
|
|
2
|
+
import { getErrorMessage } from '../utils/error-utils.js';
|
|
3
|
+
const WorknodeTypeSchema = z.enum(['goal', 'project', 'subproject', 'task', 'subtask', 'note']);
|
|
4
|
+
const WorkNodeStatusSchema = z.enum(['backlog', 'not_started', 'in_progress', 'completed', 'pause', 'archived', 'static']);
|
|
4
5
|
const WorkNodePrioritySchema = z.enum(['critical', 'urgent', 'high', 'medium', 'low']);
|
|
6
|
+
// ISO 8601 date-time format validation
|
|
7
|
+
// Valid: "2025-01-31T23:59:59Z", "2025-01-31T23:59:59.999Z", "2025-01-31T23:59:59+09:00"
|
|
8
|
+
// Invalid: "2025-01-31" (date-only), "January 31, 2025"
|
|
9
|
+
const ISO_DATE_TIME_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:\d{2})$/;
|
|
10
|
+
const isoDateTimeSchema = z
|
|
11
|
+
.string()
|
|
12
|
+
.refine((val) => ISO_DATE_TIME_REGEX.test(val), { message: 'Must be ISO 8601 date-time format (e.g., 2025-01-31T23:59:59Z)' })
|
|
13
|
+
.optional();
|
|
5
14
|
const CreateWorknodeSchema = z.object({
|
|
6
15
|
title: z.string().min(1).describe('WorkNode title (required, min 1 char). Example: "Backend API Development"'),
|
|
7
16
|
description: z.string().optional().describe('Detailed description. Example: "Implement REST API endpoints for user authentication"'),
|
|
8
|
-
nodeType: WorknodeTypeSchema.describe('Node type (required): goal | project | subproject | task | subtask. ' +
|
|
9
|
-
'Hierarchy: goal > project > subproject > task > subtask'
|
|
17
|
+
nodeType: WorknodeTypeSchema.describe('Node type (required): goal | project | subproject | task | subtask | note. ' +
|
|
18
|
+
'Hierarchy: goal > project > subproject > task > subtask. ' +
|
|
19
|
+
'NOTE type: For information storage - allowed statuses: backlog | static | archived (default: static). ' +
|
|
20
|
+
'Priority/assignee ignored. Notes can only contain other notes as children.'),
|
|
10
21
|
parentNodeId: z
|
|
11
22
|
.string()
|
|
12
|
-
.uuid()
|
|
13
23
|
.optional()
|
|
14
|
-
.describe('Parent WorkNode UUID
|
|
24
|
+
.describe('Parent WorkNode ID (UUID or displayId like #123). Required for task/subtask. ' +
|
|
15
25
|
'Find using brxce_workspace_overview. Never guess IDs. ' +
|
|
16
|
-
'Example: "a3f5e8d7-1234-5678-9abc-def012345678"'),
|
|
26
|
+
'Example: "a3f5e8d7-1234-5678-9abc-def012345678" or "#123"'),
|
|
17
27
|
workspaceId: z
|
|
18
|
-
.
|
|
19
|
-
.uuid()
|
|
28
|
+
.coerce.number()
|
|
20
29
|
.optional()
|
|
21
|
-
.describe('Workspace
|
|
30
|
+
.describe('Workspace ID (conditional). Auto-inherited from parent. ' +
|
|
22
31
|
'Required only for root-level items. Get from user://me resource. ' +
|
|
23
|
-
'Example:
|
|
24
|
-
status: WorkNodeStatusSchema.optional().describe('Initial status (default: backlog). Options: ' +
|
|
25
|
-
'backlog (inbox
|
|
26
|
-
'
|
|
32
|
+
'Example: 138'),
|
|
33
|
+
status: WorkNodeStatusSchema.optional().describe('Initial status (default: backlog, note default: static). Options: ' +
|
|
34
|
+
'backlog (inbox), not_started, in_progress, completed, pause, archived, static. ' +
|
|
35
|
+
'NOTE type: Only backlog | static | archived allowed. ' +
|
|
36
|
+
'"static" status is ONLY for note type (cannot be assigned to other types).'),
|
|
27
37
|
priority: WorkNodePrioritySchema.optional().describe('Priority level (default: medium). Options: low | medium | high | urgent | critical'),
|
|
28
|
-
startDate:
|
|
29
|
-
|
|
38
|
+
startDate: isoDateTimeSchema.describe('Start date in ISO 8601 date-time format. ' +
|
|
39
|
+
'MUST include time and timezone. Example: "2025-01-20T09:00:00Z" (UTC). ' +
|
|
40
|
+
'Invalid: "2025-01-20" (date-only format will be rejected)'),
|
|
41
|
+
dueDate: isoDateTimeSchema.describe('Due date in ISO 8601 date-time format. ' +
|
|
42
|
+
'MUST include time and timezone. Example: "2025-01-31T23:59:59Z" (UTC). ' +
|
|
43
|
+
'Invalid: "2025-01-31" (date-only format will be rejected)'),
|
|
30
44
|
tags: z.array(z.string()).optional().describe('Array of tag names. Example: ["backend", "urgent", "api"]'),
|
|
31
45
|
assignee: z.array(z.string()).optional().describe('Array of user UUIDs. Example: ["user-uuid-1", "user-uuid-2"]'),
|
|
32
46
|
});
|
|
@@ -39,117 +53,15 @@ const BatchCreateRequestSchema = z.object({
|
|
|
39
53
|
});
|
|
40
54
|
export function registerWorknodeCreateTool(server, apiClient) {
|
|
41
55
|
server.registerTool('brxce_create_worknodes', {
|
|
42
|
-
description: `Create WorkNodes
|
|
43
|
-
|
|
44
|
-
## š Available Fields
|
|
45
|
-
|
|
46
|
-
### Required Fields
|
|
47
|
-
- **title** (string): WorkNode title (min 1 char)
|
|
48
|
-
- **nodeType** (enum): goal | project | subproject | task | subtask
|
|
49
|
-
|
|
50
|
-
### Conditional Fields (one required)
|
|
51
|
-
- **parentNodeId** (uuid): Parent node ID for structured work (task/subtask require this)
|
|
52
|
-
- **workspaceId** (uuid): Workspace ID for root items (auto-inherited from parent)
|
|
53
|
-
|
|
54
|
-
### Optional Fields
|
|
55
|
-
- **description** (string): Detailed description
|
|
56
|
-
- **status** (enum): backlog (default) | not_started | in_progress | in_review | completed | cancelled
|
|
57
|
-
- **priority** (enum): low | medium (default) | high | urgent | critical
|
|
58
|
-
- **startDate** (ISO 8601): Start date, e.g., "2025-01-20T09:00:00Z"
|
|
59
|
-
- **dueDate** (ISO 8601): Due date, e.g., "2025-01-31T23:59:59Z"
|
|
60
|
-
- **tags** (string[]): Tag names, e.g., ["backend", "urgent"]
|
|
61
|
-
- **assignee** (string[]): User IDs, e.g., ["user-uuid-1", "user-uuid-2"]
|
|
62
|
-
|
|
63
|
-
### Special Fields
|
|
64
|
-
- **preview** (boolean): Always use \`true\` first to validate before creating
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## ā” Quick Start (3-Step Workflow)
|
|
69
|
-
|
|
70
|
-
**Step 1: Find parent** (if creating under existing structure)
|
|
71
|
-
\`\`\`typescript
|
|
72
|
-
brxce_workspace_overview({ workspaceId: 138 })
|
|
73
|
-
\`\`\`
|
|
74
|
-
|
|
75
|
-
**Step 2: Preview**
|
|
76
|
-
\`\`\`json
|
|
77
|
-
{
|
|
78
|
-
"worknodes": [{
|
|
79
|
-
"title": "Backend API Development",
|
|
80
|
-
"nodeType": "task",
|
|
81
|
-
"parentNodeId": "parent-uuid-here"
|
|
82
|
-
}],
|
|
83
|
-
"preview": true
|
|
84
|
-
}
|
|
85
|
-
\`\`\`
|
|
86
|
-
|
|
87
|
-
**Step 3: Create** (after confirming preview)
|
|
88
|
-
\`\`\`json
|
|
89
|
-
{ "worknodes": [...], "preview": false }
|
|
90
|
-
\`\`\`
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## ā Common Mistakes
|
|
95
|
-
|
|
96
|
-
1. **Guessing IDs**: ā Never guess \`parentNodeId\` or \`workspaceId\`
|
|
97
|
-
ā ā
Always use \`brxce_workspace_overview\` or \`brxce_read_worknodes\` to find IDs
|
|
98
|
-
|
|
99
|
-
2. **Skipping preview**: ā Creating directly with \`preview: false\`
|
|
100
|
-
ā ā
Always preview first with \`preview: true\`
|
|
101
|
-
|
|
102
|
-
3. **Missing nodeType**: ā \`{ title: "Task" }\`
|
|
103
|
-
ā ā
\`{ title: "Task", nodeType: "task" }\`
|
|
104
|
-
|
|
105
|
-
4. **Invalid hierarchy**: ā Creating subtask without parent
|
|
106
|
-
ā ā
Check hierarchy rules below
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## šļø Hierarchy Rules
|
|
111
|
-
|
|
112
|
-
\`\`\`
|
|
113
|
-
Goal (root-level, no parent needed)
|
|
114
|
-
āā Project (can be root-level or under goal)
|
|
115
|
-
āā SubProject (requires project/subproject parent)
|
|
116
|
-
āā Task (requires project/subproject parent)
|
|
117
|
-
āā SubTask (requires task parent)
|
|
118
|
-
\`\`\`
|
|
119
|
-
|
|
120
|
-
**Rules:**
|
|
121
|
-
- Goal/Project: \`parentNodeId\` optional (can be root-level)
|
|
122
|
-
- SubProject/Task/SubTask: \`parentNodeId\` required
|
|
123
|
-
- Workspace: Auto-inherited from parent, or specify for root items
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## š Advanced Topics
|
|
128
|
-
|
|
129
|
-
**Finding Parents**: Always search workspace first using \`brxce_workspace_overview\`
|
|
130
|
-
- NEVER guess or hardcode parent IDs
|
|
131
|
-
- Present suggestions to user before creating
|
|
132
|
-
- Only create in inbox if NO suitable parent exists
|
|
133
|
-
|
|
134
|
-
**Two Creation Modes**:
|
|
135
|
-
- Inbox Mode: Quick capture with \`status: "backlog"\`, no parent
|
|
136
|
-
- Direct Mode: Structured work with parent, ready to work
|
|
137
|
-
|
|
138
|
-
**Batch Creation**: Create multiple nodes at once in \`worknodes\` array
|
|
139
|
-
|
|
140
|
-
**Validation**: Preview shows warnings, errors, inferred values, and hierarchy validation
|
|
141
|
-
|
|
142
|
-
**Timezone**: Provide dates in ISO 8601 with timezone (e.g., "2025-01-20T09:00:00Z")
|
|
143
|
-
|
|
144
|
-
---
|
|
56
|
+
description: `Create WorkNodes. Use preview:true first.
|
|
145
57
|
|
|
146
|
-
|
|
58
|
+
Required: title, nodeType (goal|project|subproject|task|subtask|note)
|
|
59
|
+
Conditional: parentNodeId (for task/subtask), workspaceId (for root items)
|
|
60
|
+
Optional: status, priority, startDate, dueDate, tags, assignee
|
|
147
61
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- **User timezone**: Convert local times to UTC in ISO 8601 format (e.g., Korea UTC+9)
|
|
152
|
-
- **Proactive search**: Search for appropriate parent even when user doesn't mention one`,
|
|
62
|
+
Hierarchy: goal > project > subproject > task > subtask
|
|
63
|
+
Note: 'note' type allows backlog|static|archived (default: static), ignores priority/assignee
|
|
64
|
+
Dates: ISO 8601 with timezone (e.g., 2025-01-20T09:00:00Z)`,
|
|
153
65
|
inputSchema: {
|
|
154
66
|
worknodes: z.array(CreateWorknodeSchema).min(1).describe('Array of WorkNodes to create'),
|
|
155
67
|
preview: z.boolean().optional().describe('If true, validate but do not create (dry run for user confirmation)'),
|
|
@@ -166,6 +78,7 @@ Goal (root-level, no parent needed)
|
|
|
166
78
|
text: `Failed to create WorkNodes: ${response.message || 'Unknown error'}`,
|
|
167
79
|
},
|
|
168
80
|
],
|
|
81
|
+
isError: true,
|
|
169
82
|
};
|
|
170
83
|
}
|
|
171
84
|
const { data } = response;
|
|
@@ -260,9 +173,10 @@ Goal (root-level, no parent needed)
|
|
|
260
173
|
content: [
|
|
261
174
|
{
|
|
262
175
|
type: 'text',
|
|
263
|
-
text: `Error creating WorkNodes: ${error
|
|
176
|
+
text: `Error creating WorkNodes: ${getErrorMessage(error)}`,
|
|
264
177
|
},
|
|
265
178
|
],
|
|
179
|
+
isError: true,
|
|
266
180
|
};
|
|
267
181
|
}
|
|
268
182
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worknode-create-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-create-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"worknode-create-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-create-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../services/api-client.js';
|
|
3
|
+
export declare function registerWorknodeDeleteTool(server: McpServer, apiClient: ApiClient): void;
|
|
4
|
+
//# sourceMappingURL=worknode-delete-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worknode-delete-tool.d.ts","sourceRoot":"","sources":["../../src/tools/worknode-delete-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAItD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA4EjF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getErrorMessage } from '../utils/error-utils.js';
|
|
3
|
+
import { workspaceContext } from '../services/workspace-context.js';
|
|
4
|
+
export function registerWorknodeDeleteTool(server, apiClient) {
|
|
5
|
+
server.registerTool('brxce_delete_worknode', {
|
|
6
|
+
description: `[DEPRECATED] Soft delete WorkNode (sets deletedAt, recoverable by admin).
|
|
7
|
+
|
|
8
|
+
ā ļø This tool is deprecated. Use brxce_batch_actions with action: 'delete' instead.
|
|
9
|
+
|
|
10
|
+
Params: nodeId (required)`,
|
|
11
|
+
inputSchema: {
|
|
12
|
+
nodeId: z.string().describe('WorkNode ID (UUID or displayId like #123 or 123)'),
|
|
13
|
+
workspaceId: z.string().uuid().optional().describe('Workspace ID (required when using displayId format)'),
|
|
14
|
+
},
|
|
15
|
+
}, async (args) => {
|
|
16
|
+
const { nodeId, workspaceId: providedWorkspaceId } = args;
|
|
17
|
+
// Auto-resolve workspaceId from context if using displayId
|
|
18
|
+
const resolvedWorkspaceId = workspaceContext.resolveWorkspaceId(providedWorkspaceId, nodeId);
|
|
19
|
+
try {
|
|
20
|
+
const url = resolvedWorkspaceId
|
|
21
|
+
? `/mcp/worknodes/${encodeURIComponent(nodeId)}?workspaceId=${encodeURIComponent(resolvedWorkspaceId)}`
|
|
22
|
+
: `/mcp/worknodes/${encodeURIComponent(nodeId)}`;
|
|
23
|
+
const response = await apiClient.delete(url);
|
|
24
|
+
if (!response.success) {
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: 'text',
|
|
29
|
+
text: `Failed to delete WorkNode: ${response.message || 'Unknown error'}`,
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
isError: true,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const { data } = response;
|
|
36
|
+
let resultText = '## WorkNode Deletion Result\n\n';
|
|
37
|
+
resultText += `ā ļø **Deprecated**: This tool is deprecated. Use \`brxce_batch_actions\` with \`action: 'delete'\` instead.\n\n`;
|
|
38
|
+
resultText += `ā
**Successfully deleted WorkNode**\n\n`;
|
|
39
|
+
resultText += `- **Node ID**: ${data.nodeId}\n`;
|
|
40
|
+
resultText += `- **Deleted At**: ${data.deletedAt}\n\n`;
|
|
41
|
+
resultText += `š” **Note**: This is a soft delete. The node can potentially be restored by an admin.\n`;
|
|
42
|
+
return {
|
|
43
|
+
content: [
|
|
44
|
+
{
|
|
45
|
+
type: 'text',
|
|
46
|
+
text: resultText,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: 'text',
|
|
56
|
+
text: `Error deleting WorkNode: ${getErrorMessage(error)}`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=worknode-delete-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worknode-delete-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-delete-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,SAAoB;IAChF,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,WAAW,EAAE;;;;0BAIO;QACpB,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;YAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;SAC1G;KACF,EACD,KAAK,EAAE,IAAyB,EAAE,EAAE;QAClC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,IAAgD,CAAC;QAEtG,2DAA2D;QAC3D,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAE7F,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,mBAAmB;gBAC7B,CAAC,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,gBAAgB,kBAAkB,CAAC,mBAAmB,CAAC,EAAE;gBACvG,CAAC,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;YAEnD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAOpC,GAAG,CAAC,CAAC;YAER,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,8BAA8B,QAAQ,CAAC,OAAO,IAAI,eAAe,EAAE;yBAC1E;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;YAE1B,IAAI,UAAU,GAAG,iCAAiC,CAAC;YACnD,UAAU,IAAI,gHAAgH,CAAC;YAC/H,UAAU,IAAI,yCAAyC,CAAC;YACxD,UAAU,IAAI,kBAAkB,IAAI,CAAC,MAAM,IAAI,CAAC;YAChD,UAAU,IAAI,qBAAqB,IAAI,CAAC,SAAS,MAAM,CAAC;YACxD,UAAU,IAAI,yFAAyF,CAAC;YAExG,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,eAAe,CAAC,KAAK,CAAC,EAAE;qBAC3D;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../services/api-client.js';
|
|
3
|
+
export declare function registerWorknodeHistoryTool(server: McpServer, apiClient: ApiClient): void;
|
|
4
|
+
//# sourceMappingURL=worknode-history-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worknode-history-tool.d.ts","sourceRoot":"","sources":["../../src/tools/worknode-history-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QA2IlF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getErrorMessage } from '../utils/error-utils.js';
|
|
3
|
+
export function registerWorknodeHistoryTool(server, apiClient) {
|
|
4
|
+
/**
|
|
5
|
+
* Get WorkNode change history
|
|
6
|
+
*/
|
|
7
|
+
server.registerTool('brxce_worknode_history', {
|
|
8
|
+
description: `Get WorkNode change history (audit trail).
|
|
9
|
+
|
|
10
|
+
Params: nodeId (required), limit (default: 20, max: 100)
|
|
11
|
+
Returns: history entries with commandType, changes, actor info. Dates in UTC.`,
|
|
12
|
+
inputSchema: {
|
|
13
|
+
nodeId: z.string().describe('WorkNode ID (UUID or displayId like #123 or 123)'),
|
|
14
|
+
workspaceId: z.string().uuid().optional().describe('Workspace ID (required when using displayId format)'),
|
|
15
|
+
limit: z.number().optional().default(20).describe('Maximum results (default: 20, max: 100)')
|
|
16
|
+
}
|
|
17
|
+
}, async (args) => {
|
|
18
|
+
try {
|
|
19
|
+
const { nodeId, workspaceId, limit = 20 } = args;
|
|
20
|
+
const response = await apiClient.get(`/mcp/worknodes/${encodeURIComponent(nodeId)}/history?limit=${limit}${workspaceId ? `&workspaceId=${encodeURIComponent(workspaceId)}` : ''}`);
|
|
21
|
+
if (!response.success) {
|
|
22
|
+
return {
|
|
23
|
+
content: [
|
|
24
|
+
{
|
|
25
|
+
type: 'text',
|
|
26
|
+
text: `Failed to fetch WorkNode history: ${response.message || 'Unknown error'}`,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const { history, total, hasMore } = response.data;
|
|
33
|
+
let resultText = `## WorkNode History\n\n`;
|
|
34
|
+
resultText += `**Total Entries:** ${total}\n`;
|
|
35
|
+
resultText += `**Showing:** ${history.length} ${hasMore ? '(more available)' : ''}\n\n`;
|
|
36
|
+
if (history.length === 0) {
|
|
37
|
+
resultText += `No history entries found for this WorkNode.\n\n`;
|
|
38
|
+
resultText += `š” **Note**: History may be empty for newly created WorkNodes or if history tracking was not enabled.\n`;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
resultText += `---\n\n`;
|
|
42
|
+
history.forEach((entry, index) => {
|
|
43
|
+
const commandTypeEmoji = {
|
|
44
|
+
create: 'š',
|
|
45
|
+
update: 'āļø',
|
|
46
|
+
delete: 'šļø',
|
|
47
|
+
complete: 'ā
',
|
|
48
|
+
move: 'š¦',
|
|
49
|
+
archive: 'šļø',
|
|
50
|
+
unarchive: 'š¤'
|
|
51
|
+
};
|
|
52
|
+
const emoji = commandTypeEmoji[entry.commandType] || 'š';
|
|
53
|
+
resultText += `### ${emoji} ${entry.commandType.toUpperCase()}\n`;
|
|
54
|
+
resultText += `**When:** ${entry.createdAt}\n`;
|
|
55
|
+
resultText += `**Who:** ${entry.actor.name || entry.actor.email || entry.actor.id}\n`;
|
|
56
|
+
resultText += `**Source:** ${entry.source}\n\n`;
|
|
57
|
+
if (Array.isArray(entry.changes) && entry.changes.length > 0) {
|
|
58
|
+
resultText += `**Changes:**\n`;
|
|
59
|
+
entry.changes.forEach((change) => {
|
|
60
|
+
if (change.field) {
|
|
61
|
+
resultText += `- **${change.field}**: `;
|
|
62
|
+
if (change.oldValue !== undefined) {
|
|
63
|
+
resultText += `\`${JSON.stringify(change.oldValue)}\` ā `;
|
|
64
|
+
}
|
|
65
|
+
resultText += `\`${JSON.stringify(change.newValue)}\`\n`;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
resultText += `\n`;
|
|
69
|
+
}
|
|
70
|
+
if (entry.metadata) {
|
|
71
|
+
resultText += `**Metadata:** ${JSON.stringify(entry.metadata, null, 2)}\n\n`;
|
|
72
|
+
}
|
|
73
|
+
if (index < history.length - 1) {
|
|
74
|
+
resultText += `---\n\n`;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
if (hasMore) {
|
|
78
|
+
resultText += `\nš” **Tip**: Increase \`limit\` parameter to see more history entries (max: 100)\n`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
content: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: resultText,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: `Error fetching WorkNode history: ${getErrorMessage(error)}`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
isError: true,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=worknode-history-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worknode-history-tool.js","sourceRoot":"","sources":["../../src/tools/worknode-history-tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,SAAoB;IACjF;;OAEG;IACH,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,WAAW,EAAE;;;8EAG2D;QAExE,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;YAC/E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YACzG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAC7F;KACF,EACD,KAAK,EAAE,IAAyB,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,IAI3C,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAqBjC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,kBAAkB,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEjJ,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,qCAAqC,QAAQ,CAAC,OAAO,IAAI,eAAe,EAAE;yBACjF;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;YAElD,IAAI,UAAU,GAAG,yBAAyB,CAAC;YAC3C,UAAU,IAAI,sBAAsB,KAAK,IAAI,CAAC;YAC9C,UAAU,IAAI,gBAAgB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;YAExF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,UAAU,IAAI,iDAAiD,CAAC;gBAChE,UAAU,IAAI,yGAAyG,CAAC;YAC1H,CAAC;iBAAM,CAAC;gBACN,UAAU,IAAI,SAAS,CAAC;gBAExB,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC/B,MAAM,gBAAgB,GAA2B;wBAC/C,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,KAAK;wBACb,QAAQ,EAAE,GAAG;wBACb,IAAI,EAAE,IAAI;wBACV,OAAO,EAAE,KAAK;wBACd,SAAS,EAAE,IAAI;qBAChB,CAAC;oBACF,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;oBAE1D,UAAU,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC;oBAClE,UAAU,IAAI,aAAa,KAAK,CAAC,SAAS,IAAI,CAAC;oBAC/C,UAAU,IAAI,YAAY,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;oBACtF,UAAU,IAAI,eAAe,KAAK,CAAC,MAAM,MAAM,CAAC;oBAEhD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7D,UAAU,IAAI,gBAAgB,CAAC;wBAC/B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,EAAE;4BACpC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gCACjB,UAAU,IAAI,OAAO,MAAM,CAAC,KAAK,MAAM,CAAC;gCACxC,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oCAClC,UAAU,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gCAC5D,CAAC;gCACD,UAAU,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;4BAC3D,CAAC;wBACH,CAAC,CAAC,CAAC;wBACH,UAAU,IAAI,IAAI,CAAC;oBACrB,CAAC;oBAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;wBACnB,UAAU,IAAI,iBAAiB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;oBAC/E,CAAC;oBAED,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,UAAU,IAAI,SAAS,CAAC;oBAC1B,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,OAAO,EAAE,CAAC;oBACZ,UAAU,IAAI,qFAAqF,CAAC;gBACtG,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oCAAoC,eAAe,CAAC,KAAK,CAAC,EAAE;qBACnE;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../services/api-client.js';
|
|
3
|
+
export declare function registerWorknodeMoveTool(server: McpServer, apiClient: ApiClient): void;
|
|
4
|
+
//# sourceMappingURL=worknode-move-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worknode-move-tool.d.ts","sourceRoot":"","sources":["../../src/tools/worknode-move-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAatD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAyF/E"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getErrorMessage } from '../utils/error-utils.js';
|
|
3
|
+
const MoveWorknodeSchema = z.object({
|
|
4
|
+
nodeId: z.string().describe('WorkNode ID (UUID or displayId like #123 or 123)'),
|
|
5
|
+
newParentId: z
|
|
6
|
+
.string()
|
|
7
|
+
.nullable()
|
|
8
|
+
.optional()
|
|
9
|
+
.describe('New parent ID (UUID or displayId, null for root level)'),
|
|
10
|
+
position: z.number().optional().describe('Position among siblings (optional)'),
|
|
11
|
+
});
|
|
12
|
+
export function registerWorknodeMoveTool(server, apiClient) {
|
|
13
|
+
server.registerTool('brxce_move_worknode', {
|
|
14
|
+
description: `Move WorkNode to different parent or root level.
|
|
15
|
+
|
|
16
|
+
Params: nodeId (required), newParentId (null for root), position (sibling order)
|
|
17
|
+
Updates nodePath/nodeLevel for node and all descendants.`,
|
|
18
|
+
inputSchema: {
|
|
19
|
+
nodeId: z.string().describe('WorkNode ID (UUID or displayId like #123 or 123)'),
|
|
20
|
+
workspaceId: z.string().uuid().optional().describe('Workspace ID (required when using displayId format)'),
|
|
21
|
+
newParentId: z
|
|
22
|
+
.string()
|
|
23
|
+
.nullable()
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('New parent ID (UUID or displayId, null for root level)'),
|
|
26
|
+
position: z.number().optional().describe('Position among siblings'),
|
|
27
|
+
},
|
|
28
|
+
}, async (args) => {
|
|
29
|
+
const request = args;
|
|
30
|
+
try {
|
|
31
|
+
const response = await apiClient.post('/mcp/worknodes/move', request);
|
|
32
|
+
if (!response.success) {
|
|
33
|
+
return {
|
|
34
|
+
content: [
|
|
35
|
+
{
|
|
36
|
+
type: 'text',
|
|
37
|
+
text: `Failed to move WorkNode: ${response.message || 'Unknown error'}`,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
isError: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const { node } = response.data;
|
|
44
|
+
let resultText = '## WorkNode Move Result\n\n';
|
|
45
|
+
resultText += `ā
**Successfully moved**: ${node.title}\n\n`;
|
|
46
|
+
resultText += `### Node Details\n`;
|
|
47
|
+
resultText += `- **ID**: ${node.id}\n`;
|
|
48
|
+
resultText += `- **Type**: ${node.nodeType}\n`;
|
|
49
|
+
resultText += `- **New Parent**: ${node.parentNodeId || '(Root level)'}\n`;
|
|
50
|
+
resultText += `- **Node Path**: ${node.nodePath}\n`;
|
|
51
|
+
resultText += `- **Node Level**: ${node.nodeLevel}\n\n`;
|
|
52
|
+
if (node.parentNodeId) {
|
|
53
|
+
resultText += `š” **Note**: Node is now under parent ${node.parentNodeId}\n`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
resultText += `š” **Note**: Node is now at root level\n`;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
content: [
|
|
60
|
+
{
|
|
61
|
+
type: 'text',
|
|
62
|
+
text: resultText,
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{
|
|
71
|
+
type: 'text',
|
|
72
|
+
text: `Error moving WorkNode: ${getErrorMessage(error)}`,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=worknode-move-tool.js.map
|