@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.
- package/dist/__tests__/api.test.d.ts +12 -0
- package/dist/__tests__/api.test.d.ts.map +1 -0
- package/dist/__tests__/api.test.js +157 -0
- package/dist/__tests__/api.test.js.map +1 -0
- package/dist/__tests__/e2e/mcp-protocol.test.d.ts +8 -0
- package/dist/__tests__/e2e/mcp-protocol.test.d.ts.map +1 -0
- package/dist/__tests__/e2e/mcp-protocol.test.js +201 -0
- package/dist/__tests__/e2e/mcp-protocol.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +8 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +24 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/tools/features.test.d.ts +5 -0
- package/dist/__tests__/tools/features.test.d.ts.map +1 -0
- package/dist/__tests__/tools/features.test.js +119 -0
- package/dist/__tests__/tools/features.test.js.map +1 -0
- package/dist/__tests__/tools/projects.test.d.ts +7 -0
- package/dist/__tests__/tools/projects.test.d.ts.map +1 -0
- package/dist/__tests__/tools/projects.test.js +153 -0
- package/dist/__tests__/tools/projects.test.js.map +1 -0
- package/dist/__tests__/tools/sprints.test.d.ts +5 -0
- package/dist/__tests__/tools/sprints.test.d.ts.map +1 -0
- package/dist/__tests__/tools/sprints.test.js +125 -0
- package/dist/__tests__/tools/sprints.test.js.map +1 -0
- package/dist/__tests__/tools/tasks.test.d.ts +7 -0
- package/dist/__tests__/tools/tasks.test.d.ts.map +1 -0
- package/dist/__tests__/tools/tasks.test.js +214 -0
- package/dist/__tests__/tools/tasks.test.js.map +1 -0
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -85
- package/dist/index.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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"}
|