@doist/todoist-ai 2.2.1 → 3.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 (168) hide show
  1. package/README.md +11 -3
  2. package/dist/index.d.ts +496 -255
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +41 -29
  5. package/dist/mcp-helpers.d.ts +25 -3
  6. package/dist/mcp-helpers.d.ts.map +1 -1
  7. package/dist/mcp-helpers.js +37 -19
  8. package/dist/mcp-server.d.ts.map +1 -1
  9. package/dist/mcp-server.js +32 -28
  10. package/dist/tools/__tests__/add-tasks.test.d.ts +2 -0
  11. package/dist/tools/__tests__/add-tasks.test.d.ts.map +1 -0
  12. package/dist/tools/__tests__/{tasks-add-multiple.test.js → add-tasks.test.js} +85 -81
  13. package/dist/tools/__tests__/complete-tasks.test.d.ts +2 -0
  14. package/dist/tools/__tests__/complete-tasks.test.d.ts.map +1 -0
  15. package/dist/tools/__tests__/complete-tasks.test.js +206 -0
  16. package/dist/tools/__tests__/delete-object.test.d.ts +2 -0
  17. package/dist/tools/__tests__/delete-object.test.d.ts.map +1 -0
  18. package/dist/tools/__tests__/{delete-one.test.js → delete-object.test.js} +42 -22
  19. package/dist/tools/__tests__/find-completed-tasks.test.d.ts +2 -0
  20. package/dist/tools/__tests__/find-completed-tasks.test.d.ts.map +1 -0
  21. package/dist/tools/__tests__/{tasks-list-completed.test.js → find-completed-tasks.test.js} +13 -36
  22. package/dist/tools/__tests__/find-projects.test.d.ts +2 -0
  23. package/dist/tools/__tests__/find-projects.test.d.ts.map +1 -0
  24. package/dist/tools/__tests__/{projects-list.test.js → find-projects.test.js} +55 -39
  25. package/dist/tools/__tests__/find-sections.test.d.ts +2 -0
  26. package/dist/tools/__tests__/find-sections.test.d.ts.map +1 -0
  27. package/dist/tools/__tests__/{sections-search.test.js → find-sections.test.js} +64 -50
  28. package/dist/tools/__tests__/find-tasks-by-date.test.d.ts +2 -0
  29. package/dist/tools/__tests__/find-tasks-by-date.test.d.ts.map +1 -0
  30. package/dist/tools/__tests__/{tasks-list-by-date.test.js → find-tasks-by-date.test.js} +96 -14
  31. package/dist/tools/__tests__/find-tasks.test.d.ts +2 -0
  32. package/dist/tools/__tests__/find-tasks.test.d.ts.map +1 -0
  33. package/dist/tools/__tests__/find-tasks.test.js +334 -0
  34. package/dist/tools/__tests__/get-overview.test.d.ts +2 -0
  35. package/dist/tools/__tests__/get-overview.test.d.ts.map +1 -0
  36. package/dist/tools/__tests__/{overview.test.js → get-overview.test.js} +77 -13
  37. package/dist/tools/__tests__/manage-projects.test.d.ts +2 -0
  38. package/dist/tools/__tests__/manage-projects.test.d.ts.map +1 -0
  39. package/dist/tools/__tests__/{projects-manage.test.js → manage-projects.test.js} +33 -30
  40. package/dist/tools/__tests__/manage-sections.test.d.ts +2 -0
  41. package/dist/tools/__tests__/manage-sections.test.d.ts.map +1 -0
  42. package/dist/tools/__tests__/manage-sections.test.js +162 -0
  43. package/dist/tools/__tests__/update-tasks.test.d.ts +2 -0
  44. package/dist/tools/__tests__/update-tasks.test.d.ts.map +1 -0
  45. package/dist/tools/__tests__/update-tasks.test.js +645 -0
  46. package/dist/tools/{tasks-add-multiple.d.ts → add-tasks.d.ts} +36 -16
  47. package/dist/tools/add-tasks.d.ts.map +1 -0
  48. package/dist/tools/{tasks-add-multiple.js → add-tasks.js} +39 -4
  49. package/dist/tools/complete-tasks.d.ts +40 -0
  50. package/dist/tools/complete-tasks.d.ts.map +1 -0
  51. package/dist/tools/complete-tasks.js +68 -0
  52. package/dist/tools/delete-object.d.ts +38 -0
  53. package/dist/tools/delete-object.d.ts.map +1 -0
  54. package/dist/tools/delete-object.js +69 -0
  55. package/dist/tools/find-completed-tasks.d.ts +74 -0
  56. package/dist/tools/find-completed-tasks.d.ts.map +1 -0
  57. package/dist/tools/find-completed-tasks.js +112 -0
  58. package/dist/tools/find-projects.d.ts +53 -0
  59. package/dist/tools/find-projects.d.ts.map +1 -0
  60. package/dist/tools/find-projects.js +101 -0
  61. package/dist/tools/find-sections.d.ts +42 -0
  62. package/dist/tools/find-sections.d.ts.map +1 -0
  63. package/dist/tools/find-sections.js +96 -0
  64. package/dist/tools/find-tasks-by-date.d.ts +59 -0
  65. package/dist/tools/find-tasks-by-date.d.ts.map +1 -0
  66. package/dist/tools/find-tasks-by-date.js +121 -0
  67. package/dist/tools/find-tasks.d.ts +65 -0
  68. package/dist/tools/find-tasks.d.ts.map +1 -0
  69. package/dist/tools/find-tasks.js +182 -0
  70. package/dist/tools/get-overview.d.ts +67 -0
  71. package/dist/tools/get-overview.d.ts.map +1 -0
  72. package/dist/tools/{overview.js → get-overview.js} +66 -19
  73. package/dist/tools/manage-projects.d.ts +35 -0
  74. package/dist/tools/manage-projects.d.ts.map +1 -0
  75. package/dist/tools/manage-projects.js +63 -0
  76. package/dist/tools/manage-sections.d.ts +38 -0
  77. package/dist/tools/manage-sections.d.ts.map +1 -0
  78. package/dist/tools/manage-sections.js +78 -0
  79. package/dist/tools/update-tasks.d.ts +94 -0
  80. package/dist/tools/update-tasks.d.ts.map +1 -0
  81. package/dist/tools/update-tasks.js +120 -0
  82. package/dist/utils/constants.d.ts +35 -0
  83. package/dist/utils/constants.d.ts.map +1 -0
  84. package/dist/utils/constants.js +37 -0
  85. package/dist/utils/response-builders.d.ts +88 -0
  86. package/dist/utils/response-builders.d.ts.map +1 -0
  87. package/dist/utils/response-builders.js +202 -0
  88. package/dist/{tools → utils}/test-helpers.d.ts +16 -0
  89. package/dist/utils/test-helpers.d.ts.map +1 -0
  90. package/dist/{tools → utils}/test-helpers.js +51 -0
  91. package/dist/utils/tool-names.d.ts +23 -0
  92. package/dist/utils/tool-names.d.ts.map +1 -0
  93. package/dist/utils/tool-names.js +25 -0
  94. package/package.json +2 -2
  95. package/dist/tools/__tests__/delete-one.test.d.ts +0 -2
  96. package/dist/tools/__tests__/delete-one.test.d.ts.map +0 -1
  97. package/dist/tools/__tests__/overview.test.d.ts +0 -2
  98. package/dist/tools/__tests__/overview.test.d.ts.map +0 -1
  99. package/dist/tools/__tests__/projects-list.test.d.ts +0 -2
  100. package/dist/tools/__tests__/projects-list.test.d.ts.map +0 -1
  101. package/dist/tools/__tests__/projects-manage.test.d.ts +0 -2
  102. package/dist/tools/__tests__/projects-manage.test.d.ts.map +0 -1
  103. package/dist/tools/__tests__/sections-manage.test.d.ts +0 -2
  104. package/dist/tools/__tests__/sections-manage.test.d.ts.map +0 -1
  105. package/dist/tools/__tests__/sections-manage.test.js +0 -138
  106. package/dist/tools/__tests__/sections-search.test.d.ts +0 -2
  107. package/dist/tools/__tests__/sections-search.test.d.ts.map +0 -1
  108. package/dist/tools/__tests__/tasks-add-multiple.test.d.ts +0 -2
  109. package/dist/tools/__tests__/tasks-add-multiple.test.d.ts.map +0 -1
  110. package/dist/tools/__tests__/tasks-complete-multiple.test.d.ts +0 -2
  111. package/dist/tools/__tests__/tasks-complete-multiple.test.d.ts.map +0 -1
  112. package/dist/tools/__tests__/tasks-complete-multiple.test.js +0 -146
  113. package/dist/tools/__tests__/tasks-list-by-date.test.d.ts +0 -2
  114. package/dist/tools/__tests__/tasks-list-by-date.test.d.ts.map +0 -1
  115. package/dist/tools/__tests__/tasks-list-completed.test.d.ts +0 -2
  116. package/dist/tools/__tests__/tasks-list-completed.test.d.ts.map +0 -1
  117. package/dist/tools/__tests__/tasks-list-for-container.test.d.ts +0 -2
  118. package/dist/tools/__tests__/tasks-list-for-container.test.d.ts.map +0 -1
  119. package/dist/tools/__tests__/tasks-list-for-container.test.js +0 -232
  120. package/dist/tools/__tests__/tasks-organize-multiple.test.d.ts +0 -2
  121. package/dist/tools/__tests__/tasks-organize-multiple.test.d.ts.map +0 -1
  122. package/dist/tools/__tests__/tasks-organize-multiple.test.js +0 -245
  123. package/dist/tools/__tests__/tasks-search.test.d.ts +0 -2
  124. package/dist/tools/__tests__/tasks-search.test.d.ts.map +0 -1
  125. package/dist/tools/__tests__/tasks-search.test.js +0 -106
  126. package/dist/tools/__tests__/tasks-update-one.test.d.ts +0 -2
  127. package/dist/tools/__tests__/tasks-update-one.test.d.ts.map +0 -1
  128. package/dist/tools/__tests__/tasks-update-one.test.js +0 -251
  129. package/dist/tools/delete-one.d.ts +0 -17
  130. package/dist/tools/delete-one.d.ts.map +0 -1
  131. package/dist/tools/delete-one.js +0 -25
  132. package/dist/tools/overview.d.ts +0 -14
  133. package/dist/tools/overview.d.ts.map +0 -1
  134. package/dist/tools/projects-list.d.ts +0 -29
  135. package/dist/tools/projects-list.d.ts.map +0 -1
  136. package/dist/tools/projects-list.js +0 -39
  137. package/dist/tools/projects-manage.d.ts +0 -24
  138. package/dist/tools/projects-manage.d.ts.map +0 -1
  139. package/dist/tools/projects-manage.js +0 -26
  140. package/dist/tools/sections-manage.d.ts +0 -23
  141. package/dist/tools/sections-manage.d.ts.map +0 -1
  142. package/dist/tools/sections-manage.js +0 -37
  143. package/dist/tools/sections-search.d.ts +0 -18
  144. package/dist/tools/sections-search.d.ts.map +0 -1
  145. package/dist/tools/sections-search.js +0 -27
  146. package/dist/tools/tasks-add-multiple.d.ts.map +0 -1
  147. package/dist/tools/tasks-complete-multiple.d.ts +0 -16
  148. package/dist/tools/tasks-complete-multiple.d.ts.map +0 -1
  149. package/dist/tools/tasks-complete-multiple.js +0 -23
  150. package/dist/tools/tasks-list-by-date.d.ts +0 -34
  151. package/dist/tools/tasks-list-by-date.d.ts.map +0 -1
  152. package/dist/tools/tasks-list-by-date.js +0 -53
  153. package/dist/tools/tasks-list-completed.d.ts +0 -44
  154. package/dist/tools/tasks-list-completed.d.ts.map +0 -1
  155. package/dist/tools/tasks-list-completed.js +0 -49
  156. package/dist/tools/tasks-list-for-container.d.ts +0 -34
  157. package/dist/tools/tasks-list-for-container.d.ts.map +0 -1
  158. package/dist/tools/tasks-list-for-container.js +0 -48
  159. package/dist/tools/tasks-organize-multiple.d.ts +0 -37
  160. package/dist/tools/tasks-organize-multiple.d.ts.map +0 -1
  161. package/dist/tools/tasks-organize-multiple.js +0 -34
  162. package/dist/tools/tasks-search.d.ts +0 -32
  163. package/dist/tools/tasks-search.d.ts.map +0 -1
  164. package/dist/tools/tasks-search.js +0 -30
  165. package/dist/tools/tasks-update-one.d.ts +0 -29
  166. package/dist/tools/tasks-update-one.d.ts.map +0 -1
  167. package/dist/tools/tasks-update-one.js +0 -63
  168. package/dist/tools/test-helpers.d.ts.map +0 -1
@@ -0,0 +1,162 @@
1
+ import { jest } from '@jest/globals';
2
+ import { TEST_IDS, createMockSection, extractStructuredContent, extractTextContent, } from '../../utils/test-helpers.js';
3
+ import { ToolNames } from '../../utils/tool-names.js';
4
+ import { manageSections } from '../manage-sections.js';
5
+ // Mock the Todoist API
6
+ const mockTodoistApi = {
7
+ addSection: jest.fn(),
8
+ updateSection: jest.fn(),
9
+ };
10
+ const { ADD_TASKS, MANAGE_SECTIONS, FIND_TASKS } = ToolNames;
11
+ describe(`${MANAGE_SECTIONS} tool`, () => {
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ });
15
+ describe('creating a new section', () => {
16
+ it('should create a section and return result', async () => {
17
+ const mockApiResponse = createMockSection({
18
+ id: TEST_IDS.SECTION_1,
19
+ projectId: TEST_IDS.PROJECT_TEST,
20
+ name: 'test-abc123def456-section',
21
+ });
22
+ mockTodoistApi.addSection.mockResolvedValue(mockApiResponse);
23
+ const result = await manageSections.execute({ name: 'test-abc123def456-section', projectId: TEST_IDS.PROJECT_TEST }, mockTodoistApi);
24
+ expect(mockTodoistApi.addSection).toHaveBeenCalledWith({
25
+ name: 'test-abc123def456-section',
26
+ projectId: TEST_IDS.PROJECT_TEST,
27
+ });
28
+ const textContent = extractTextContent(result);
29
+ expect(textContent).toMatchSnapshot();
30
+ expect(textContent).toContain('Created section: test-abc123def456-section');
31
+ expect(textContent).toContain(`id=${TEST_IDS.SECTION_1}`);
32
+ expect(textContent).toContain(`Use ${FIND_TASKS} with sectionId`);
33
+ // Verify structured content
34
+ const structuredContent = extractStructuredContent(result);
35
+ expect(structuredContent).toEqual(expect.objectContaining({
36
+ section: expect.objectContaining({
37
+ id: TEST_IDS.SECTION_1,
38
+ name: 'test-abc123def456-section',
39
+ }),
40
+ operation: 'created',
41
+ }));
42
+ });
43
+ it('should handle different section properties from API', async () => {
44
+ const mockApiResponse = createMockSection({
45
+ id: TEST_IDS.SECTION_2,
46
+ projectId: 'project-789',
47
+ sectionOrder: 2,
48
+ name: 'My Section Name',
49
+ });
50
+ mockTodoistApi.addSection.mockResolvedValue(mockApiResponse);
51
+ const result = await manageSections.execute({ name: 'My Section Name', projectId: 'project-789' }, mockTodoistApi);
52
+ expect(mockTodoistApi.addSection).toHaveBeenCalledWith({
53
+ name: 'My Section Name',
54
+ projectId: 'project-789',
55
+ });
56
+ const textContent = extractTextContent(result);
57
+ expect(textContent).toMatchSnapshot();
58
+ expect(textContent).toContain('Created section: My Section Name');
59
+ expect(textContent).toContain(`id=${TEST_IDS.SECTION_2}`);
60
+ expect(textContent).toContain(`Use ${ADD_TASKS} with sectionId`);
61
+ // Verify structured content
62
+ const structuredContent = extractStructuredContent(result);
63
+ expect(structuredContent).toEqual(expect.objectContaining({
64
+ section: expect.objectContaining({
65
+ id: TEST_IDS.SECTION_2,
66
+ name: 'My Section Name',
67
+ }),
68
+ operation: 'created',
69
+ }));
70
+ });
71
+ it('should throw error when projectId is missing for new section', async () => {
72
+ await expect(manageSections.execute({ name: 'test-section' }, mockTodoistApi)).rejects.toThrow('Error: projectId is required when creating a new section (when id is not provided).');
73
+ expect(mockTodoistApi.addSection).not.toHaveBeenCalled();
74
+ });
75
+ });
76
+ describe('updating an existing section', () => {
77
+ it('should update a section when id is provided', async () => {
78
+ const mockApiResponse = {
79
+ id: 'existing-section-123',
80
+ projectId: '6cfCcrrCFg2xP94Q',
81
+ sectionOrder: 1,
82
+ userId: 'test-user',
83
+ addedAt: '2024-01-01T00:00:00Z',
84
+ updatedAt: '2024-01-01T00:00:00Z',
85
+ archivedAt: null,
86
+ isArchived: false,
87
+ isDeleted: false,
88
+ isCollapsed: false,
89
+ name: 'Updated Section Name',
90
+ };
91
+ mockTodoistApi.updateSection.mockResolvedValue(mockApiResponse);
92
+ const result = await manageSections.execute({ id: 'existing-section-123', name: 'Updated Section Name' }, mockTodoistApi);
93
+ expect(mockTodoistApi.updateSection).toHaveBeenCalledWith('existing-section-123', {
94
+ name: 'Updated Section Name',
95
+ });
96
+ const textContent = extractTextContent(result);
97
+ expect(textContent).toMatchSnapshot();
98
+ expect(textContent).toContain('Updated section: Updated Section Name');
99
+ expect(textContent).toContain('id=existing-section-123');
100
+ expect(textContent).toContain(`Use ${FIND_TASKS} with sectionId`);
101
+ // Verify structured content
102
+ const structuredContent = extractStructuredContent(result);
103
+ expect(structuredContent).toEqual(expect.objectContaining({
104
+ section: expect.objectContaining({
105
+ id: 'existing-section-123',
106
+ name: 'Updated Section Name',
107
+ }),
108
+ operation: 'updated',
109
+ }));
110
+ });
111
+ it('should update section without requiring projectId', async () => {
112
+ const mockApiResponse = {
113
+ id: 'section-update-test',
114
+ projectId: 'original-project-id',
115
+ sectionOrder: 3,
116
+ userId: 'test-user',
117
+ addedAt: '2024-01-01T00:00:00Z',
118
+ updatedAt: '2024-01-01T00:00:00Z',
119
+ archivedAt: null,
120
+ isArchived: false,
121
+ isDeleted: false,
122
+ isCollapsed: false,
123
+ name: 'Section New Name',
124
+ };
125
+ mockTodoistApi.updateSection.mockResolvedValue(mockApiResponse);
126
+ const result = await manageSections.execute({
127
+ id: 'section-update-test',
128
+ name: 'Section New Name',
129
+ // Note: projectId not provided for update
130
+ }, mockTodoistApi);
131
+ expect(mockTodoistApi.updateSection).toHaveBeenCalledWith('section-update-test', {
132
+ name: 'Section New Name',
133
+ });
134
+ const textContent = extractTextContent(result);
135
+ expect(textContent).toMatchSnapshot();
136
+ expect(textContent).toContain('Updated section: Section New Name');
137
+ expect(textContent).toContain('id=section-update-test');
138
+ expect(textContent).toContain(`Use ${FIND_TASKS} with sectionId`);
139
+ // Verify structured content
140
+ const structuredContent = extractStructuredContent(result);
141
+ expect(structuredContent).toEqual(expect.objectContaining({
142
+ section: expect.objectContaining({
143
+ id: 'section-update-test',
144
+ name: 'Section New Name',
145
+ }),
146
+ operation: 'updated',
147
+ }));
148
+ });
149
+ });
150
+ describe('error handling', () => {
151
+ it('should propagate API errors for section creation', async () => {
152
+ const apiError = new Error('API Error: Section name is required');
153
+ mockTodoistApi.addSection.mockRejectedValue(apiError);
154
+ await expect(manageSections.execute({ name: '', projectId: '6cfCcrrCFg2xP94Q' }, mockTodoistApi)).rejects.toThrow('API Error: Section name is required');
155
+ });
156
+ it('should propagate API errors for section updates', async () => {
157
+ const apiError = new Error('API Error: Section not found');
158
+ mockTodoistApi.updateSection.mockRejectedValue(apiError);
159
+ await expect(manageSections.execute({ id: 'non-existent-section', name: 'Updated Name' }, mockTodoistApi)).rejects.toThrow('API Error: Section not found');
160
+ });
161
+ });
162
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=update-tasks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-tasks.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/update-tasks.test.ts"],"names":[],"mappings":""}