@doist/todoist-ai 2.2.2 → 4.0.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 (202) hide show
  1. package/README.md +6 -14
  2. package/dist/index.d.ts +619 -250
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +45 -29
  5. package/dist/main.js +2 -1
  6. package/dist/mcp-helpers.d.ts +25 -3
  7. package/dist/mcp-helpers.d.ts.map +1 -1
  8. package/dist/mcp-helpers.js +37 -19
  9. package/dist/mcp-server.d.ts.map +1 -1
  10. package/dist/mcp-server.js +44 -28
  11. package/dist/tools/__tests__/add-comments.test.d.ts +2 -0
  12. package/dist/tools/__tests__/add-comments.test.d.ts.map +1 -0
  13. package/dist/tools/__tests__/add-comments.test.js +241 -0
  14. package/dist/tools/__tests__/add-projects.test.d.ts +2 -0
  15. package/dist/tools/__tests__/add-projects.test.d.ts.map +1 -0
  16. package/dist/tools/__tests__/add-projects.test.js +152 -0
  17. package/dist/tools/__tests__/add-sections.test.d.ts +2 -0
  18. package/dist/tools/__tests__/add-sections.test.d.ts.map +1 -0
  19. package/dist/tools/__tests__/add-sections.test.js +181 -0
  20. package/dist/tools/__tests__/add-tasks.test.d.ts +2 -0
  21. package/dist/tools/__tests__/add-tasks.test.d.ts.map +1 -0
  22. package/dist/tools/__tests__/{tasks-add-multiple.test.js → add-tasks.test.js} +89 -79
  23. package/dist/tools/__tests__/complete-tasks.test.d.ts +2 -0
  24. package/dist/tools/__tests__/complete-tasks.test.d.ts.map +1 -0
  25. package/dist/tools/__tests__/complete-tasks.test.js +206 -0
  26. package/dist/tools/__tests__/delete-object.test.d.ts +2 -0
  27. package/dist/tools/__tests__/delete-object.test.d.ts.map +1 -0
  28. package/dist/tools/__tests__/{delete-one.test.js → delete-object.test.js} +42 -22
  29. package/dist/tools/__tests__/find-comments.test.d.ts +2 -0
  30. package/dist/tools/__tests__/find-comments.test.d.ts.map +1 -0
  31. package/dist/tools/__tests__/find-comments.test.js +242 -0
  32. package/dist/tools/__tests__/find-completed-tasks.test.d.ts +2 -0
  33. package/dist/tools/__tests__/find-completed-tasks.test.d.ts.map +1 -0
  34. package/dist/tools/__tests__/{tasks-list-completed.test.js → find-completed-tasks.test.js} +13 -36
  35. package/dist/tools/__tests__/find-projects.test.d.ts +2 -0
  36. package/dist/tools/__tests__/find-projects.test.d.ts.map +1 -0
  37. package/dist/tools/__tests__/{projects-list.test.js → find-projects.test.js} +55 -39
  38. package/dist/tools/__tests__/find-sections.test.d.ts +2 -0
  39. package/dist/tools/__tests__/find-sections.test.d.ts.map +1 -0
  40. package/dist/tools/__tests__/{sections-search.test.js → find-sections.test.js} +64 -50
  41. package/dist/tools/__tests__/find-tasks-by-date.test.d.ts +2 -0
  42. package/dist/tools/__tests__/find-tasks-by-date.test.d.ts.map +1 -0
  43. package/dist/tools/__tests__/{tasks-list-by-date.test.js → find-tasks-by-date.test.js} +96 -14
  44. package/dist/tools/__tests__/find-tasks.test.d.ts +2 -0
  45. package/dist/tools/__tests__/find-tasks.test.d.ts.map +1 -0
  46. package/dist/tools/__tests__/find-tasks.test.js +334 -0
  47. package/dist/tools/__tests__/get-overview.test.d.ts +2 -0
  48. package/dist/tools/__tests__/get-overview.test.d.ts.map +1 -0
  49. package/dist/tools/__tests__/{overview.test.js → get-overview.test.js} +77 -13
  50. package/dist/tools/__tests__/update-comments.test.d.ts +2 -0
  51. package/dist/tools/__tests__/update-comments.test.d.ts.map +1 -0
  52. package/dist/tools/__tests__/update-comments.test.js +296 -0
  53. package/dist/tools/__tests__/update-projects.test.d.ts +2 -0
  54. package/dist/tools/__tests__/update-projects.test.d.ts.map +1 -0
  55. package/dist/tools/__tests__/update-projects.test.js +205 -0
  56. package/dist/tools/__tests__/update-sections.test.d.ts +2 -0
  57. package/dist/tools/__tests__/update-sections.test.d.ts.map +1 -0
  58. package/dist/tools/__tests__/update-sections.test.js +156 -0
  59. package/dist/tools/__tests__/update-tasks.test.d.ts +2 -0
  60. package/dist/tools/__tests__/update-tasks.test.d.ts.map +1 -0
  61. package/dist/tools/__tests__/update-tasks.test.js +645 -0
  62. package/dist/tools/add-comments.d.ts +51 -0
  63. package/dist/tools/add-comments.d.ts.map +1 -0
  64. package/dist/tools/add-comments.js +79 -0
  65. package/dist/tools/add-projects.d.ts +50 -0
  66. package/dist/tools/add-projects.d.ts.map +1 -0
  67. package/dist/tools/add-projects.js +59 -0
  68. package/dist/tools/add-sections.d.ts +46 -0
  69. package/dist/tools/add-sections.d.ts.map +1 -0
  70. package/dist/tools/add-sections.js +61 -0
  71. package/dist/tools/add-tasks.d.ts +82 -0
  72. package/dist/tools/add-tasks.d.ts.map +1 -0
  73. package/dist/tools/add-tasks.js +96 -0
  74. package/dist/tools/complete-tasks.d.ts +40 -0
  75. package/dist/tools/complete-tasks.d.ts.map +1 -0
  76. package/dist/tools/complete-tasks.js +68 -0
  77. package/dist/tools/delete-object.d.ts +38 -0
  78. package/dist/tools/delete-object.d.ts.map +1 -0
  79. package/dist/tools/delete-object.js +79 -0
  80. package/dist/tools/find-comments.d.ts +46 -0
  81. package/dist/tools/find-comments.d.ts.map +1 -0
  82. package/dist/tools/find-comments.js +143 -0
  83. package/dist/tools/find-completed-tasks.d.ts +74 -0
  84. package/dist/tools/find-completed-tasks.d.ts.map +1 -0
  85. package/dist/tools/find-completed-tasks.js +112 -0
  86. package/dist/tools/find-projects.d.ts +53 -0
  87. package/dist/tools/find-projects.d.ts.map +1 -0
  88. package/dist/tools/find-projects.js +101 -0
  89. package/dist/tools/find-sections.d.ts +42 -0
  90. package/dist/tools/find-sections.d.ts.map +1 -0
  91. package/dist/tools/find-sections.js +96 -0
  92. package/dist/tools/find-tasks-by-date.d.ts +59 -0
  93. package/dist/tools/find-tasks-by-date.d.ts.map +1 -0
  94. package/dist/tools/find-tasks-by-date.js +121 -0
  95. package/dist/tools/find-tasks.d.ts +65 -0
  96. package/dist/tools/find-tasks.d.ts.map +1 -0
  97. package/dist/tools/find-tasks.js +182 -0
  98. package/dist/tools/get-overview.d.ts +67 -0
  99. package/dist/tools/get-overview.d.ts.map +1 -0
  100. package/dist/tools/{overview.js → get-overview.js} +66 -19
  101. package/dist/tools/update-comments.d.ts +50 -0
  102. package/dist/tools/update-comments.d.ts.map +1 -0
  103. package/dist/tools/update-comments.js +82 -0
  104. package/dist/tools/update-projects.d.ts +59 -0
  105. package/dist/tools/update-projects.d.ts.map +1 -0
  106. package/dist/tools/update-projects.js +84 -0
  107. package/dist/tools/update-sections.d.ts +47 -0
  108. package/dist/tools/update-sections.d.ts.map +1 -0
  109. package/dist/tools/update-sections.js +70 -0
  110. package/dist/tools/update-tasks.d.ts +94 -0
  111. package/dist/tools/update-tasks.d.ts.map +1 -0
  112. package/dist/tools/update-tasks.js +120 -0
  113. package/dist/utils/constants.d.ts +39 -0
  114. package/dist/utils/constants.d.ts.map +1 -0
  115. package/dist/utils/constants.js +41 -0
  116. package/dist/utils/response-builders.d.ts +88 -0
  117. package/dist/utils/response-builders.d.ts.map +1 -0
  118. package/dist/utils/response-builders.js +202 -0
  119. package/dist/{tools → utils}/test-helpers.d.ts +16 -0
  120. package/dist/utils/test-helpers.d.ts.map +1 -0
  121. package/dist/{tools → utils}/test-helpers.js +51 -0
  122. package/dist/utils/tool-names.d.ts +28 -0
  123. package/dist/utils/tool-names.d.ts.map +1 -0
  124. package/dist/utils/tool-names.js +31 -0
  125. package/package.json +1 -1
  126. package/dist/tools/__tests__/delete-one.test.d.ts +0 -2
  127. package/dist/tools/__tests__/delete-one.test.d.ts.map +0 -1
  128. package/dist/tools/__tests__/overview.test.d.ts +0 -2
  129. package/dist/tools/__tests__/overview.test.d.ts.map +0 -1
  130. package/dist/tools/__tests__/projects-list.test.d.ts +0 -2
  131. package/dist/tools/__tests__/projects-list.test.d.ts.map +0 -1
  132. package/dist/tools/__tests__/projects-manage.test.d.ts +0 -2
  133. package/dist/tools/__tests__/projects-manage.test.d.ts.map +0 -1
  134. package/dist/tools/__tests__/projects-manage.test.js +0 -106
  135. package/dist/tools/__tests__/sections-manage.test.d.ts +0 -2
  136. package/dist/tools/__tests__/sections-manage.test.d.ts.map +0 -1
  137. package/dist/tools/__tests__/sections-manage.test.js +0 -138
  138. package/dist/tools/__tests__/sections-search.test.d.ts +0 -2
  139. package/dist/tools/__tests__/sections-search.test.d.ts.map +0 -1
  140. package/dist/tools/__tests__/tasks-add-multiple.test.d.ts +0 -2
  141. package/dist/tools/__tests__/tasks-add-multiple.test.d.ts.map +0 -1
  142. package/dist/tools/__tests__/tasks-complete-multiple.test.d.ts +0 -2
  143. package/dist/tools/__tests__/tasks-complete-multiple.test.d.ts.map +0 -1
  144. package/dist/tools/__tests__/tasks-complete-multiple.test.js +0 -146
  145. package/dist/tools/__tests__/tasks-list-by-date.test.d.ts +0 -2
  146. package/dist/tools/__tests__/tasks-list-by-date.test.d.ts.map +0 -1
  147. package/dist/tools/__tests__/tasks-list-completed.test.d.ts +0 -2
  148. package/dist/tools/__tests__/tasks-list-completed.test.d.ts.map +0 -1
  149. package/dist/tools/__tests__/tasks-list-for-container.test.d.ts +0 -2
  150. package/dist/tools/__tests__/tasks-list-for-container.test.d.ts.map +0 -1
  151. package/dist/tools/__tests__/tasks-list-for-container.test.js +0 -232
  152. package/dist/tools/__tests__/tasks-organize-multiple.test.d.ts +0 -2
  153. package/dist/tools/__tests__/tasks-organize-multiple.test.d.ts.map +0 -1
  154. package/dist/tools/__tests__/tasks-organize-multiple.test.js +0 -245
  155. package/dist/tools/__tests__/tasks-search.test.d.ts +0 -2
  156. package/dist/tools/__tests__/tasks-search.test.d.ts.map +0 -1
  157. package/dist/tools/__tests__/tasks-search.test.js +0 -106
  158. package/dist/tools/__tests__/tasks-update-one.test.d.ts +0 -2
  159. package/dist/tools/__tests__/tasks-update-one.test.d.ts.map +0 -1
  160. package/dist/tools/__tests__/tasks-update-one.test.js +0 -251
  161. package/dist/tools/delete-one.d.ts +0 -17
  162. package/dist/tools/delete-one.d.ts.map +0 -1
  163. package/dist/tools/delete-one.js +0 -25
  164. package/dist/tools/overview.d.ts +0 -14
  165. package/dist/tools/overview.d.ts.map +0 -1
  166. package/dist/tools/projects-list.d.ts +0 -29
  167. package/dist/tools/projects-list.d.ts.map +0 -1
  168. package/dist/tools/projects-list.js +0 -39
  169. package/dist/tools/projects-manage.d.ts +0 -24
  170. package/dist/tools/projects-manage.d.ts.map +0 -1
  171. package/dist/tools/projects-manage.js +0 -26
  172. package/dist/tools/sections-manage.d.ts +0 -23
  173. package/dist/tools/sections-manage.d.ts.map +0 -1
  174. package/dist/tools/sections-manage.js +0 -37
  175. package/dist/tools/sections-search.d.ts +0 -18
  176. package/dist/tools/sections-search.d.ts.map +0 -1
  177. package/dist/tools/sections-search.js +0 -27
  178. package/dist/tools/tasks-add-multiple.d.ts +0 -55
  179. package/dist/tools/tasks-add-multiple.d.ts.map +0 -1
  180. package/dist/tools/tasks-add-multiple.js +0 -52
  181. package/dist/tools/tasks-complete-multiple.d.ts +0 -16
  182. package/dist/tools/tasks-complete-multiple.d.ts.map +0 -1
  183. package/dist/tools/tasks-complete-multiple.js +0 -23
  184. package/dist/tools/tasks-list-by-date.d.ts +0 -34
  185. package/dist/tools/tasks-list-by-date.d.ts.map +0 -1
  186. package/dist/tools/tasks-list-by-date.js +0 -53
  187. package/dist/tools/tasks-list-completed.d.ts +0 -44
  188. package/dist/tools/tasks-list-completed.d.ts.map +0 -1
  189. package/dist/tools/tasks-list-completed.js +0 -49
  190. package/dist/tools/tasks-list-for-container.d.ts +0 -34
  191. package/dist/tools/tasks-list-for-container.d.ts.map +0 -1
  192. package/dist/tools/tasks-list-for-container.js +0 -48
  193. package/dist/tools/tasks-organize-multiple.d.ts +0 -37
  194. package/dist/tools/tasks-organize-multiple.d.ts.map +0 -1
  195. package/dist/tools/tasks-organize-multiple.js +0 -34
  196. package/dist/tools/tasks-search.d.ts +0 -32
  197. package/dist/tools/tasks-search.d.ts.map +0 -1
  198. package/dist/tools/tasks-search.js +0 -30
  199. package/dist/tools/tasks-update-one.d.ts +0 -29
  200. package/dist/tools/tasks-update-one.d.ts.map +0 -1
  201. package/dist/tools/tasks-update-one.js +0 -63
  202. package/dist/tools/test-helpers.d.ts.map +0 -1
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=delete-one.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delete-one.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/delete-one.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=overview.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/overview.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=projects-list.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects-list.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/projects-list.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=projects-manage.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects-manage.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/projects-manage.test.ts"],"names":[],"mappings":""}
@@ -1,106 +0,0 @@
1
- import { jest } from '@jest/globals';
2
- import { projectsManage } from '../projects-manage.js';
3
- import { TEST_IDS, createMockProject } from '../test-helpers.js';
4
- // Mock the Todoist API
5
- const mockTodoistApi = {
6
- addProject: jest.fn(),
7
- updateProject: jest.fn(),
8
- };
9
- describe('projects-manage tool', () => {
10
- beforeEach(() => {
11
- jest.clearAllMocks();
12
- });
13
- describe('creating a new project', () => {
14
- it('should create a project and return mapped result', async () => {
15
- const mockApiResponse = createMockProject({
16
- id: TEST_IDS.PROJECT_TEST,
17
- name: 'test-abc123def456-project',
18
- childOrder: 1,
19
- createdAt: '2024-01-01T00:00:00Z',
20
- });
21
- mockTodoistApi.addProject.mockResolvedValue(mockApiResponse);
22
- const result = await projectsManage.execute({ name: 'test-abc123def456-project' }, mockTodoistApi);
23
- // Verify API was called correctly
24
- expect(mockTodoistApi.addProject).toHaveBeenCalledWith({
25
- name: 'test-abc123def456-project',
26
- });
27
- // Verify result is properly mapped
28
- expect(result).toEqual({
29
- id: TEST_IDS.PROJECT_TEST,
30
- name: 'test-abc123def456-project',
31
- color: 'charcoal',
32
- isFavorite: false,
33
- isShared: false,
34
- parentId: null,
35
- inboxProject: false,
36
- viewStyle: 'list',
37
- });
38
- });
39
- it('should handle different project properties from API', async () => {
40
- const mockApiResponse = createMockProject({
41
- id: 'project-456',
42
- name: 'My Blue Project',
43
- color: 'blue',
44
- isFavorite: true,
45
- isShared: true,
46
- parentId: 'parent-123',
47
- viewStyle: 'board',
48
- childOrder: 2,
49
- description: 'A test project',
50
- createdAt: '2024-01-01T00:00:00Z',
51
- });
52
- mockTodoistApi.addProject.mockResolvedValue(mockApiResponse);
53
- const result = await projectsManage.execute({ name: 'My Blue Project' }, mockTodoistApi);
54
- expect(mockTodoistApi.addProject).toHaveBeenCalledWith({ name: 'My Blue Project' });
55
- expect(result).toEqual({
56
- id: 'project-456',
57
- name: 'My Blue Project',
58
- color: 'blue',
59
- isFavorite: true,
60
- isShared: true,
61
- parentId: 'parent-123',
62
- inboxProject: false,
63
- viewStyle: 'board',
64
- });
65
- });
66
- });
67
- describe('updating an existing project', () => {
68
- it('should update a project when id is provided', async () => {
69
- const mockApiResponse = {
70
- url: 'https://todoist.com/projects/existing-project-123',
71
- id: 'existing-project-123',
72
- parentId: null,
73
- isDeleted: false,
74
- updatedAt: '2025-08-13T22:10:30.000000Z',
75
- childOrder: 1,
76
- description: '',
77
- isCollapsed: false,
78
- canAssignTasks: false,
79
- color: 'red',
80
- isFavorite: false,
81
- isFrozen: false,
82
- name: 'Updated Project Name',
83
- viewStyle: 'list',
84
- isArchived: false,
85
- inboxProject: false,
86
- isShared: false,
87
- createdAt: '2024-01-01T00:00:00Z',
88
- defaultOrder: 0,
89
- };
90
- mockTodoistApi.updateProject.mockResolvedValue(mockApiResponse);
91
- const result = await projectsManage.execute({ id: 'existing-project-123', name: 'Updated Project Name' }, mockTodoistApi);
92
- expect(mockTodoistApi.updateProject).toHaveBeenCalledWith('existing-project-123', {
93
- name: 'Updated Project Name',
94
- });
95
- // Update returns raw project (not mapped) - this is the actual behavior
96
- expect(result).toEqual(mockApiResponse);
97
- });
98
- });
99
- describe('error handling', () => {
100
- it('should propagate API errors', async () => {
101
- const apiError = new Error('API Error: Project name is required');
102
- mockTodoistApi.addProject.mockRejectedValue(apiError);
103
- await expect(projectsManage.execute({ name: '' }, mockTodoistApi)).rejects.toThrow('API Error: Project name is required');
104
- });
105
- });
106
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=sections-manage.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sections-manage.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/sections-manage.test.ts"],"names":[],"mappings":""}
@@ -1,138 +0,0 @@
1
- import { jest } from '@jest/globals';
2
- import { sectionsManage } from '../sections-manage.js';
3
- import { TEST_IDS, createMockSection } from '../test-helpers.js';
4
- // Mock the Todoist API
5
- const mockTodoistApi = {
6
- addSection: jest.fn(),
7
- updateSection: jest.fn(),
8
- };
9
- describe('sections-manage tool', () => {
10
- beforeEach(() => {
11
- jest.clearAllMocks();
12
- });
13
- describe('creating a new section', () => {
14
- it('should create a section and return result', async () => {
15
- const mockApiResponse = createMockSection({
16
- id: TEST_IDS.SECTION_1,
17
- projectId: TEST_IDS.PROJECT_TEST,
18
- name: 'test-abc123def456-section',
19
- });
20
- mockTodoistApi.addSection.mockResolvedValue(mockApiResponse);
21
- const result = await sectionsManage.execute({
22
- name: 'test-abc123def456-section',
23
- projectId: TEST_IDS.PROJECT_TEST,
24
- }, mockTodoistApi);
25
- // Verify API was called correctly
26
- expect(mockTodoistApi.addSection).toHaveBeenCalledWith({
27
- name: 'test-abc123def456-section',
28
- projectId: TEST_IDS.PROJECT_TEST,
29
- });
30
- // Verify result matches API response
31
- expect(result).toEqual(mockApiResponse);
32
- });
33
- it('should handle different section properties from API', async () => {
34
- const mockApiResponse = createMockSection({
35
- id: TEST_IDS.SECTION_2,
36
- projectId: 'project-789',
37
- sectionOrder: 2,
38
- name: 'My Section Name',
39
- });
40
- mockTodoistApi.addSection.mockResolvedValue(mockApiResponse);
41
- const result = await sectionsManage.execute({
42
- name: 'My Section Name',
43
- projectId: 'project-789',
44
- }, mockTodoistApi);
45
- expect(mockTodoistApi.addSection).toHaveBeenCalledWith({
46
- name: 'My Section Name',
47
- projectId: 'project-789',
48
- });
49
- expect(result).toEqual(mockApiResponse);
50
- });
51
- it('should return error when projectId is missing for new section', async () => {
52
- const result = await sectionsManage.execute({
53
- name: 'test-section',
54
- }, mockTodoistApi);
55
- // Should not call API when projectId is missing
56
- expect(mockTodoistApi.addSection).not.toHaveBeenCalled();
57
- // Should return error content
58
- expect(result).toEqual({
59
- content: [
60
- {
61
- type: 'text',
62
- text: 'Error: projectId is required when creating a new section (when id is not provided).',
63
- },
64
- ],
65
- isError: true,
66
- });
67
- });
68
- });
69
- describe('updating an existing section', () => {
70
- it('should update a section when id is provided', async () => {
71
- const mockApiResponse = {
72
- id: 'existing-section-123',
73
- projectId: '6cfCcrrCFg2xP94Q',
74
- sectionOrder: 1,
75
- userId: 'test-user',
76
- addedAt: '2024-01-01T00:00:00Z',
77
- updatedAt: '2024-01-01T00:00:00Z',
78
- archivedAt: null,
79
- isArchived: false,
80
- isDeleted: false,
81
- isCollapsed: false,
82
- name: 'Updated Section Name',
83
- };
84
- mockTodoistApi.updateSection.mockResolvedValue(mockApiResponse);
85
- const result = await sectionsManage.execute({
86
- id: 'existing-section-123',
87
- name: 'Updated Section Name',
88
- }, mockTodoistApi);
89
- expect(mockTodoistApi.updateSection).toHaveBeenCalledWith('existing-section-123', {
90
- name: 'Updated Section Name',
91
- });
92
- expect(result).toEqual(mockApiResponse);
93
- });
94
- it('should update section without requiring projectId', async () => {
95
- const mockApiResponse = {
96
- id: 'section-update-test',
97
- projectId: 'original-project-id',
98
- sectionOrder: 3,
99
- userId: 'test-user',
100
- addedAt: '2024-01-01T00:00:00Z',
101
- updatedAt: '2024-01-01T00:00:00Z',
102
- archivedAt: null,
103
- isArchived: false,
104
- isDeleted: false,
105
- isCollapsed: false,
106
- name: 'Section New Name',
107
- };
108
- mockTodoistApi.updateSection.mockResolvedValue(mockApiResponse);
109
- const result = await sectionsManage.execute({
110
- id: 'section-update-test',
111
- name: 'Section New Name',
112
- // Note: projectId not provided for update
113
- }, mockTodoistApi);
114
- expect(mockTodoistApi.updateSection).toHaveBeenCalledWith('section-update-test', {
115
- name: 'Section New Name',
116
- });
117
- expect(result).toEqual(mockApiResponse);
118
- });
119
- });
120
- describe('error handling', () => {
121
- it('should propagate API errors for section creation', async () => {
122
- const apiError = new Error('API Error: Section name is required');
123
- mockTodoistApi.addSection.mockRejectedValue(apiError);
124
- await expect(sectionsManage.execute({
125
- name: '',
126
- projectId: '6cfCcrrCFg2xP94Q',
127
- }, mockTodoistApi)).rejects.toThrow('API Error: Section name is required');
128
- });
129
- it('should propagate API errors for section updates', async () => {
130
- const apiError = new Error('API Error: Section not found');
131
- mockTodoistApi.updateSection.mockRejectedValue(apiError);
132
- await expect(sectionsManage.execute({
133
- id: 'non-existent-section',
134
- name: 'Updated Name',
135
- }, mockTodoistApi)).rejects.toThrow('API Error: Section not found');
136
- });
137
- });
138
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=sections-search.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sections-search.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/sections-search.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tasks-add-multiple.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-add-multiple.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/tasks-add-multiple.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tasks-complete-multiple.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-complete-multiple.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/tasks-complete-multiple.test.ts"],"names":[],"mappings":""}
@@ -1,146 +0,0 @@
1
- import { jest } from '@jest/globals';
2
- import { tasksCompleteMultiple } from '../tasks-complete-multiple.js';
3
- // Mock the Todoist API
4
- const mockTodoistApi = {
5
- closeTask: jest.fn(),
6
- };
7
- describe('tasks-complete-multiple tool', () => {
8
- beforeEach(() => {
9
- jest.clearAllMocks();
10
- });
11
- describe('completing multiple tasks', () => {
12
- it('should complete all tasks successfully', async () => {
13
- mockTodoistApi.closeTask.mockResolvedValue(true);
14
- const result = await tasksCompleteMultiple.execute({ ids: ['task-1', 'task-2', 'task-3'] }, mockTodoistApi);
15
- // Verify API was called for each task
16
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(3);
17
- expect(mockTodoistApi.closeTask).toHaveBeenNthCalledWith(1, 'task-1');
18
- expect(mockTodoistApi.closeTask).toHaveBeenNthCalledWith(2, 'task-2');
19
- expect(mockTodoistApi.closeTask).toHaveBeenNthCalledWith(3, 'task-3');
20
- // Verify all tasks were completed successfully
21
- expect(result).toEqual({
22
- success: true,
23
- completed: ['task-1', 'task-2', 'task-3'],
24
- });
25
- });
26
- it('should complete single task', async () => {
27
- mockTodoistApi.closeTask.mockResolvedValue(true);
28
- const result = await tasksCompleteMultiple.execute({ ids: ['8485093748'] }, mockTodoistApi);
29
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(1);
30
- expect(mockTodoistApi.closeTask).toHaveBeenCalledWith('8485093748');
31
- expect(result).toEqual({
32
- success: true,
33
- completed: ['8485093748'],
34
- });
35
- });
36
- it('should handle partial failures gracefully', async () => {
37
- // Mock first and third tasks to succeed, second to fail
38
- mockTodoistApi.closeTask
39
- .mockResolvedValueOnce(true) // task-1 succeeds
40
- .mockRejectedValueOnce(new Error('Task not found')) // task-2 fails
41
- .mockResolvedValueOnce(true); // task-3 succeeds
42
- const result = await tasksCompleteMultiple.execute({ ids: ['task-1', 'task-2', 'task-3'] }, mockTodoistApi);
43
- // Verify API was called for all tasks despite failure
44
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(3);
45
- expect(mockTodoistApi.closeTask).toHaveBeenNthCalledWith(1, 'task-1');
46
- expect(mockTodoistApi.closeTask).toHaveBeenNthCalledWith(2, 'task-2');
47
- expect(mockTodoistApi.closeTask).toHaveBeenNthCalledWith(3, 'task-3');
48
- // Verify only successful completions are reported
49
- expect(result).toEqual({
50
- success: true,
51
- completed: ['task-1', 'task-3'], // task-2 excluded due to failure
52
- });
53
- });
54
- it('should handle all tasks failing', async () => {
55
- const apiError = new Error('API Error: Network timeout');
56
- mockTodoistApi.closeTask.mockRejectedValue(apiError);
57
- const result = await tasksCompleteMultiple.execute({ ids: ['task-1', 'task-2'] }, mockTodoistApi);
58
- // Verify API was attempted for all tasks
59
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(2);
60
- // Verify no tasks were completed but still returns success
61
- expect(result).toEqual({
62
- success: true,
63
- completed: [], // no tasks completed
64
- });
65
- });
66
- it('should continue processing remaining tasks after failures', async () => {
67
- // Mock various failure scenarios
68
- mockTodoistApi.closeTask
69
- .mockRejectedValueOnce(new Error('Task already completed'))
70
- .mockRejectedValueOnce(new Error('Task not found'))
71
- .mockResolvedValueOnce(true) // task-3 succeeds
72
- .mockRejectedValueOnce(new Error('Permission denied'))
73
- .mockResolvedValueOnce(true); // task-5 succeeds
74
- const result = await tasksCompleteMultiple.execute({ ids: ['task-1', 'task-2', 'task-3', 'task-4', 'task-5'] }, mockTodoistApi);
75
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(5);
76
- // Only tasks 3 and 5 should be in completed list
77
- expect(result).toEqual({
78
- success: true,
79
- completed: ['task-3', 'task-5'],
80
- });
81
- });
82
- it('should handle different types of API errors', async () => {
83
- mockTodoistApi.closeTask
84
- .mockRejectedValueOnce(new Error('Task not found'))
85
- .mockRejectedValueOnce(new Error('Task already completed'))
86
- .mockRejectedValueOnce(new Error('Permission denied'))
87
- .mockRejectedValueOnce(new Error('Rate limit exceeded'));
88
- const result = await tasksCompleteMultiple.execute({ ids: ['not-found', 'already-done', 'no-permission', 'rate-limited'] }, mockTodoistApi);
89
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(4);
90
- // All should fail, but the tool should handle it gracefully
91
- expect(result).toEqual({
92
- success: true,
93
- completed: [],
94
- });
95
- });
96
- });
97
- describe('mixed success and failure scenarios', () => {
98
- it('should handle realistic mixed scenario', async () => {
99
- // Simulate a realistic scenario with some tasks completing and others failing
100
- mockTodoistApi.closeTask
101
- .mockResolvedValueOnce(true) // regular task completion
102
- .mockResolvedValueOnce(true) // another successful completion
103
- .mockRejectedValueOnce(new Error('Task already completed')) // duplicate completion
104
- .mockResolvedValueOnce(true) // successful completion
105
- .mockRejectedValueOnce(new Error('Task not found')); // deleted task
106
- const result = await tasksCompleteMultiple.execute({
107
- ids: [
108
- '8485093748', // regular task
109
- '8485093749', // regular task
110
- '8485093750', // already completed
111
- '8485093751', // regular task
112
- '8485093752', // deleted task
113
- ],
114
- }, mockTodoistApi);
115
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(5);
116
- expect(result).toEqual({
117
- success: true,
118
- completed: ['8485093748', '8485093749', '8485093751'],
119
- });
120
- });
121
- });
122
- describe('edge cases', () => {
123
- it('should handle empty task completion (minimum one task required by schema)', async () => {
124
- // Note: This test documents that the schema requires at least one task,
125
- // so this scenario shouldn't occur in practice due to validation
126
- mockTodoistApi.closeTask.mockResolvedValue(true);
127
- const result = await tasksCompleteMultiple.execute({ ids: ['single-task'] }, mockTodoistApi);
128
- expect(result).toEqual({
129
- success: true,
130
- completed: ['single-task'],
131
- });
132
- });
133
- it('should handle tasks with special ID formats', async () => {
134
- mockTodoistApi.closeTask.mockResolvedValue(true);
135
- const result = await tasksCompleteMultiple.execute({ ids: ['proj_123_task_456', 'task-with-dashes', '1234567890'] }, mockTodoistApi);
136
- expect(mockTodoistApi.closeTask).toHaveBeenCalledTimes(3);
137
- expect(mockTodoistApi.closeTask).toHaveBeenCalledWith('proj_123_task_456');
138
- expect(mockTodoistApi.closeTask).toHaveBeenCalledWith('task-with-dashes');
139
- expect(mockTodoistApi.closeTask).toHaveBeenCalledWith('1234567890');
140
- expect(result).toEqual({
141
- success: true,
142
- completed: ['proj_123_task_456', 'task-with-dashes', '1234567890'],
143
- });
144
- });
145
- });
146
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tasks-list-by-date.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-list-by-date.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/tasks-list-by-date.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tasks-list-completed.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-list-completed.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/tasks-list-completed.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tasks-list-for-container.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-list-for-container.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/tasks-list-for-container.test.ts"],"names":[],"mappings":""}