motionmcp 1.0.2 → 2.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.
Files changed (159) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +241 -450
  3. package/dist/handlers/CommentHandler.d.ts +9 -0
  4. package/dist/handlers/CommentHandler.d.ts.map +1 -0
  5. package/dist/handlers/CommentHandler.js +66 -0
  6. package/dist/handlers/CommentHandler.js.map +1 -0
  7. package/dist/handlers/CustomFieldHandler.d.ts +14 -0
  8. package/dist/handlers/CustomFieldHandler.d.ts.map +1 -0
  9. package/dist/handlers/CustomFieldHandler.js +95 -0
  10. package/dist/handlers/CustomFieldHandler.js.map +1 -0
  11. package/dist/handlers/HandlerFactory.d.ts +15 -0
  12. package/dist/handlers/HandlerFactory.d.ts.map +1 -0
  13. package/dist/handlers/HandlerFactory.js +58 -0
  14. package/dist/handlers/HandlerFactory.js.map +1 -0
  15. package/dist/handlers/ProjectHandler.d.ts +10 -0
  16. package/dist/handlers/ProjectHandler.d.ts.map +1 -0
  17. package/dist/handlers/ProjectHandler.js +63 -0
  18. package/dist/handlers/ProjectHandler.js.map +1 -0
  19. package/dist/handlers/RecurringTaskHandler.d.ts +10 -0
  20. package/dist/handlers/RecurringTaskHandler.d.ts.map +1 -0
  21. package/dist/handlers/RecurringTaskHandler.js +68 -0
  22. package/dist/handlers/RecurringTaskHandler.js.map +1 -0
  23. package/dist/handlers/ScheduleHandler.d.ts +8 -0
  24. package/dist/handlers/ScheduleHandler.d.ts.map +1 -0
  25. package/dist/handlers/ScheduleHandler.js +43 -0
  26. package/dist/handlers/ScheduleHandler.js.map +1 -0
  27. package/dist/handlers/SearchHandler.d.ts +10 -0
  28. package/dist/handlers/SearchHandler.d.ts.map +1 -0
  29. package/dist/handlers/SearchHandler.js +116 -0
  30. package/dist/handlers/SearchHandler.js.map +1 -0
  31. package/dist/handlers/StatusHandler.d.ts +8 -0
  32. package/dist/handlers/StatusHandler.d.ts.map +1 -0
  33. package/dist/handlers/StatusHandler.js +22 -0
  34. package/dist/handlers/StatusHandler.js.map +1 -0
  35. package/dist/handlers/TaskHandler.d.ts +22 -0
  36. package/dist/handlers/TaskHandler.d.ts.map +1 -0
  37. package/dist/handlers/TaskHandler.js +324 -0
  38. package/dist/handlers/TaskHandler.js.map +1 -0
  39. package/dist/handlers/UserHandler.d.ts +9 -0
  40. package/dist/handlers/UserHandler.d.ts.map +1 -0
  41. package/dist/handlers/UserHandler.js +36 -0
  42. package/dist/handlers/UserHandler.js.map +1 -0
  43. package/dist/handlers/WorkspaceHandler.d.ts +10 -0
  44. package/dist/handlers/WorkspaceHandler.d.ts.map +1 -0
  45. package/dist/handlers/WorkspaceHandler.js +49 -0
  46. package/dist/handlers/WorkspaceHandler.js.map +1 -0
  47. package/dist/handlers/base/BaseHandler.d.ts +16 -0
  48. package/dist/handlers/base/BaseHandler.d.ts.map +1 -0
  49. package/dist/handlers/base/BaseHandler.js +31 -0
  50. package/dist/handlers/base/BaseHandler.js.map +1 -0
  51. package/dist/handlers/base/HandlerInterface.d.ts +18 -0
  52. package/dist/handlers/base/HandlerInterface.d.ts.map +1 -0
  53. package/dist/handlers/base/HandlerInterface.js +3 -0
  54. package/dist/handlers/base/HandlerInterface.js.map +1 -0
  55. package/dist/handlers/index.d.ts +14 -0
  56. package/dist/handlers/index.d.ts.map +1 -0
  57. package/dist/handlers/index.js +31 -0
  58. package/dist/handlers/index.js.map +1 -0
  59. package/dist/mcp-server.d.ts +15 -0
  60. package/dist/mcp-server.d.ts.map +1 -0
  61. package/dist/mcp-server.js +145 -0
  62. package/dist/mcp-server.js.map +1 -0
  63. package/dist/schemas/motion.d.ts +4971 -0
  64. package/dist/schemas/motion.d.ts.map +1 -0
  65. package/dist/schemas/motion.js +328 -0
  66. package/dist/schemas/motion.js.map +1 -0
  67. package/dist/services/motionApi.d.ts +199 -0
  68. package/dist/services/motionApi.d.ts.map +1 -0
  69. package/dist/services/motionApi.js +1950 -0
  70. package/dist/services/motionApi.js.map +1 -0
  71. package/dist/tools/ToolConfigurator.d.ts +19 -0
  72. package/dist/tools/ToolConfigurator.d.ts.map +1 -0
  73. package/dist/tools/ToolConfigurator.js +89 -0
  74. package/dist/tools/ToolConfigurator.js.map +1 -0
  75. package/dist/tools/ToolDefinitions.d.ts +25 -0
  76. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  77. package/dist/tools/ToolDefinitions.js +508 -0
  78. package/dist/tools/ToolDefinitions.js.map +1 -0
  79. package/dist/tools/ToolRegistry.d.ts +16 -0
  80. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  81. package/dist/tools/ToolRegistry.js +89 -0
  82. package/dist/tools/ToolRegistry.js.map +1 -0
  83. package/dist/tools/index.d.ts +4 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +21 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/types/mcp-tool-args.d.ts +123 -0
  88. package/dist/types/mcp-tool-args.d.ts.map +1 -0
  89. package/dist/types/mcp-tool-args.js +7 -0
  90. package/dist/types/mcp-tool-args.js.map +1 -0
  91. package/dist/types/mcp.d.ts +32 -0
  92. package/dist/types/mcp.d.ts.map +1 -0
  93. package/dist/types/mcp.js +3 -0
  94. package/dist/types/mcp.js.map +1 -0
  95. package/dist/types/motion.d.ts +304 -0
  96. package/dist/types/motion.d.ts.map +1 -0
  97. package/dist/types/motion.js +3 -0
  98. package/dist/types/motion.js.map +1 -0
  99. package/dist/utils/cache.d.ts +25 -0
  100. package/dist/utils/cache.d.ts.map +1 -0
  101. package/dist/utils/cache.js +135 -0
  102. package/dist/utils/cache.js.map +1 -0
  103. package/dist/utils/constants.d.ts +88 -0
  104. package/dist/utils/constants.d.ts.map +1 -0
  105. package/dist/utils/constants.js +188 -0
  106. package/dist/utils/constants.js.map +1 -0
  107. package/dist/utils/errorHandling.d.ts +50 -0
  108. package/dist/utils/errorHandling.d.ts.map +1 -0
  109. package/dist/utils/errorHandling.js +86 -0
  110. package/dist/utils/errorHandling.js.map +1 -0
  111. package/dist/utils/index.d.ts +13 -0
  112. package/dist/utils/index.d.ts.map +1 -0
  113. package/dist/utils/index.js +38 -0
  114. package/dist/utils/index.js.map +1 -0
  115. package/dist/utils/logger.d.ts +13 -0
  116. package/dist/utils/logger.d.ts.map +1 -0
  117. package/dist/utils/logger.js +47 -0
  118. package/dist/utils/logger.js.map +1 -0
  119. package/dist/utils/pagination.d.ts +61 -0
  120. package/dist/utils/pagination.d.ts.map +1 -0
  121. package/dist/utils/pagination.js +168 -0
  122. package/dist/utils/pagination.js.map +1 -0
  123. package/dist/utils/paginationNew.d.ts +44 -0
  124. package/dist/utils/paginationNew.d.ts.map +1 -0
  125. package/dist/utils/paginationNew.js +149 -0
  126. package/dist/utils/paginationNew.js.map +1 -0
  127. package/dist/utils/parameterUtils.d.ts +79 -0
  128. package/dist/utils/parameterUtils.d.ts.map +1 -0
  129. package/dist/utils/parameterUtils.js +189 -0
  130. package/dist/utils/parameterUtils.js.map +1 -0
  131. package/dist/utils/responseFormatters.d.ts +95 -0
  132. package/dist/utils/responseFormatters.d.ts.map +1 -0
  133. package/dist/utils/responseFormatters.js +342 -0
  134. package/dist/utils/responseFormatters.js.map +1 -0
  135. package/dist/utils/responseWrapper.d.ts +38 -0
  136. package/dist/utils/responseWrapper.d.ts.map +1 -0
  137. package/dist/utils/responseWrapper.js +201 -0
  138. package/dist/utils/responseWrapper.js.map +1 -0
  139. package/dist/utils/sanitize.d.ts +51 -0
  140. package/dist/utils/sanitize.d.ts.map +1 -0
  141. package/dist/utils/sanitize.js +138 -0
  142. package/dist/utils/sanitize.js.map +1 -0
  143. package/dist/utils/validator.d.ts +37 -0
  144. package/dist/utils/validator.d.ts.map +1 -0
  145. package/dist/utils/validator.js +74 -0
  146. package/dist/utils/validator.js.map +1 -0
  147. package/dist/utils/workspaceResolver.d.ts +40 -0
  148. package/dist/utils/workspaceResolver.d.ts.map +1 -0
  149. package/dist/utils/workspaceResolver.js +207 -0
  150. package/dist/utils/workspaceResolver.js.map +1 -0
  151. package/package.json +41 -17
  152. package/.claude/settings.local.json +0 -15
  153. package/.env.example +0 -3
  154. package/sample.png +0 -0
  155. package/src/index.js +0 -179
  156. package/src/mcp-server.js +0 -1137
  157. package/src/routes/motion.js +0 -152
  158. package/src/services/motionApi.js +0 -1177
  159. package/src/worker.js +0 -248
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ /**
3
+ * Parameter Utilities - Parameter parsing and validation helpers
4
+ *
5
+ * This module provides utilities for parsing, validating, and setting
6
+ * default values for MCP handler parameters, reducing duplication and
7
+ * ensuring consistent parameter handling.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseWorkspaceArgs = parseWorkspaceArgs;
11
+ exports.parseSearchArgs = parseSearchArgs;
12
+ exports.parseTaskArgs = parseTaskArgs;
13
+ exports.parseProjectArgs = parseProjectArgs;
14
+ exports.setDefaults = setDefaults;
15
+ exports.validateRequiredParams = validateRequiredParams;
16
+ exports.validateParameterTypes = validateParameterTypes;
17
+ exports.sanitizeStringParams = sanitizeStringParams;
18
+ exports.parseAndValidateWorkspace = parseAndValidateWorkspace;
19
+ const constants_1 = require("./constants");
20
+ const errorHandling_1 = require("./errorHandling");
21
+ const sanitize_1 = require("./sanitize");
22
+ /**
23
+ * Parse workspace-related arguments from MCP request
24
+ */
25
+ function parseWorkspaceArgs(args = {}) {
26
+ return {
27
+ workspaceId: args.workspaceId || undefined,
28
+ workspaceName: args.workspaceName ? (0, sanitize_1.sanitizeName)(args.workspaceName) : undefined
29
+ };
30
+ }
31
+ /**
32
+ * Parse search-related arguments from MCP request
33
+ */
34
+ function parseSearchArgs(args = {}) {
35
+ return {
36
+ query: args.query ? (0, sanitize_1.sanitizeName)(args.query) : '',
37
+ searchScope: args.searchScope || constants_1.DEFAULTS.SEARCH_SCOPE,
38
+ limit: args.limit || constants_1.DEFAULTS.SEARCH_LIMIT,
39
+ ...parseWorkspaceArgs(args)
40
+ };
41
+ }
42
+ /**
43
+ * Parse autoScheduled parameter to handle various input formats
44
+ * @param value - The autoScheduled value from MCP request
45
+ * @returns Proper autoScheduled value for Motion API
46
+ */
47
+ function parseAutoScheduledParam(value) {
48
+ // If undefined, leave as undefined (field not provided)
49
+ if (value === undefined) {
50
+ return undefined;
51
+ }
52
+ // If null, keep as null (explicitly disable auto-scheduling)
53
+ if (value === null) {
54
+ return null;
55
+ }
56
+ // If it's already an object, use it as-is
57
+ if (typeof value === 'object' && value !== null) {
58
+ return value;
59
+ }
60
+ // If it's a non-empty string, treat as schedule name
61
+ if (typeof value === 'string' && value.trim()) {
62
+ const trimmed = value.trim();
63
+ // If it's 'false', disable auto-scheduling
64
+ if (trimmed === 'false') {
65
+ return null;
66
+ }
67
+ // If it's 'true' or empty string, enable with no schedule (will trigger validation error)
68
+ if (trimmed === 'true' || trimmed === '') {
69
+ return {}; // Empty object enables auto-scheduling but will require schedule validation
70
+ }
71
+ // Otherwise, treat as schedule name
72
+ return { schedule: trimmed };
73
+ }
74
+ // If it's 'true' or true, enable auto-scheduling (will trigger validation for schedule)
75
+ if (value === 'true' || value === true) {
76
+ return {}; // Empty object enables auto-scheduling but will require schedule validation
77
+ }
78
+ // If it's 'false' or false, disable auto-scheduling
79
+ if (value === 'false' || value === false) {
80
+ return null;
81
+ }
82
+ // For any other value, treat as undefined (not provided)
83
+ return undefined;
84
+ }
85
+ /**
86
+ * Parse task creation/update arguments from MCP request
87
+ */
88
+ function parseTaskArgs(args = {}) {
89
+ return {
90
+ name: args.name ? (0, sanitize_1.sanitizeName)(args.name) : undefined,
91
+ description: (0, sanitize_1.sanitizeDescription)(args.description),
92
+ projectId: args.projectId || undefined,
93
+ projectName: args.projectName ? (0, sanitize_1.sanitizeName)(args.projectName) : undefined,
94
+ status: args.status || undefined,
95
+ priority: args.priority || undefined,
96
+ dueDate: args.dueDate || undefined,
97
+ duration: args.duration !== undefined ? args.duration : undefined,
98
+ labels: Array.isArray(args.labels) ? args.labels : undefined,
99
+ assigneeId: args.assigneeId || undefined,
100
+ autoScheduled: parseAutoScheduledParam(args.autoScheduled),
101
+ ...parseWorkspaceArgs(args)
102
+ };
103
+ }
104
+ /**
105
+ * Parse project creation/update arguments from MCP request
106
+ */
107
+ function parseProjectArgs(args = {}) {
108
+ return {
109
+ name: args.name ? (0, sanitize_1.sanitizeName)(args.name) : undefined,
110
+ description: (0, sanitize_1.sanitizeDescription)(args.description),
111
+ color: args.color || undefined,
112
+ status: args.status || undefined,
113
+ ...parseWorkspaceArgs(args)
114
+ };
115
+ }
116
+ /**
117
+ * Set default values for parameters
118
+ */
119
+ function setDefaults(args = {}, defaults = {}) {
120
+ return { ...defaults, ...args };
121
+ }
122
+ /**
123
+ * Validate that required parameters are present
124
+ * @throws {ValidationError} If required parameters are missing
125
+ */
126
+ function validateRequiredParams(args = {}, required = []) {
127
+ const missing = [];
128
+ for (const param of required) {
129
+ if (args[param] === null || args[param] === undefined || args[param] === '') {
130
+ missing.push(param);
131
+ }
132
+ }
133
+ if (missing.length > 0) {
134
+ throw new errorHandling_1.ValidationError(`Missing required parameters: ${missing.join(', ')}`, missing[0], { missing, provided: Object.keys(args) });
135
+ }
136
+ }
137
+ /**
138
+ * Validate parameter types
139
+ * @throws {ValidationError} If parameters have wrong types
140
+ */
141
+ function validateParameterTypes(args = {}, types = {}) {
142
+ const errors = [];
143
+ for (const [param, expectedType] of Object.entries(types)) {
144
+ if (args[param] !== null && args[param] !== undefined) {
145
+ const actualType = typeof args[param];
146
+ if (actualType !== expectedType) {
147
+ errors.push(`${param} should be ${expectedType}, got ${actualType}`);
148
+ }
149
+ }
150
+ }
151
+ if (errors.length > 0) {
152
+ throw new errorHandling_1.ValidationError(`Type validation failed: ${errors.join('; ')}`, null, { errors, args });
153
+ }
154
+ }
155
+ /**
156
+ * Sanitize string parameters (trim whitespace, handle empty strings)
157
+ * Following NULL_UNDEFINED_POLICY: empty strings become undefined (deleted)
158
+ */
159
+ function sanitizeStringParams(args = {}, stringParams = []) {
160
+ const sanitized = { ...args };
161
+ for (const param of stringParams) {
162
+ const value = sanitized[param];
163
+ if (typeof value === 'string') {
164
+ const trimmed = value.trim();
165
+ // Delete empty strings (makes them undefined) per policy
166
+ if (trimmed === '') {
167
+ delete sanitized[param];
168
+ }
169
+ else {
170
+ // Type-safe assignment: we've verified it's a string at runtime
171
+ // and we're only processing declared string parameters
172
+ Object.assign(sanitized, { [param]: trimmed });
173
+ }
174
+ }
175
+ }
176
+ return sanitized;
177
+ }
178
+ /**
179
+ * Parse and validate workspace parameters with common validation
180
+ */
181
+ function parseAndValidateWorkspace(args = {}, options = {}) {
182
+ const { requireWorkspace = false } = options;
183
+ const workspaceParams = parseWorkspaceArgs(args);
184
+ if (requireWorkspace && !workspaceParams.workspaceId && !workspaceParams.workspaceName) {
185
+ throw new errorHandling_1.ValidationError('Either workspaceId or workspaceName is required', 'workspace', { provided: workspaceParams });
186
+ }
187
+ return workspaceParams;
188
+ }
189
+ //# sourceMappingURL=parameterUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameterUtils.js","sourceRoot":"","sources":["../../src/utils/parameterUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Response Formatting Utilities - MCP response formatting helpers
3
+ *
4
+ * This module provides utilities to format various types of responses
5
+ * consistently across all MCP handlers, reducing duplication and ensuring
6
+ * uniform response structures.
7
+ */
8
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
9
+ import { MotionProject, MotionTask, MotionWorkspace, MotionComment, MotionCustomField, MotionRecurringTask, MotionSchedule, MotionStatus } from '../types/motion';
10
+ /**
11
+ * Format a list of items for MCP response
12
+ */
13
+ export declare function formatListResponse<T>(items: T[], title: string, formatter: (item: T) => string): CallToolResult;
14
+ interface ProjectListOptions {
15
+ includeWorkspaceNote?: boolean;
16
+ showIds?: boolean;
17
+ }
18
+ /**
19
+ * Format project list response with workspace context
20
+ */
21
+ export declare function formatProjectList(projects: MotionProject[], workspaceName: string, workspaceId?: string | null, options?: ProjectListOptions): CallToolResult;
22
+ interface TaskListContext {
23
+ workspaceName?: string;
24
+ projectName?: string;
25
+ status?: string;
26
+ assigneeName?: string;
27
+ priority?: string;
28
+ dueDate?: string;
29
+ limit?: number;
30
+ allWorkspaces?: boolean;
31
+ }
32
+ /**
33
+ * Format task list response
34
+ */
35
+ export declare function formatTaskList(tasks: MotionTask[], context?: TaskListContext): CallToolResult;
36
+ /**
37
+ * Format workspace list response
38
+ */
39
+ export declare function formatWorkspaceList(workspaces: MotionWorkspace[]): CallToolResult;
40
+ /**
41
+ * Format detailed item response (project, task, etc.)
42
+ */
43
+ export declare function formatDetailResponse<T extends Record<string, any>>(item: T, itemType: string, fields?: (keyof T)[]): CallToolResult;
44
+ /**
45
+ * Format single task detail response with comprehensive information
46
+ */
47
+ export declare function formatTaskDetail(task: MotionTask): CallToolResult;
48
+ interface SearchOptions {
49
+ limit?: number;
50
+ searchScope?: string;
51
+ }
52
+ interface SearchResult {
53
+ id: string;
54
+ name: string;
55
+ projectId?: string;
56
+ }
57
+ /**
58
+ * Format search results response
59
+ */
60
+ export declare function formatSearchResults(results: SearchResult[], query: string, options?: SearchOptions): CallToolResult;
61
+ /**
62
+ * Format comments list response
63
+ */
64
+ export declare function formatCommentList(comments: MotionComment[]): CallToolResult;
65
+ /**
66
+ * Format single comment response
67
+ */
68
+ export declare function formatCommentDetail(comment: MotionComment): CallToolResult;
69
+ /**
70
+ * Format custom field list response
71
+ */
72
+ export declare function formatCustomFieldList(fields: MotionCustomField[]): CallToolResult;
73
+ /**
74
+ * Format single custom field response
75
+ */
76
+ export declare function formatCustomFieldDetail(field: MotionCustomField): CallToolResult;
77
+ /**
78
+ * Format success message for custom field operations
79
+ */
80
+ export declare function formatCustomFieldSuccess(operation: string, entityType?: string, entityId?: string): CallToolResult;
81
+ /**
82
+ * Format recurring task list response
83
+ */
84
+ export declare function formatRecurringTaskList(tasks: MotionRecurringTask[]): CallToolResult;
85
+ /**
86
+ * Format single recurring task response
87
+ */
88
+ export declare function formatRecurringTaskDetail(task: MotionRecurringTask): CallToolResult;
89
+ /**
90
+ * Format schedule list response
91
+ */
92
+ export declare function formatScheduleList(schedules: MotionSchedule[]): CallToolResult;
93
+ export declare function formatStatusList(statuses: MotionStatus[]): CallToolResult;
94
+ export {};
95
+ //# sourceMappingURL=responseFormatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseFormatters.d.ts","sourceRoot":"","sources":["../../src/utils/responseFormatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ /**
3
+ * Response Formatting Utilities - MCP response formatting helpers
4
+ *
5
+ * This module provides utilities to format various types of responses
6
+ * consistently across all MCP handlers, reducing duplication and ensuring
7
+ * uniform response structures.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.formatListResponse = formatListResponse;
11
+ exports.formatProjectList = formatProjectList;
12
+ exports.formatTaskList = formatTaskList;
13
+ exports.formatWorkspaceList = formatWorkspaceList;
14
+ exports.formatDetailResponse = formatDetailResponse;
15
+ exports.formatTaskDetail = formatTaskDetail;
16
+ exports.formatSearchResults = formatSearchResults;
17
+ exports.formatCommentList = formatCommentList;
18
+ exports.formatCommentDetail = formatCommentDetail;
19
+ exports.formatCustomFieldList = formatCustomFieldList;
20
+ exports.formatCustomFieldDetail = formatCustomFieldDetail;
21
+ exports.formatCustomFieldSuccess = formatCustomFieldSuccess;
22
+ exports.formatRecurringTaskList = formatRecurringTaskList;
23
+ exports.formatRecurringTaskDetail = formatRecurringTaskDetail;
24
+ exports.formatScheduleList = formatScheduleList;
25
+ exports.formatStatusList = formatStatusList;
26
+ const errorHandling_1 = require("./errorHandling");
27
+ const constants_1 = require("./constants");
28
+ /**
29
+ * Format a list of items for MCP response
30
+ */
31
+ function formatListResponse(items, title, formatter) {
32
+ if (!Array.isArray(items)) {
33
+ throw new Error('Items must be an array');
34
+ }
35
+ const list = items.map(formatter).join('\n');
36
+ const responseText = `${title}:\n${list}`;
37
+ return (0, errorHandling_1.formatMcpSuccess)(responseText);
38
+ }
39
+ /**
40
+ * Format project list response with workspace context
41
+ */
42
+ function formatProjectList(projects, workspaceName, workspaceId = null, options = {}) {
43
+ const { includeWorkspaceNote = false, showIds = true } = options;
44
+ const projectFormatter = (project) => {
45
+ if (showIds) {
46
+ // For cross-workspace listings, show workspace info too
47
+ if (workspaceName === 'All Workspaces' && project.workspaceId) {
48
+ return `- ${project.name} (ID: ${project.id}) [Workspace: ${project.workspaceId}]`;
49
+ }
50
+ return `- ${project.name} (ID: ${project.id})`;
51
+ }
52
+ return `- ${project.name}`;
53
+ };
54
+ let responseText = `Found ${projects.length} ${projects.length === 1 ? 'project' : 'projects'} in workspace "${workspaceName}"`;
55
+ if (workspaceId) {
56
+ responseText += ` (ID: ${workspaceId})`;
57
+ }
58
+ if (projects.length > 0) {
59
+ const projectList = projects.map(projectFormatter).join('\n');
60
+ responseText += `:\n${projectList}`;
61
+ }
62
+ if (includeWorkspaceNote && !workspaceId) {
63
+ responseText += `\n\nNote: This shows projects from the default workspace. You can specify a different workspace using the workspaceId or workspaceName parameter, or use motion_workspaces (operation: list) to see all available workspaces.`;
64
+ }
65
+ return (0, errorHandling_1.formatMcpSuccess)(responseText);
66
+ }
67
+ /**
68
+ * Format task list response
69
+ */
70
+ function formatTaskList(tasks, context = {}) {
71
+ const { workspaceName, projectName, status, assigneeName, priority, dueDate, limit, allWorkspaces } = context;
72
+ const taskFormatter = (task) => {
73
+ let line = `- ${task.name}`;
74
+ if (task.id)
75
+ line += ` (ID: ${task.id})`;
76
+ if (task.status)
77
+ line += ` [${typeof task.status === 'string' ? task.status : task.status.name}]`;
78
+ if (task.priority)
79
+ line += ` {${task.priority}}`;
80
+ if (task.dueDate) {
81
+ const dueDate = new Date(task.dueDate).toLocaleDateString();
82
+ line += ` (Due: ${dueDate})`;
83
+ }
84
+ return line;
85
+ };
86
+ let title = `Found ${tasks.length} ${tasks.length === 1 ? 'task' : 'tasks'}`;
87
+ if (allWorkspaces) {
88
+ title += ` across all workspaces`;
89
+ }
90
+ else {
91
+ if (workspaceName)
92
+ title += ` in workspace "${workspaceName}"`;
93
+ }
94
+ if (projectName)
95
+ title += ` in project "${projectName}"`;
96
+ if (status)
97
+ title += ` with status "${status}"`;
98
+ if (assigneeName)
99
+ title += ` for assignee "${assigneeName}"`;
100
+ if (priority)
101
+ title += ` with priority "${priority}"`;
102
+ if (dueDate) {
103
+ const parsedDueDate = new Date(dueDate);
104
+ const dueDateText = Number.isNaN(parsedDueDate.getTime())
105
+ ? dueDate
106
+ : parsedDueDate.toLocaleDateString();
107
+ title += ` due by ${dueDateText}`;
108
+ }
109
+ if (limit)
110
+ title += ` (limit: ${limit})`;
111
+ return formatListResponse(tasks, title, taskFormatter);
112
+ }
113
+ /**
114
+ * Format workspace list response
115
+ */
116
+ function formatWorkspaceList(workspaces) {
117
+ const workspaceFormatter = (workspace) => {
118
+ let line = `- ${workspace.name} (ID: ${workspace.id})`;
119
+ if (workspace.type)
120
+ line += ` [${workspace.type}]`;
121
+ return line;
122
+ };
123
+ return formatListResponse(workspaces, `Available workspaces (${workspaces.length})`, workspaceFormatter);
124
+ }
125
+ /**
126
+ * Format detailed item response (project, task, etc.)
127
+ */
128
+ function formatDetailResponse(item, itemType, fields = []) {
129
+ let responseText = `${itemType} Details:\n`;
130
+ fields.forEach(field => {
131
+ const value = item[field];
132
+ const fieldStr = String(field);
133
+ const displayName = fieldStr.charAt(0).toUpperCase() + fieldStr.slice(1);
134
+ const displayValue = value ?? 'N/A';
135
+ responseText += `- ${displayName}: ${displayValue}\n`;
136
+ });
137
+ return (0, errorHandling_1.formatMcpSuccess)(responseText);
138
+ }
139
+ /**
140
+ * Format single task detail response with comprehensive information
141
+ */
142
+ function formatTaskDetail(task) {
143
+ const details = [
144
+ `Task: ${task.name}`,
145
+ `ID: ${task.id}`,
146
+ task.description ? `Description: ${task.description}` : null,
147
+ `Status: ${typeof task.status === 'string' ? task.status : task.status?.name || 'Unknown'}`,
148
+ `Priority: ${task.priority || 'Not set'}`,
149
+ `Completed: ${task.completed ? 'Yes' : 'No'}`,
150
+ task.dueDate ? `Due Date: ${new Date(task.dueDate).toLocaleString()}` : 'Due Date: Not set',
151
+ task.createdTime ? `Created: ${new Date(task.createdTime).toLocaleString()}` : null,
152
+ task.updatedTime ? `Last Updated: ${new Date(task.updatedTime).toLocaleString()}` : null,
153
+ task.completedTime ? `Completed: ${new Date(task.completedTime).toLocaleString()}` : null,
154
+ `Workspace: ${task.workspace?.name || 'Unknown'} (${task.workspace?.id || 'N/A'})`,
155
+ task.project ? `Project: ${task.project.name} (${task.project.id})` : 'Project: No project assigned',
156
+ task.assignees && task.assignees.length > 0
157
+ ? `Assignees: ${task.assignees.map(a => `${a.name} (${a.email})`).join(', ')}`
158
+ : 'Assignees: None',
159
+ task.creator ? `Creator: ${task.creator.name} (${task.creator.email})` : null,
160
+ (task.labels && task.labels.length > 0)
161
+ ? `Labels: ${task.labels.map(l => typeof l === 'string' ? l : l.name).join(', ')}`
162
+ : null,
163
+ task.duration ? `Duration: ${typeof task.duration === 'number' ? `${task.duration} minutes` : task.duration}` : null,
164
+ task.deadlineType ? `Deadline Type: ${task.deadlineType}` : null,
165
+ task.scheduledStart ? `Scheduled Start: ${new Date(task.scheduledStart).toLocaleString()}` : null,
166
+ task.scheduledEnd ? `Scheduled End: ${new Date(task.scheduledEnd).toLocaleString()}` : null,
167
+ task.parentRecurringTaskId ? `Recurring Task ID: ${task.parentRecurringTaskId}` : null,
168
+ task.chunks && task.chunks.length > 0
169
+ ? `Scheduled Chunks: ${task.chunks.length} time block(s)`
170
+ : null
171
+ ].filter(Boolean).join('\n');
172
+ return (0, errorHandling_1.formatMcpSuccess)(details);
173
+ }
174
+ /**
175
+ * Format search results response
176
+ */
177
+ function formatSearchResults(results, query, options = {}) {
178
+ const { limit, searchScope } = options;
179
+ const resultFormatter = (result) => {
180
+ const type = result.projectId ? "task" : "project";
181
+ return `- [${type}] ${result.name} (ID: ${result.id})`;
182
+ };
183
+ let title = `Search Results for "${query}"`;
184
+ if (limit)
185
+ title += ` (Limit: ${limit})`;
186
+ if (searchScope)
187
+ title += ` (Scope: ${searchScope})`;
188
+ return formatListResponse(results, title, resultFormatter);
189
+ }
190
+ /**
191
+ * Format comments list response
192
+ */
193
+ function formatCommentList(comments) {
194
+ if (comments.length === 0) {
195
+ return (0, errorHandling_1.formatMcpSuccess)("No comments found.");
196
+ }
197
+ const commentFormatter = (comment) => {
198
+ const location = `Task ${comment.taskId}`;
199
+ const timestamp = comment.createdAt;
200
+ const author = comment.creator.name || comment.creator.email || comment.creator.id;
201
+ // Truncate long comments for display
202
+ const displayContent = comment.content.length > constants_1.LIMITS.COMMENT_DISPLAY_LENGTH
203
+ ? comment.content.substring(0, constants_1.LIMITS.COMMENT_DISPLAY_LENGTH) + '...'
204
+ : comment.content;
205
+ // Keep as single line for proper list formatting
206
+ return `- [${comment.id}] ${location} | Author: ${author} | ${timestamp} | "${displayContent}"`;
207
+ };
208
+ return formatListResponse(comments, `Found ${comments.length} comment${comments.length === 1 ? '' : 's'}`, commentFormatter);
209
+ }
210
+ /**
211
+ * Format single comment response
212
+ */
213
+ function formatCommentDetail(comment) {
214
+ const location = `Task ${comment.taskId}`;
215
+ const timestamp = comment.createdAt;
216
+ const author = comment.creator.name || comment.creator.email || comment.creator.id;
217
+ const details = [
218
+ `Comment created successfully:`,
219
+ `- ID: ${comment.id}`,
220
+ `- Location: ${location}`,
221
+ `- Author: ${author}`,
222
+ `- Created: ${timestamp}`,
223
+ `- Content: "${comment.content}"`
224
+ ].join('\n');
225
+ return (0, errorHandling_1.formatMcpSuccess)(details);
226
+ }
227
+ /**
228
+ * Format custom field list response
229
+ */
230
+ function formatCustomFieldList(fields) {
231
+ if (fields.length === 0) {
232
+ return (0, errorHandling_1.formatMcpSuccess)("No custom fields found.");
233
+ }
234
+ const fieldFormatter = (field) => {
235
+ return `- ID: ${field.id} [Type: ${field.field}]`;
236
+ };
237
+ return formatListResponse(fields, `Found ${fields.length} custom field${fields.length === 1 ? '' : 's'}`, fieldFormatter);
238
+ }
239
+ /**
240
+ * Format single custom field response
241
+ */
242
+ function formatCustomFieldDetail(field) {
243
+ const details = [
244
+ `Custom field created successfully:`,
245
+ `- ID: ${field.id}`,
246
+ `- Type: ${field.field}`
247
+ ].join('\n');
248
+ return (0, errorHandling_1.formatMcpSuccess)(details);
249
+ }
250
+ /**
251
+ * Format success message for custom field operations
252
+ */
253
+ function formatCustomFieldSuccess(operation, entityType, entityId) {
254
+ let message = `Custom field ${operation} successfully`;
255
+ if (entityType && entityId) {
256
+ message += ` for ${entityType} ${entityId}`;
257
+ }
258
+ return (0, errorHandling_1.formatMcpSuccess)(message);
259
+ }
260
+ /**
261
+ * Format recurring task list response
262
+ */
263
+ function formatRecurringTaskList(tasks) {
264
+ if (tasks.length === 0) {
265
+ return (0, errorHandling_1.formatMcpSuccess)("No recurring tasks found.");
266
+ }
267
+ const taskFormatter = (task) => {
268
+ const projectName = task.project?.name ?? 'No Project';
269
+ return `- ${task.name} (ID: ${task.id}) [${task.priority}] (Project: ${projectName})`;
270
+ };
271
+ return formatListResponse(tasks, `Found ${tasks.length} recurring task${tasks.length === 1 ? '' : 's'}`, taskFormatter);
272
+ }
273
+ /**
274
+ * Format single recurring task response
275
+ */
276
+ function formatRecurringTaskDetail(task) {
277
+ const details = [
278
+ `Recurring task created successfully:`,
279
+ `- ID: ${task.id}`,
280
+ `- Name: ${task.name}`,
281
+ `- Priority: ${task.priority}`,
282
+ `- Creator: ${task.creator.name} (${task.creator.email})`,
283
+ `- Workspace: ${task.workspace.name} (${task.workspace.id})`,
284
+ task.project ? `- Project: ${task.project.name} (${task.project.id})` : `- Project: No project assigned`,
285
+ task.assignee ? `- Assignee: ${task.assignee.name} (${task.assignee.email})` : null,
286
+ `- Status: ${typeof task.status === 'string' ? task.status : task.status?.name || 'Unknown'}`,
287
+ (task.labels && task.labels.length > 0) ? `- Labels: ${task.labels.map(l => typeof l === 'string' ? l : l.name).join(', ')}` : null
288
+ ].filter(Boolean).join('\n');
289
+ return (0, errorHandling_1.formatMcpSuccess)(details);
290
+ }
291
+ /**
292
+ * Format schedule list response
293
+ */
294
+ function formatScheduleList(schedules) {
295
+ // Add null safety check for the array itself
296
+ if (!schedules || !Array.isArray(schedules) || schedules.length === 0) {
297
+ return (0, errorHandling_1.formatMcpSuccess)("No schedules found.");
298
+ }
299
+ const scheduleFormatter = (schedule) => {
300
+ // Defensive programming for nested schedule object
301
+ if (!schedule) {
302
+ return '- Invalid schedule entry';
303
+ }
304
+ const name = schedule.name || 'Unnamed';
305
+ const timezone = schedule.timezone || 'Unknown timezone';
306
+ // Count working days if schedule details are available
307
+ let workingDays = '';
308
+ if (schedule.schedule && typeof schedule.schedule === 'object') {
309
+ const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
310
+ const activeDays = days.filter(day => Array.isArray(schedule.schedule[day]) &&
311
+ schedule.schedule[day].length > 0);
312
+ workingDays = activeDays.length > 0
313
+ ? ` | Working days: ${activeDays.length}/7`
314
+ : ' | No working hours defined';
315
+ }
316
+ else {
317
+ workingDays = ' | Schedule details unavailable';
318
+ }
319
+ return `- ${name} (${timezone})${workingDays}`;
320
+ };
321
+ return formatListResponse(schedules, `Found ${schedules.length} schedule${schedules.length === 1 ? '' : 's'}`, scheduleFormatter);
322
+ }
323
+ function formatStatusList(statuses) {
324
+ const statusFormatter = (status) => {
325
+ // Defensive programming for status object
326
+ if (!status) {
327
+ return '- Invalid status entry';
328
+ }
329
+ const name = status.name || 'Unnamed';
330
+ const flags = [];
331
+ if (status.isDefaultStatus) {
332
+ flags.push('Default');
333
+ }
334
+ if (status.isResolvedStatus) {
335
+ flags.push('Resolved');
336
+ }
337
+ const flagsStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';
338
+ return `- ${name}${flagsStr}`;
339
+ };
340
+ return formatListResponse(statuses, `Found ${statuses.length} status${statuses.length === 1 ? '' : 'es'}`, statusFormatter);
341
+ }
342
+ //# sourceMappingURL=responseFormatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseFormatters.js","sourceRoot":"","sources":["../../src/utils/responseFormatters.ts"],"names":[],"mappings":"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"}