@cube8021/taskforge-mcp 1.0.0 → 1.0.1

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 (33) hide show
  1. package/dist/__tests__/api.test.d.ts +12 -0
  2. package/dist/__tests__/api.test.d.ts.map +1 -0
  3. package/dist/__tests__/api.test.js +157 -0
  4. package/dist/__tests__/api.test.js.map +1 -0
  5. package/dist/__tests__/e2e/mcp-protocol.test.d.ts +8 -0
  6. package/dist/__tests__/e2e/mcp-protocol.test.d.ts.map +1 -0
  7. package/dist/__tests__/e2e/mcp-protocol.test.js +201 -0
  8. package/dist/__tests__/e2e/mcp-protocol.test.js.map +1 -0
  9. package/dist/__tests__/setup.d.ts +8 -0
  10. package/dist/__tests__/setup.d.ts.map +1 -0
  11. package/dist/__tests__/setup.js +24 -0
  12. package/dist/__tests__/setup.js.map +1 -0
  13. package/dist/__tests__/tools/features.test.d.ts +5 -0
  14. package/dist/__tests__/tools/features.test.d.ts.map +1 -0
  15. package/dist/__tests__/tools/features.test.js +119 -0
  16. package/dist/__tests__/tools/features.test.js.map +1 -0
  17. package/dist/__tests__/tools/projects.test.d.ts +7 -0
  18. package/dist/__tests__/tools/projects.test.d.ts.map +1 -0
  19. package/dist/__tests__/tools/projects.test.js +153 -0
  20. package/dist/__tests__/tools/projects.test.js.map +1 -0
  21. package/dist/__tests__/tools/sprints.test.d.ts +5 -0
  22. package/dist/__tests__/tools/sprints.test.d.ts.map +1 -0
  23. package/dist/__tests__/tools/sprints.test.js +125 -0
  24. package/dist/__tests__/tools/sprints.test.js.map +1 -0
  25. package/dist/__tests__/tools/tasks.test.d.ts +7 -0
  26. package/dist/__tests__/tools/tasks.test.d.ts.map +1 -0
  27. package/dist/__tests__/tools/tasks.test.js +214 -0
  28. package/dist/__tests__/tools/tasks.test.js.map +1 -0
  29. package/dist/index.d.ts +16 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +115 -85
  32. package/dist/index.js.map +1 -1
  33. package/package.json +11 -3
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Unit tests for Project-related API requests
3
+ *
4
+ * Tests the API request patterns used by project tools
5
+ */
6
+ import { describe, it, expect, beforeEach } from 'vitest';
7
+ import { fetchMocker } from '../setup.js';
8
+ import { apiRequest } from '../../index.js';
9
+ describe('Project API Requests', () => {
10
+ beforeEach(() => {
11
+ fetchMocker.resetMocks();
12
+ });
13
+ describe('createProject', () => {
14
+ it('should POST to /api/v1/projects with correct body', async () => {
15
+ const mockResponse = {
16
+ data: { id: 1, name: 'Test Project', status: 'active' },
17
+ };
18
+ fetchMocker.mockResponseOnce(JSON.stringify(mockResponse));
19
+ const result = await apiRequest('POST', '/api/v1/projects', {
20
+ name: 'Test Project',
21
+ description: 'A test project',
22
+ status: 'active',
23
+ });
24
+ expect(result).toEqual(mockResponse);
25
+ const [url, options] = fetchMocker.mock.calls[0];
26
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/projects');
27
+ expect(options?.method).toBe('POST');
28
+ expect(JSON.parse(options?.body)).toEqual({
29
+ name: 'Test Project',
30
+ description: 'A test project',
31
+ status: 'active',
32
+ });
33
+ });
34
+ it('should handle optional fields', async () => {
35
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: { id: 1, name: 'Minimal' } }));
36
+ await apiRequest('POST', '/api/v1/projects', { name: 'Minimal' });
37
+ const [, options] = fetchMocker.mock.calls[0];
38
+ expect(JSON.parse(options?.body)).toEqual({ name: 'Minimal' });
39
+ });
40
+ });
41
+ describe('listProjects', () => {
42
+ it('should GET /api/v1/projects with query params', async () => {
43
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [], total: 0 }));
44
+ await apiRequest('GET', '/api/v1/projects', undefined, {
45
+ status: 'active',
46
+ limit: 10,
47
+ offset: 0,
48
+ });
49
+ const [url] = fetchMocker.mock.calls[0];
50
+ expect(url).toContain('/api/v1/projects');
51
+ expect(url).toContain('status=active');
52
+ expect(url).toContain('limit=10');
53
+ expect(url).toContain('offset=0');
54
+ });
55
+ it('should handle pagination correctly', async () => {
56
+ const page1 = { data: [{ id: 1 }, { id: 2 }], total: 5 };
57
+ const page2 = { data: [{ id: 3 }, { id: 4 }], total: 5 };
58
+ fetchMocker.mockResponseOnce(JSON.stringify(page1));
59
+ fetchMocker.mockResponseOnce(JSON.stringify(page2));
60
+ const result1 = await apiRequest('GET', '/api/v1/projects', undefined, {
61
+ limit: 2,
62
+ offset: 0,
63
+ });
64
+ const result2 = await apiRequest('GET', '/api/v1/projects', undefined, {
65
+ limit: 2,
66
+ offset: 2,
67
+ });
68
+ expect(result1).toEqual(page1);
69
+ expect(result2).toEqual(page2);
70
+ });
71
+ });
72
+ describe('getProject', () => {
73
+ it('should GET /api/v1/projects/:id', async () => {
74
+ const mockProject = {
75
+ data: {
76
+ id: 42,
77
+ name: 'My Project',
78
+ description: 'Description',
79
+ status: 'active',
80
+ },
81
+ };
82
+ fetchMocker.mockResponseOnce(JSON.stringify(mockProject));
83
+ const result = await apiRequest('GET', '/api/v1/projects/42');
84
+ expect(result).toEqual(mockProject);
85
+ expect(fetchMocker.mock.calls[0][0]).toBe('https://test-api.taskforge.local/api/v1/projects/42');
86
+ });
87
+ it('should throw on non-existent project', async () => {
88
+ fetchMocker.mockResponseOnce(JSON.stringify({ error: 'Project not found' }), { status: 404 });
89
+ await expect(apiRequest('GET', '/api/v1/projects/999')).rejects.toThrow('Project not found');
90
+ });
91
+ });
92
+ describe('updateProject', () => {
93
+ it('should PUT to /api/v1/projects/:id with updates', async () => {
94
+ const mockResponse = {
95
+ data: { id: 1, name: 'Updated Name', status: 'completed' },
96
+ };
97
+ fetchMocker.mockResponseOnce(JSON.stringify(mockResponse));
98
+ await apiRequest('PUT', '/api/v1/projects/1', {
99
+ name: 'Updated Name',
100
+ status: 'completed',
101
+ });
102
+ const [url, options] = fetchMocker.mock.calls[0];
103
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/projects/1');
104
+ expect(options?.method).toBe('PUT');
105
+ expect(JSON.parse(options?.body)).toEqual({
106
+ name: 'Updated Name',
107
+ status: 'completed',
108
+ });
109
+ });
110
+ });
111
+ describe('archiveProject', () => {
112
+ it('should DELETE /api/v1/projects/:id', async () => {
113
+ fetchMocker.mockResponseOnce(JSON.stringify({ message: 'Project archived' }));
114
+ await apiRequest('DELETE', '/api/v1/projects/1');
115
+ const [url, options] = fetchMocker.mock.calls[0];
116
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/projects/1');
117
+ expect(options?.method).toBe('DELETE');
118
+ });
119
+ });
120
+ describe('getProjectStatus', () => {
121
+ it('should GET /api/v1/projects/:id/status', async () => {
122
+ const mockStatus = {
123
+ data: {
124
+ project_id: 1,
125
+ total_tasks: 10,
126
+ completed_tasks: 5,
127
+ completion_percentage: 50,
128
+ blocked_tasks: 2,
129
+ },
130
+ };
131
+ fetchMocker.mockResponseOnce(JSON.stringify(mockStatus));
132
+ const result = await apiRequest('GET', '/api/v1/projects/1/status');
133
+ expect(result).toEqual(mockStatus);
134
+ expect(fetchMocker.mock.calls[0][0]).toBe('https://test-api.taskforge.local/api/v1/projects/1/status');
135
+ });
136
+ });
137
+ describe('createSubProject', () => {
138
+ it('should POST to /api/v1/projects/:parentId/subprojects', async () => {
139
+ const mockResponse = {
140
+ data: { id: 2, name: 'Sub Project', parent_id: 1 },
141
+ };
142
+ fetchMocker.mockResponseOnce(JSON.stringify(mockResponse));
143
+ await apiRequest('POST', '/api/v1/projects/1/subprojects', {
144
+ name: 'Sub Project',
145
+ description: 'A sub-project',
146
+ });
147
+ const [url, options] = fetchMocker.mock.calls[0];
148
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/projects/1/subprojects');
149
+ expect(options?.method).toBe('POST');
150
+ });
151
+ });
152
+ });
153
+ //# sourceMappingURL=projects.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/projects.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Unit tests for Sprint-related API requests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=sprints.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprints.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/sprints.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Unit tests for Sprint-related API requests
3
+ */
4
+ import { describe, it, expect, beforeEach } from 'vitest';
5
+ import { fetchMocker } from '../setup.js';
6
+ import { apiRequest } from '../../index.js';
7
+ describe('Sprint API Requests', () => {
8
+ beforeEach(() => {
9
+ fetchMocker.resetMocks();
10
+ });
11
+ describe('createSprint', () => {
12
+ it('should POST to /api/v1/sprints', async () => {
13
+ const mockResponse = {
14
+ data: { id: 1, name: 'Sprint 1', project_id: 1 },
15
+ };
16
+ fetchMocker.mockResponseOnce(JSON.stringify(mockResponse));
17
+ await apiRequest('POST', '/api/v1/sprints', {
18
+ project_id: 1,
19
+ name: 'Sprint 1',
20
+ status: 'planned',
21
+ start_date: '2024-01-01',
22
+ end_date: '2024-01-14',
23
+ });
24
+ const [url, options] = fetchMocker.mock.calls[0];
25
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/sprints');
26
+ expect(options?.method).toBe('POST');
27
+ const body = JSON.parse(options?.body);
28
+ expect(body.project_id).toBe(1);
29
+ expect(body.name).toBe('Sprint 1');
30
+ expect(body.start_date).toBe('2024-01-01');
31
+ });
32
+ });
33
+ describe('listSprints', () => {
34
+ it('should GET /api/v1/sprints with filters', async () => {
35
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [], total: 0 }));
36
+ await apiRequest('GET', '/api/v1/sprints', undefined, {
37
+ project_id: 1,
38
+ status: 'active',
39
+ limit: 10,
40
+ });
41
+ const url = fetchMocker.mock.calls[0][0];
42
+ expect(url).toContain('project_id=1');
43
+ expect(url).toContain('status=active');
44
+ });
45
+ it('should support all sprint status values', async () => {
46
+ const statuses = ['planned', 'active', 'completed'];
47
+ for (const status of statuses) {
48
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [] }));
49
+ await apiRequest('GET', '/api/v1/sprints', undefined, {
50
+ project_id: 1,
51
+ status,
52
+ });
53
+ expect(fetchMocker.mock.calls[fetchMocker.mock.calls.length - 1][0]).toContain(`status=${status}`);
54
+ }
55
+ });
56
+ });
57
+ describe('getSprint', () => {
58
+ it('should GET /api/v1/sprints/:id', async () => {
59
+ const mockSprint = {
60
+ data: {
61
+ id: 1,
62
+ name: 'Sprint 1',
63
+ status: 'active',
64
+ start_date: '2024-01-01',
65
+ end_date: '2024-01-14',
66
+ },
67
+ };
68
+ fetchMocker.mockResponseOnce(JSON.stringify(mockSprint));
69
+ const result = await apiRequest('GET', '/api/v1/sprints/1');
70
+ expect(result).toEqual(mockSprint);
71
+ });
72
+ });
73
+ describe('updateSprint', () => {
74
+ it('should PUT to /api/v1/sprints/:id', async () => {
75
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: { id: 1, status: 'active' } }));
76
+ await apiRequest('PUT', '/api/v1/sprints/1', {
77
+ status: 'active',
78
+ name: 'Sprint 1 (Active)',
79
+ });
80
+ const [url, options] = fetchMocker.mock.calls[0];
81
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/sprints/1');
82
+ expect(options?.method).toBe('PUT');
83
+ });
84
+ it('should update dates', async () => {
85
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: { id: 1 } }));
86
+ await apiRequest('PUT', '/api/v1/sprints/1', {
87
+ start_date: '2024-01-08',
88
+ end_date: '2024-01-21',
89
+ });
90
+ const body = JSON.parse(fetchMocker.mock.calls[0][1]?.body);
91
+ expect(body.start_date).toBe('2024-01-08');
92
+ expect(body.end_date).toBe('2024-01-21');
93
+ });
94
+ });
95
+ describe('deleteSprint', () => {
96
+ it('should DELETE /api/v1/sprints/:id', async () => {
97
+ fetchMocker.mockResponseOnce(JSON.stringify({ message: 'Deleted' }));
98
+ await apiRequest('DELETE', '/api/v1/sprints/1');
99
+ const [url, options] = fetchMocker.mock.calls[0];
100
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/sprints/1');
101
+ expect(options?.method).toBe('DELETE');
102
+ });
103
+ });
104
+ describe('getCurrentSprint', () => {
105
+ it('should GET /api/v1/projects/:projectId/current-sprint', async () => {
106
+ const mockSprint = {
107
+ data: {
108
+ id: 2,
109
+ name: 'Current Sprint',
110
+ status: 'active',
111
+ },
112
+ };
113
+ fetchMocker.mockResponseOnce(JSON.stringify(mockSprint));
114
+ const result = await apiRequest('GET', '/api/v1/projects/1/current-sprint');
115
+ expect(result).toEqual(mockSprint);
116
+ expect(fetchMocker.mock.calls[0][0]).toContain('/api/v1/projects/1/current-sprint');
117
+ });
118
+ it('should return null when no active sprint', async () => {
119
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: null, message: 'No active sprint' }));
120
+ const result = await apiRequest('GET', '/api/v1/projects/1/current-sprint');
121
+ expect(result).toEqual({ data: null, message: 'No active sprint' });
122
+ });
123
+ });
124
+ });
125
+ //# sourceMappingURL=sprints.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprints.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/sprints.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for Task-related API requests
3
+ *
4
+ * Tests the API request patterns used by task tools
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=tasks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/tasks.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Unit tests for Task-related API requests
3
+ *
4
+ * Tests the API request patterns used by task tools
5
+ */
6
+ import { describe, it, expect, beforeEach } from 'vitest';
7
+ import { fetchMocker } from '../setup.js';
8
+ import { apiRequest } from '../../index.js';
9
+ describe('Task API Requests', () => {
10
+ beforeEach(() => {
11
+ fetchMocker.resetMocks();
12
+ });
13
+ describe('createTask', () => {
14
+ it('should POST to /api/v1/tasks with correct body', async () => {
15
+ const mockResponse = {
16
+ data: { id: 1, name: 'New Task', project_id: 1 },
17
+ };
18
+ fetchMocker.mockResponseOnce(JSON.stringify(mockResponse));
19
+ await apiRequest('POST', '/api/v1/tasks', {
20
+ project_id: 1,
21
+ name: 'New Task',
22
+ description: 'Task description',
23
+ status: 'todo',
24
+ priority: 'high',
25
+ });
26
+ const [url, options] = fetchMocker.mock.calls[0];
27
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/tasks');
28
+ expect(options?.method).toBe('POST');
29
+ const body = JSON.parse(options?.body);
30
+ expect(body.project_id).toBe(1);
31
+ expect(body.name).toBe('New Task');
32
+ expect(body.priority).toBe('high');
33
+ });
34
+ it('should handle all optional fields', async () => {
35
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: { id: 1 } }));
36
+ await apiRequest('POST', '/api/v1/tasks', {
37
+ project_id: 1,
38
+ name: 'Full Task',
39
+ feature_id: 2,
40
+ sprint_id: 3,
41
+ estimated_hours: 4,
42
+ assignee: 'user@example.com',
43
+ parent_task_id: 5,
44
+ });
45
+ const body = JSON.parse(fetchMocker.mock.calls[0][1]?.body);
46
+ expect(body.feature_id).toBe(2);
47
+ expect(body.sprint_id).toBe(3);
48
+ expect(body.estimated_hours).toBe(4);
49
+ expect(body.assignee).toBe('user@example.com');
50
+ expect(body.parent_task_id).toBe(5);
51
+ });
52
+ });
53
+ describe('getTasks', () => {
54
+ it('should GET /api/v1/tasks with filters', async () => {
55
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [], total: 0 }));
56
+ await apiRequest('GET', '/api/v1/tasks', undefined, {
57
+ project_id: 1,
58
+ status: 'in_progress',
59
+ priority: 'high',
60
+ assignee: 'user@example.com',
61
+ });
62
+ const url = fetchMocker.mock.calls[0][0];
63
+ expect(url).toContain('project_id=1');
64
+ expect(url).toContain('status=in_progress');
65
+ expect(url).toContain('priority=high');
66
+ expect(url).toContain('assignee=user%40example.com');
67
+ });
68
+ it('should support all task status values', async () => {
69
+ const statuses = ['todo', 'planned', 'in_progress', 'done', 'blocked'];
70
+ for (const status of statuses) {
71
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [] }));
72
+ await apiRequest('GET', '/api/v1/tasks', undefined, { status });
73
+ expect(fetchMocker.mock.calls[fetchMocker.mock.calls.length - 1][0]).toContain(`status=${status}`);
74
+ }
75
+ });
76
+ });
77
+ describe('getTask', () => {
78
+ it('should GET /api/v1/tasks/:id', async () => {
79
+ const mockTask = {
80
+ data: {
81
+ id: 42,
82
+ name: 'Task',
83
+ project_id: 1,
84
+ status: 'todo',
85
+ priority: 'medium',
86
+ },
87
+ };
88
+ fetchMocker.mockResponseOnce(JSON.stringify(mockTask));
89
+ const result = await apiRequest('GET', '/api/v1/tasks/42');
90
+ expect(result).toEqual(mockTask);
91
+ });
92
+ });
93
+ describe('updateTask', () => {
94
+ it('should PUT to /api/v1/tasks/:id', async () => {
95
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: { id: 1, status: 'done' } }));
96
+ await apiRequest('PUT', '/api/v1/tasks/1', {
97
+ status: 'done',
98
+ actual_hours: 5,
99
+ outcome: 'Task completed successfully',
100
+ });
101
+ const [url, options] = fetchMocker.mock.calls[0];
102
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/tasks/1');
103
+ expect(options?.method).toBe('PUT');
104
+ const body = JSON.parse(options?.body);
105
+ expect(body.status).toBe('done');
106
+ expect(body.actual_hours).toBe(5);
107
+ expect(body.outcome).toBe('Task completed successfully');
108
+ });
109
+ });
110
+ describe('deleteTask', () => {
111
+ it('should DELETE /api/v1/tasks/:id', async () => {
112
+ fetchMocker.mockResponseOnce(JSON.stringify({ message: 'Deleted' }));
113
+ await apiRequest('DELETE', '/api/v1/tasks/1');
114
+ const [url, options] = fetchMocker.mock.calls[0];
115
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/tasks/1');
116
+ expect(options?.method).toBe('DELETE');
117
+ });
118
+ });
119
+ describe('dependencies', () => {
120
+ it('should POST to add dependency', async () => {
121
+ fetchMocker.mockResponseOnce(JSON.stringify({ message: 'Added' }));
122
+ await apiRequest('POST', '/api/v1/tasks/dependencies/add', {
123
+ task_id: 1,
124
+ depends_on_task_id: 2,
125
+ });
126
+ const body = JSON.parse(fetchMocker.mock.calls[0][1]?.body);
127
+ expect(body.task_id).toBe(1);
128
+ expect(body.depends_on_task_id).toBe(2);
129
+ });
130
+ it('should POST to remove dependency', async () => {
131
+ fetchMocker.mockResponseOnce(JSON.stringify({ message: 'Removed' }));
132
+ await apiRequest('POST', '/api/v1/tasks/dependencies/remove', {
133
+ task_id: 1,
134
+ depends_on_task_id: 2,
135
+ });
136
+ const [url] = fetchMocker.mock.calls[0];
137
+ expect(url).toContain('/api/v1/tasks/dependencies/remove');
138
+ });
139
+ it('should POST to set all dependencies', async () => {
140
+ fetchMocker.mockResponseOnce(JSON.stringify({ message: 'Set' }));
141
+ await apiRequest('POST', '/api/v1/tasks/dependencies/set', {
142
+ task_id: 1,
143
+ depends_on_task_ids: [2, 3, 4],
144
+ });
145
+ const body = JSON.parse(fetchMocker.mock.calls[0][1]?.body);
146
+ expect(body.depends_on_task_ids).toEqual([2, 3, 4]);
147
+ });
148
+ });
149
+ describe('getReadyTasks', () => {
150
+ it('should GET /api/v1/tasks/ready with filters', async () => {
151
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [] }));
152
+ await apiRequest('GET', '/api/v1/tasks/ready', undefined, {
153
+ project_id: 1,
154
+ feature_id: 2,
155
+ sprint_id: 3,
156
+ });
157
+ const url = fetchMocker.mock.calls[0][0];
158
+ expect(url).toContain('/api/v1/tasks/ready');
159
+ expect(url).toContain('project_id=1');
160
+ });
161
+ });
162
+ describe('planTask', () => {
163
+ it('should POST to /api/v1/tasks/:id/plan', async () => {
164
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: { id: 1, status: 'planned' } }));
165
+ await apiRequest('POST', '/api/v1/tasks/1/plan', {
166
+ design_approach: 'RESTful API design',
167
+ plan: '1. Create handler\n2. Add validation',
168
+ files_affected: ['src/api.ts', 'src/routes.ts'],
169
+ success_criteria: '- [ ] Tests pass\n- [ ] API responds',
170
+ });
171
+ const [url, options] = fetchMocker.mock.calls[0];
172
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/tasks/1/plan');
173
+ expect(options?.method).toBe('POST');
174
+ const body = JSON.parse(options?.body);
175
+ expect(body.design_approach).toBe('RESTful API design');
176
+ expect(body.files_affected).toEqual(['src/api.ts', 'src/routes.ts']);
177
+ });
178
+ });
179
+ describe('getUnplannedTasks', () => {
180
+ it('should GET /api/v1/tasks/unplanned', async () => {
181
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [{ id: 1, status: 'todo' }] }));
182
+ await apiRequest('GET', '/api/v1/tasks/unplanned', undefined, {
183
+ project_id: 1,
184
+ });
185
+ const url = fetchMocker.mock.calls[0][0];
186
+ expect(url).toContain('/api/v1/tasks/unplanned');
187
+ expect(url).toContain('project_id=1');
188
+ });
189
+ });
190
+ describe('getPlannedTasks', () => {
191
+ it('should GET /api/v1/tasks/planned', async () => {
192
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: [{ id: 1, status: 'planned' }] }));
193
+ await apiRequest('GET', '/api/v1/tasks/planned', undefined, {
194
+ project_id: 1,
195
+ });
196
+ const url = fetchMocker.mock.calls[0][0];
197
+ expect(url).toContain('/api/v1/tasks/planned');
198
+ });
199
+ });
200
+ describe('createSubtask', () => {
201
+ it('should POST to /api/v1/tasks/:parentId/subtasks', async () => {
202
+ fetchMocker.mockResponseOnce(JSON.stringify({ data: { id: 2, parent_task_id: 1 } }));
203
+ await apiRequest('POST', '/api/v1/tasks/1/subtasks', {
204
+ name: 'Subtask',
205
+ priority: 'high',
206
+ estimated_hours: 2,
207
+ });
208
+ const [url, options] = fetchMocker.mock.calls[0];
209
+ expect(url).toBe('https://test-api.taskforge.local/api/v1/tasks/1/subtasks');
210
+ expect(options?.method).toBe('POST');
211
+ });
212
+ });
213
+ });
214
+ //# sourceMappingURL=tasks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/tasks.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,5 +5,20 @@
5
5
  * A Model Context Protocol server that wraps the TaskForge HTTP API.
6
6
  * This allows Claude Code to interact with TaskForge through the standard MCP interface.
7
7
  */
8
- export {};
8
+ export declare const getConfig: () => {
9
+ API_URL: string;
10
+ API_TOKEN: string | undefined;
11
+ };
12
+ export interface ApiResponse<T = unknown> {
13
+ data?: T;
14
+ error?: string;
15
+ message?: string;
16
+ }
17
+ export declare function apiRequest<T = unknown>(method: string, path: string, body?: unknown, queryParams?: Record<string, string | number | undefined>): Promise<T>;
18
+ export declare function mcpResponse(data: unknown): {
19
+ content: Array<{
20
+ type: "text";
21
+ text: string;
22
+ }>;
23
+ };
9
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAUH,eAAO,MAAM,SAAS;;;CAGpB,CAAC;AA0BH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,UAAU,CAAC,CAAC,GAAG,OAAO,EAC1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GACxD,OAAO,CAAC,CAAC,CAAC,CA4CZ;AAGD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAI7F"}