@qase/mcp-server 1.0.0-beta.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/CHANGELOG.md +165 -0
- package/README.md +450 -0
- package/build/client/index.d.ts +23 -0
- package/build/client/index.d.ts.map +1 -0
- package/build/client/index.js +55 -0
- package/build/client/index.js.map +1 -0
- package/build/index.d.ts +32 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +125 -0
- package/build/index.js.map +1 -0
- package/build/operations/attachments.d.ts +8 -0
- package/build/operations/attachments.d.ts.map +1 -0
- package/build/operations/attachments.js +123 -0
- package/build/operations/attachments.js.map +1 -0
- package/build/operations/authors.d.ts +8 -0
- package/build/operations/authors.d.ts.map +1 -0
- package/build/operations/authors.js +68 -0
- package/build/operations/authors.js.map +1 -0
- package/build/operations/cases.d.ts +8 -0
- package/build/operations/cases.d.ts.map +1 -0
- package/build/operations/cases.js +278 -0
- package/build/operations/cases.js.map +1 -0
- package/build/operations/configurations.d.ts +8 -0
- package/build/operations/configurations.d.ts.map +1 -0
- package/build/operations/configurations.js +102 -0
- package/build/operations/configurations.js.map +1 -0
- package/build/operations/custom-fields.d.ts +8 -0
- package/build/operations/custom-fields.d.ts.map +1 -0
- package/build/operations/custom-fields.js +167 -0
- package/build/operations/custom-fields.js.map +1 -0
- package/build/operations/defects.d.ts +8 -0
- package/build/operations/defects.d.ts.map +1 -0
- package/build/operations/defects.js +219 -0
- package/build/operations/defects.js.map +1 -0
- package/build/operations/environments.d.ts +8 -0
- package/build/operations/environments.d.ts.map +1 -0
- package/build/operations/environments.js +149 -0
- package/build/operations/environments.js.map +1 -0
- package/build/operations/milestones.d.ts +8 -0
- package/build/operations/milestones.d.ts.map +1 -0
- package/build/operations/milestones.js +150 -0
- package/build/operations/milestones.js.map +1 -0
- package/build/operations/plans.d.ts +8 -0
- package/build/operations/plans.d.ts.map +1 -0
- package/build/operations/plans.js +153 -0
- package/build/operations/plans.js.map +1 -0
- package/build/operations/projects.d.ts +8 -0
- package/build/operations/projects.d.ts.map +1 -0
- package/build/operations/projects.js +186 -0
- package/build/operations/projects.js.map +1 -0
- package/build/operations/results.d.ts +8 -0
- package/build/operations/results.d.ts.map +1 -0
- package/build/operations/results.js +208 -0
- package/build/operations/results.js.map +1 -0
- package/build/operations/runs.d.ts +8 -0
- package/build/operations/runs.d.ts.map +1 -0
- package/build/operations/runs.js +211 -0
- package/build/operations/runs.js.map +1 -0
- package/build/operations/search.d.ts +8 -0
- package/build/operations/search.d.ts.map +1 -0
- package/build/operations/search.js +138 -0
- package/build/operations/search.js.map +1 -0
- package/build/operations/shared-parameters.d.ts +8 -0
- package/build/operations/shared-parameters.d.ts.map +1 -0
- package/build/operations/shared-parameters.js +139 -0
- package/build/operations/shared-parameters.js.map +1 -0
- package/build/operations/shared-steps.d.ts +8 -0
- package/build/operations/shared-steps.d.ts.map +1 -0
- package/build/operations/shared-steps.js +155 -0
- package/build/operations/shared-steps.js.map +1 -0
- package/build/operations/suites.d.ts +8 -0
- package/build/operations/suites.d.ts.map +1 -0
- package/build/operations/suites.js +164 -0
- package/build/operations/suites.js.map +1 -0
- package/build/operations/system-fields.d.ts +8 -0
- package/build/operations/system-fields.d.ts.map +1 -0
- package/build/operations/system-fields.js +40 -0
- package/build/operations/system-fields.js.map +1 -0
- package/build/operations/users.d.ts +8 -0
- package/build/operations/users.d.ts.map +1 -0
- package/build/operations/users.js +68 -0
- package/build/operations/users.js.map +1 -0
- package/build/types/index.d.ts +49 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +13 -0
- package/build/types/index.js.map +1 -0
- package/build/utils/errors.d.ts +73 -0
- package/build/utils/errors.d.ts.map +1 -0
- package/build/utils/errors.js +136 -0
- package/build/utils/errors.js.map +1 -0
- package/build/utils/qql-helpers.d.ts +59 -0
- package/build/utils/qql-helpers.d.ts.map +1 -0
- package/build/utils/qql-helpers.js +85 -0
- package/build/utils/qql-helpers.js.map +1 -0
- package/build/utils/registry.d.ts +97 -0
- package/build/utils/registry.d.ts.map +1 -0
- package/build/utils/registry.js +132 -0
- package/build/utils/registry.js.map +1 -0
- package/build/utils/test-helpers.d.ts +32 -0
- package/build/utils/test-helpers.d.ts.map +1 -0
- package/build/utils/test-helpers.js +81 -0
- package/build/utils/test-helpers.js.map +1 -0
- package/build/utils/validation.d.ts +107 -0
- package/build/utils/validation.d.ts.map +1 -0
- package/build/utils/validation.js +104 -0
- package/build/utils/validation.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defects Operations
|
|
3
|
+
*
|
|
4
|
+
* Implements all MCP tools for managing defects in Qase.
|
|
5
|
+
* Defects represent bugs and issues discovered during testing.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { getApiClient } from '../client/index.js';
|
|
9
|
+
import { toolRegistry } from '../utils/registry.js';
|
|
10
|
+
import { toResultAsync } from '../utils/errors.js';
|
|
11
|
+
import { ProjectCodeSchema, IdSchema } from '../utils/validation.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// SCHEMAS
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Defect severity levels
|
|
17
|
+
*/
|
|
18
|
+
const DefectSeverityEnum = z.enum([
|
|
19
|
+
'undefined',
|
|
20
|
+
'blocker',
|
|
21
|
+
'critical',
|
|
22
|
+
'major',
|
|
23
|
+
'normal',
|
|
24
|
+
'minor',
|
|
25
|
+
'trivial',
|
|
26
|
+
]);
|
|
27
|
+
/**
|
|
28
|
+
* Defect status values
|
|
29
|
+
*/
|
|
30
|
+
const DefectStatusEnum = z.enum(['open', 'in_progress', 'resolved', 'invalid']);
|
|
31
|
+
/**
|
|
32
|
+
* Schema for listing defects
|
|
33
|
+
*/
|
|
34
|
+
const ListDefectsSchema = z.object({
|
|
35
|
+
code: ProjectCodeSchema,
|
|
36
|
+
status: z.array(DefectStatusEnum).optional().describe('Filter by status'),
|
|
37
|
+
severity: z.array(DefectSeverityEnum).optional().describe('Filter by severity'),
|
|
38
|
+
limit: z.number().int().positive().max(100).optional().describe('Maximum number of items'),
|
|
39
|
+
offset: z.number().int().nonnegative().optional().describe('Number of items to skip'),
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Schema for getting a specific defect
|
|
43
|
+
*/
|
|
44
|
+
const GetDefectSchema = z.object({
|
|
45
|
+
code: ProjectCodeSchema,
|
|
46
|
+
id: IdSchema,
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Schema for creating a defect
|
|
50
|
+
*/
|
|
51
|
+
const CreateDefectSchema = z.object({
|
|
52
|
+
code: ProjectCodeSchema,
|
|
53
|
+
title: z.string().min(1).max(255).describe('Defect title'),
|
|
54
|
+
actual_result: z.string().optional().describe('Actual behavior observed'),
|
|
55
|
+
severity: DefectSeverityEnum.optional().describe('Defect severity'),
|
|
56
|
+
attachments: z.array(z.string()).optional().describe('Array of attachment hashes'),
|
|
57
|
+
custom_field: z.record(z.any()).optional().describe('Custom field values'),
|
|
58
|
+
tags: z.array(z.string()).optional().describe('Tags for categorization'),
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Schema for updating a defect
|
|
62
|
+
*/
|
|
63
|
+
const UpdateDefectSchema = z.object({
|
|
64
|
+
code: ProjectCodeSchema,
|
|
65
|
+
id: IdSchema,
|
|
66
|
+
title: z.string().min(1).max(255).optional().describe('Defect title'),
|
|
67
|
+
actual_result: z.string().optional().describe('Actual behavior observed'),
|
|
68
|
+
severity: DefectSeverityEnum.optional().describe('Defect severity'),
|
|
69
|
+
attachments: z.array(z.string()).optional().describe('Array of attachment hashes'),
|
|
70
|
+
tags: z.array(z.string()).optional().describe('Tags for categorization'),
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* Schema for deleting a defect
|
|
74
|
+
*/
|
|
75
|
+
const DeleteDefectSchema = z.object({
|
|
76
|
+
code: ProjectCodeSchema,
|
|
77
|
+
id: IdSchema,
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* Schema for resolving a defect
|
|
81
|
+
*/
|
|
82
|
+
const ResolveDefectSchema = z.object({
|
|
83
|
+
code: ProjectCodeSchema,
|
|
84
|
+
id: IdSchema,
|
|
85
|
+
});
|
|
86
|
+
/**
|
|
87
|
+
* Schema for updating defect status
|
|
88
|
+
*/
|
|
89
|
+
const UpdateDefectStatusSchema = z.object({
|
|
90
|
+
code: ProjectCodeSchema,
|
|
91
|
+
id: IdSchema,
|
|
92
|
+
status: DefectStatusEnum.describe('New defect status'),
|
|
93
|
+
});
|
|
94
|
+
// ============================================================================
|
|
95
|
+
// HANDLERS
|
|
96
|
+
// ============================================================================
|
|
97
|
+
/**
|
|
98
|
+
* List all defects in a project
|
|
99
|
+
*/
|
|
100
|
+
async function listDefects(args) {
|
|
101
|
+
const client = getApiClient();
|
|
102
|
+
const { code, status, severity, limit, offset } = args;
|
|
103
|
+
const result = await toResultAsync(client.defects.getDefects(code, { status, severity }, limit, offset));
|
|
104
|
+
return result.match((response) => response.data.result, (error) => {
|
|
105
|
+
throw new Error(error);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get a specific defect
|
|
110
|
+
*/
|
|
111
|
+
async function getDefect(args) {
|
|
112
|
+
const client = getApiClient();
|
|
113
|
+
const { code, id } = args;
|
|
114
|
+
const result = await toResultAsync(client.defects.getDefect(code, id));
|
|
115
|
+
return result.match((response) => response.data.result, (error) => {
|
|
116
|
+
throw new Error(error);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a new defect
|
|
121
|
+
*/
|
|
122
|
+
async function createDefect(args) {
|
|
123
|
+
const client = getApiClient();
|
|
124
|
+
const { code, ...defectData } = args;
|
|
125
|
+
const result = await toResultAsync(client.defects.createDefect(code, defectData));
|
|
126
|
+
return result.match((response) => response.data.result, (error) => {
|
|
127
|
+
throw new Error(error);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Update an existing defect
|
|
132
|
+
*/
|
|
133
|
+
async function updateDefect(args) {
|
|
134
|
+
const client = getApiClient();
|
|
135
|
+
const { code, id, ...updateData } = args;
|
|
136
|
+
const result = await toResultAsync(client.defects.updateDefect(code, id, updateData));
|
|
137
|
+
return result.match((response) => response.data.result, (error) => {
|
|
138
|
+
throw new Error(error);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Delete a defect
|
|
143
|
+
*/
|
|
144
|
+
async function deleteDefect(args) {
|
|
145
|
+
const client = getApiClient();
|
|
146
|
+
const { code, id } = args;
|
|
147
|
+
const result = await toResultAsync(client.defects.deleteDefect(code, id));
|
|
148
|
+
return result.match((_response) => ({ success: true, id }), (error) => {
|
|
149
|
+
throw new Error(error);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Mark a defect as resolved
|
|
154
|
+
*/
|
|
155
|
+
async function resolveDefect(args) {
|
|
156
|
+
const client = getApiClient();
|
|
157
|
+
const { code, id } = args;
|
|
158
|
+
const result = await toResultAsync(client.defects.resolveDefect(code, id));
|
|
159
|
+
return result.match((response) => response.data.result, (error) => {
|
|
160
|
+
throw new Error(error);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Update defect status
|
|
165
|
+
*/
|
|
166
|
+
async function updateDefectStatus(args) {
|
|
167
|
+
const client = getApiClient();
|
|
168
|
+
const { code, id, status } = args;
|
|
169
|
+
const result = await toResultAsync(client.defects.updateDefect(code, id, { status }));
|
|
170
|
+
return result.match((response) => response.data.result, (error) => {
|
|
171
|
+
throw new Error(error);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// TOOL REGISTRATION
|
|
176
|
+
// ============================================================================
|
|
177
|
+
toolRegistry.register({
|
|
178
|
+
name: 'list_defects',
|
|
179
|
+
description: 'Get all defects in a project with optional filtering by status and severity',
|
|
180
|
+
schema: ListDefectsSchema,
|
|
181
|
+
handler: listDefects,
|
|
182
|
+
});
|
|
183
|
+
toolRegistry.register({
|
|
184
|
+
name: 'get_defect',
|
|
185
|
+
description: 'Get a specific defect by project code and defect ID',
|
|
186
|
+
schema: GetDefectSchema,
|
|
187
|
+
handler: getDefect,
|
|
188
|
+
});
|
|
189
|
+
toolRegistry.register({
|
|
190
|
+
name: 'create_defect',
|
|
191
|
+
description: 'Create a new defect/bug report in a project',
|
|
192
|
+
schema: CreateDefectSchema,
|
|
193
|
+
handler: createDefect,
|
|
194
|
+
});
|
|
195
|
+
toolRegistry.register({
|
|
196
|
+
name: 'update_defect',
|
|
197
|
+
description: 'Update an existing defect',
|
|
198
|
+
schema: UpdateDefectSchema,
|
|
199
|
+
handler: updateDefect,
|
|
200
|
+
});
|
|
201
|
+
toolRegistry.register({
|
|
202
|
+
name: 'delete_defect',
|
|
203
|
+
description: 'Delete a defect from a project',
|
|
204
|
+
schema: DeleteDefectSchema,
|
|
205
|
+
handler: deleteDefect,
|
|
206
|
+
});
|
|
207
|
+
toolRegistry.register({
|
|
208
|
+
name: 'resolve_defect',
|
|
209
|
+
description: 'Mark a defect as resolved',
|
|
210
|
+
schema: ResolveDefectSchema,
|
|
211
|
+
handler: resolveDefect,
|
|
212
|
+
});
|
|
213
|
+
toolRegistry.register({
|
|
214
|
+
name: 'update_defect_status',
|
|
215
|
+
description: 'Update the status of a defect (open, in_progress, resolved, invalid)',
|
|
216
|
+
schema: UpdateDefectStatusSchema,
|
|
217
|
+
handler: updateDefectStatus,
|
|
218
|
+
});
|
|
219
|
+
//# sourceMappingURL=defects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defects.js","sourceRoot":"","sources":["../../src/operations/defects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/operations/environments.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environments Operations
|
|
3
|
+
*
|
|
4
|
+
* Implements all MCP tools for managing test environments in Qase.
|
|
5
|
+
* Environments represent different testing stages (staging, production, etc.).
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { getApiClient } from '../client/index.js';
|
|
9
|
+
import { toolRegistry } from '../utils/registry.js';
|
|
10
|
+
import { toResultAsync } from '../utils/errors.js';
|
|
11
|
+
import { ProjectCodeSchema, IdSchema } from '../utils/validation.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// SCHEMAS
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Schema for listing environments
|
|
17
|
+
*/
|
|
18
|
+
const ListEnvironmentsSchema = z.object({
|
|
19
|
+
code: ProjectCodeSchema,
|
|
20
|
+
limit: z.number().int().positive().max(100).optional().describe('Maximum number of items'),
|
|
21
|
+
offset: z.number().int().nonnegative().optional().describe('Number of items to skip'),
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Schema for getting a specific environment
|
|
25
|
+
*/
|
|
26
|
+
const GetEnvironmentSchema = z.object({
|
|
27
|
+
code: ProjectCodeSchema,
|
|
28
|
+
id: IdSchema,
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Schema for creating an environment
|
|
32
|
+
*/
|
|
33
|
+
const CreateEnvironmentSchema = z.object({
|
|
34
|
+
code: ProjectCodeSchema,
|
|
35
|
+
title: z.string().min(1).max(255).describe('Environment title'),
|
|
36
|
+
description: z.string().optional().describe('Environment description'),
|
|
37
|
+
slug: z.string().optional().describe('URL-friendly identifier'),
|
|
38
|
+
host: z.string().optional().describe('Environment host/URL'),
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Schema for updating an environment
|
|
42
|
+
*/
|
|
43
|
+
const UpdateEnvironmentSchema = z.object({
|
|
44
|
+
code: ProjectCodeSchema,
|
|
45
|
+
id: IdSchema,
|
|
46
|
+
title: z.string().min(1).max(255).optional().describe('Environment title'),
|
|
47
|
+
description: z.string().optional().describe('Environment description'),
|
|
48
|
+
slug: z.string().optional().describe('URL-friendly identifier'),
|
|
49
|
+
host: z.string().optional().describe('Environment host/URL'),
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Schema for deleting an environment
|
|
53
|
+
*/
|
|
54
|
+
const DeleteEnvironmentSchema = z.object({
|
|
55
|
+
code: ProjectCodeSchema,
|
|
56
|
+
id: IdSchema,
|
|
57
|
+
});
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// HANDLERS
|
|
60
|
+
// ============================================================================
|
|
61
|
+
/**
|
|
62
|
+
* List all environments in a project
|
|
63
|
+
*/
|
|
64
|
+
async function listEnvironments(args) {
|
|
65
|
+
const client = getApiClient();
|
|
66
|
+
const { code, limit, offset } = args;
|
|
67
|
+
const result = await toResultAsync(client.environment.getEnvironments(code, limit, offset));
|
|
68
|
+
return result.match((response) => response.data.result, (error) => {
|
|
69
|
+
throw new Error(error);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get a specific environment
|
|
74
|
+
*/
|
|
75
|
+
async function getEnvironment(args) {
|
|
76
|
+
const client = getApiClient();
|
|
77
|
+
const { code, id } = args;
|
|
78
|
+
const result = await toResultAsync(client.environment.getEnvironment(code, id));
|
|
79
|
+
return result.match((response) => response.data.result, (error) => {
|
|
80
|
+
throw new Error(error);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create a new environment
|
|
85
|
+
*/
|
|
86
|
+
async function createEnvironment(args) {
|
|
87
|
+
const client = getApiClient();
|
|
88
|
+
const { code, ...environmentData } = args;
|
|
89
|
+
const result = await toResultAsync(client.environment.createEnvironment(code, environmentData));
|
|
90
|
+
return result.match((response) => response.data.result, (error) => {
|
|
91
|
+
throw new Error(error);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Update an existing environment
|
|
96
|
+
*/
|
|
97
|
+
async function updateEnvironment(args) {
|
|
98
|
+
const client = getApiClient();
|
|
99
|
+
const { code, id, ...updateData } = args;
|
|
100
|
+
const result = await toResultAsync(client.environment.updateEnvironment(code, id, updateData));
|
|
101
|
+
return result.match((response) => response.data.result, (error) => {
|
|
102
|
+
throw new Error(error);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Delete an environment
|
|
107
|
+
*/
|
|
108
|
+
async function deleteEnvironment(args) {
|
|
109
|
+
const client = getApiClient();
|
|
110
|
+
const { code, id } = args;
|
|
111
|
+
const result = await toResultAsync(client.environment.deleteEnvironment(code, id));
|
|
112
|
+
return result.match((_response) => ({ success: true, id }), (error) => {
|
|
113
|
+
throw new Error(error);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// TOOL REGISTRATION
|
|
118
|
+
// ============================================================================
|
|
119
|
+
toolRegistry.register({
|
|
120
|
+
name: 'list_environments',
|
|
121
|
+
description: 'Get all test environments in a project',
|
|
122
|
+
schema: ListEnvironmentsSchema,
|
|
123
|
+
handler: listEnvironments,
|
|
124
|
+
});
|
|
125
|
+
toolRegistry.register({
|
|
126
|
+
name: 'get_environment',
|
|
127
|
+
description: 'Get a specific environment by project code and environment ID',
|
|
128
|
+
schema: GetEnvironmentSchema,
|
|
129
|
+
handler: getEnvironment,
|
|
130
|
+
});
|
|
131
|
+
toolRegistry.register({
|
|
132
|
+
name: 'create_environment',
|
|
133
|
+
description: 'Create a new test environment (staging, production, etc.)',
|
|
134
|
+
schema: CreateEnvironmentSchema,
|
|
135
|
+
handler: createEnvironment,
|
|
136
|
+
});
|
|
137
|
+
toolRegistry.register({
|
|
138
|
+
name: 'update_environment',
|
|
139
|
+
description: 'Update an existing test environment',
|
|
140
|
+
schema: UpdateEnvironmentSchema,
|
|
141
|
+
handler: updateEnvironment,
|
|
142
|
+
});
|
|
143
|
+
toolRegistry.register({
|
|
144
|
+
name: 'delete_environment',
|
|
145
|
+
description: 'Delete a test environment from a project',
|
|
146
|
+
schema: DeleteEnvironmentSchema,
|
|
147
|
+
handler: deleteEnvironment,
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=environments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/operations/environments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestones.d.ts","sourceRoot":"","sources":["../../src/operations/milestones.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Milestones Operations
|
|
3
|
+
*
|
|
4
|
+
* Implements all MCP tools for managing milestones in Qase.
|
|
5
|
+
* Milestones help organize tests by releases, sprints, or project phases.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { getApiClient } from '../client/index.js';
|
|
9
|
+
import { toolRegistry } from '../utils/registry.js';
|
|
10
|
+
import { toResultAsync } from '../utils/errors.js';
|
|
11
|
+
import { ProjectCodeSchema, IdSchema } from '../utils/validation.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// SCHEMAS
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Schema for listing milestones
|
|
17
|
+
*/
|
|
18
|
+
const ListMilestonesSchema = z.object({
|
|
19
|
+
code: ProjectCodeSchema,
|
|
20
|
+
search: z.string().optional().describe('Search query for milestone title'),
|
|
21
|
+
limit: z.number().int().positive().max(100).optional().describe('Maximum number of items'),
|
|
22
|
+
offset: z.number().int().nonnegative().optional().describe('Number of items to skip'),
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* Schema for getting a specific milestone
|
|
26
|
+
*/
|
|
27
|
+
const GetMilestoneSchema = z.object({
|
|
28
|
+
code: ProjectCodeSchema,
|
|
29
|
+
id: IdSchema,
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Schema for creating a milestone
|
|
33
|
+
*/
|
|
34
|
+
const CreateMilestoneSchema = z.object({
|
|
35
|
+
code: ProjectCodeSchema,
|
|
36
|
+
title: z.string().min(1).max(255).describe('Milestone title'),
|
|
37
|
+
description: z.string().optional().describe('Milestone description'),
|
|
38
|
+
status: z.enum(['active', 'completed']).optional().default('active').describe('Milestone status'),
|
|
39
|
+
due_date: z.number().optional().describe('Due date as Unix timestamp'),
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Schema for updating a milestone
|
|
43
|
+
*/
|
|
44
|
+
const UpdateMilestoneSchema = z.object({
|
|
45
|
+
code: ProjectCodeSchema,
|
|
46
|
+
id: IdSchema,
|
|
47
|
+
title: z.string().min(1).max(255).optional().describe('Milestone title'),
|
|
48
|
+
description: z.string().optional().describe('Milestone description'),
|
|
49
|
+
status: z.enum(['active', 'completed']).optional().describe('Milestone status'),
|
|
50
|
+
due_date: z.number().optional().describe('Due date as Unix timestamp'),
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Schema for deleting a milestone
|
|
54
|
+
*/
|
|
55
|
+
const DeleteMilestoneSchema = z.object({
|
|
56
|
+
code: ProjectCodeSchema,
|
|
57
|
+
id: IdSchema,
|
|
58
|
+
});
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// HANDLERS
|
|
61
|
+
// ============================================================================
|
|
62
|
+
/**
|
|
63
|
+
* List all milestones in a project
|
|
64
|
+
*/
|
|
65
|
+
async function listMilestones(args) {
|
|
66
|
+
const client = getApiClient();
|
|
67
|
+
const { code, search, limit, offset } = args;
|
|
68
|
+
const result = await toResultAsync(client.milestones.getMilestones(code, search, limit, offset));
|
|
69
|
+
return result.match((response) => response.data.result, (error) => {
|
|
70
|
+
throw new Error(error);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get a specific milestone
|
|
75
|
+
*/
|
|
76
|
+
async function getMilestone(args) {
|
|
77
|
+
const client = getApiClient();
|
|
78
|
+
const { code, id } = args;
|
|
79
|
+
const result = await toResultAsync(client.milestones.getMilestone(code, id));
|
|
80
|
+
return result.match((response) => response.data.result, (error) => {
|
|
81
|
+
throw new Error(error);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Create a new milestone
|
|
86
|
+
*/
|
|
87
|
+
async function createMilestone(args) {
|
|
88
|
+
const client = getApiClient();
|
|
89
|
+
const { code, ...milestoneData } = args;
|
|
90
|
+
const result = await toResultAsync(client.milestones.createMilestone(code, milestoneData));
|
|
91
|
+
return result.match((response) => response.data.result, (error) => {
|
|
92
|
+
throw new Error(error);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Update an existing milestone
|
|
97
|
+
*/
|
|
98
|
+
async function updateMilestone(args) {
|
|
99
|
+
const client = getApiClient();
|
|
100
|
+
const { code, id, ...updateData } = args;
|
|
101
|
+
const result = await toResultAsync(client.milestones.updateMilestone(code, id, updateData));
|
|
102
|
+
return result.match((response) => response.data.result, (error) => {
|
|
103
|
+
throw new Error(error);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Delete a milestone
|
|
108
|
+
*/
|
|
109
|
+
async function deleteMilestone(args) {
|
|
110
|
+
const client = getApiClient();
|
|
111
|
+
const { code, id } = args;
|
|
112
|
+
const result = await toResultAsync(client.milestones.deleteMilestone(code, id));
|
|
113
|
+
return result.match((_response) => ({ success: true, id }), (error) => {
|
|
114
|
+
throw new Error(error);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// TOOL REGISTRATION
|
|
119
|
+
// ============================================================================
|
|
120
|
+
toolRegistry.register({
|
|
121
|
+
name: 'list_milestones',
|
|
122
|
+
description: 'Get all milestones in a project with optional search and pagination',
|
|
123
|
+
schema: ListMilestonesSchema,
|
|
124
|
+
handler: listMilestones,
|
|
125
|
+
});
|
|
126
|
+
toolRegistry.register({
|
|
127
|
+
name: 'get_milestone',
|
|
128
|
+
description: 'Get a specific milestone by project code and milestone ID',
|
|
129
|
+
schema: GetMilestoneSchema,
|
|
130
|
+
handler: getMilestone,
|
|
131
|
+
});
|
|
132
|
+
toolRegistry.register({
|
|
133
|
+
name: 'create_milestone',
|
|
134
|
+
description: 'Create a new milestone for organizing tests by releases or sprints',
|
|
135
|
+
schema: CreateMilestoneSchema,
|
|
136
|
+
handler: createMilestone,
|
|
137
|
+
});
|
|
138
|
+
toolRegistry.register({
|
|
139
|
+
name: 'update_milestone',
|
|
140
|
+
description: 'Update an existing milestone',
|
|
141
|
+
schema: UpdateMilestoneSchema,
|
|
142
|
+
handler: updateMilestone,
|
|
143
|
+
});
|
|
144
|
+
toolRegistry.register({
|
|
145
|
+
name: 'delete_milestone',
|
|
146
|
+
description: 'Delete a milestone from a project',
|
|
147
|
+
schema: DeleteMilestoneSchema,
|
|
148
|
+
handler: deleteMilestone,
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=milestones.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"milestones.js","sourceRoot":"","sources":["../../src/operations/milestones.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../src/operations/plans.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|