@id3-clarity/mcp-server 1.5.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.
- package/EXAMPLES.md +64 -0
- package/LICENSE +21 -0
- package/README.md +538 -0
- package/dist/client/clarity-api-client.d.ts +19 -0
- package/dist/client/clarity-api-client.js +34 -0
- package/dist/client/clarity-api-client.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/i18n/en.d.ts +5 -0
- package/dist/i18n/en.js +4 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/tr.d.ts +5 -0
- package/dist/i18n/tr.js +4 -0
- package/dist/i18n/tr.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +69 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.js +1120 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,1120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TOOLS = void 0;
|
|
4
|
+
const REQ_PROJECT_ID = {
|
|
5
|
+
projectId: { type: 'string', format: 'uuid', description: 'Project UUID (REQUIRED)' },
|
|
6
|
+
};
|
|
7
|
+
exports.TOOLS = [
|
|
8
|
+
// === Read tools (15) ===
|
|
9
|
+
{
|
|
10
|
+
name: 'list_projects',
|
|
11
|
+
description: {
|
|
12
|
+
tr: "CLARITY'de erişebileceğin projeleri listeler.",
|
|
13
|
+
en: 'Lists CLARITY projects accessible to your token.',
|
|
14
|
+
},
|
|
15
|
+
inputSchema: { type: 'object', properties: {} },
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'get_project',
|
|
19
|
+
description: {
|
|
20
|
+
tr: 'Belirtilen projenin detaylarını döndürür.',
|
|
21
|
+
en: 'Returns details of a specific project.',
|
|
22
|
+
},
|
|
23
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'get_project_stats',
|
|
27
|
+
description: {
|
|
28
|
+
tr: 'Proje istatistikleri (case sayısı, son 30 gün başarı oranı).',
|
|
29
|
+
en: 'Project statistics (case count, last 30 days success rate).',
|
|
30
|
+
},
|
|
31
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'list_folders',
|
|
35
|
+
description: {
|
|
36
|
+
tr: 'Projedeki klasörleri (flat) listeler.',
|
|
37
|
+
en: 'Lists folders in a project (flat).',
|
|
38
|
+
},
|
|
39
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'get_folder_tree',
|
|
43
|
+
description: {
|
|
44
|
+
tr: 'Klasör hiyerarşisini ağaç olarak döner.',
|
|
45
|
+
en: 'Returns folder hierarchy as a tree.',
|
|
46
|
+
},
|
|
47
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'list_test_cases',
|
|
51
|
+
description: {
|
|
52
|
+
tr: "Test case'leri sayfalı listeler. folderId/type/priority/status/tag/search filtreleri destekler.",
|
|
53
|
+
en: 'Lists test cases (paginated). Supports folderId/type/priority/status/tag/search filters.',
|
|
54
|
+
},
|
|
55
|
+
inputSchema: {
|
|
56
|
+
type: 'object',
|
|
57
|
+
properties: {
|
|
58
|
+
...REQ_PROJECT_ID,
|
|
59
|
+
folderId: { type: 'string', format: 'uuid' },
|
|
60
|
+
type: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
enum: ['MANUAL', 'AUTOMATED', 'CUCUMBER', 'API', 'PERFORMANCE', 'SECURITY', 'EXPLORATORY'],
|
|
63
|
+
},
|
|
64
|
+
priority: { type: 'string', enum: ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] },
|
|
65
|
+
status: { type: 'string', enum: ['ACTIVE', 'ARCHIVED'] },
|
|
66
|
+
tag: { type: 'string' },
|
|
67
|
+
search: { type: 'string' },
|
|
68
|
+
page: { type: 'number', minimum: 1, default: 1 },
|
|
69
|
+
limit: { type: 'number', minimum: 1, maximum: 200, default: 50 },
|
|
70
|
+
},
|
|
71
|
+
required: ['projectId'],
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'get_test_case',
|
|
76
|
+
description: {
|
|
77
|
+
tr: 'Test case detayını döner (steps + metadata + ilişkiler).',
|
|
78
|
+
en: 'Returns test case detail (steps + metadata + relations).',
|
|
79
|
+
},
|
|
80
|
+
inputSchema: {
|
|
81
|
+
type: 'object',
|
|
82
|
+
properties: { ...REQ_PROJECT_ID, caseId: { type: 'string', format: 'uuid' } },
|
|
83
|
+
required: ['projectId', 'caseId'],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'search_test_cases',
|
|
88
|
+
description: {
|
|
89
|
+
tr: "Test case'lerde başlık ile full-text arama.",
|
|
90
|
+
en: 'Full-text search by title in test cases.',
|
|
91
|
+
},
|
|
92
|
+
inputSchema: {
|
|
93
|
+
type: 'object',
|
|
94
|
+
properties: {
|
|
95
|
+
...REQ_PROJECT_ID,
|
|
96
|
+
query: { type: 'string', minLength: 1, maxLength: 200 },
|
|
97
|
+
limit: { type: 'number', minimum: 1, maximum: 100, default: 20 },
|
|
98
|
+
},
|
|
99
|
+
required: ['projectId', 'query'],
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'list_suites',
|
|
104
|
+
description: {
|
|
105
|
+
tr: "Test suite'leri listeler.",
|
|
106
|
+
en: 'Lists test suites.',
|
|
107
|
+
},
|
|
108
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'get_suite',
|
|
112
|
+
description: {
|
|
113
|
+
tr: "Suite detayını + içindeki case'leri döner.",
|
|
114
|
+
en: 'Returns suite detail with included cases.',
|
|
115
|
+
},
|
|
116
|
+
inputSchema: {
|
|
117
|
+
type: 'object',
|
|
118
|
+
properties: { ...REQ_PROJECT_ID, suiteId: { type: 'string', format: 'uuid' } },
|
|
119
|
+
required: ['projectId', 'suiteId'],
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'list_runs',
|
|
124
|
+
description: {
|
|
125
|
+
tr: "Test run'ları listeler. status filtresi destekler.",
|
|
126
|
+
en: 'Lists test runs. Supports status filter.',
|
|
127
|
+
},
|
|
128
|
+
inputSchema: {
|
|
129
|
+
type: 'object',
|
|
130
|
+
properties: {
|
|
131
|
+
...REQ_PROJECT_ID,
|
|
132
|
+
status: { type: 'string', enum: ['PENDING', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'] },
|
|
133
|
+
limit: { type: 'number', minimum: 1, maximum: 100, default: 20 },
|
|
134
|
+
},
|
|
135
|
+
required: ['projectId'],
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: 'get_run',
|
|
140
|
+
description: {
|
|
141
|
+
tr: 'Run detayını + execution sonuçlarını döner.',
|
|
142
|
+
en: 'Returns run detail with execution results.',
|
|
143
|
+
},
|
|
144
|
+
inputSchema: {
|
|
145
|
+
type: 'object',
|
|
146
|
+
properties: { ...REQ_PROJECT_ID, runId: { type: 'string', format: 'uuid' } },
|
|
147
|
+
required: ['projectId', 'runId'],
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: 'get_run_progress',
|
|
152
|
+
description: {
|
|
153
|
+
tr: 'Run ilerleme istatistikleri (pass/fail/skip/blocked/pending sayıları).',
|
|
154
|
+
en: 'Run progress statistics (pass/fail/skip/blocked/pending counts).',
|
|
155
|
+
},
|
|
156
|
+
inputSchema: {
|
|
157
|
+
type: 'object',
|
|
158
|
+
properties: { ...REQ_PROJECT_ID, runId: { type: 'string', format: 'uuid' } },
|
|
159
|
+
required: ['projectId', 'runId'],
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'get_failing_cases',
|
|
164
|
+
description: {
|
|
165
|
+
tr: "Son N gün içinde en çok hata alan test case'ler.",
|
|
166
|
+
en: 'Top failing test cases in the last N days.',
|
|
167
|
+
},
|
|
168
|
+
inputSchema: {
|
|
169
|
+
type: 'object',
|
|
170
|
+
properties: {
|
|
171
|
+
...REQ_PROJECT_ID,
|
|
172
|
+
days: { type: 'number', minimum: 1, maximum: 365, default: 30 },
|
|
173
|
+
limit: { type: 'number', minimum: 1, maximum: 100, default: 10 },
|
|
174
|
+
},
|
|
175
|
+
required: ['projectId'],
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: 'get_test_type_info',
|
|
180
|
+
description: {
|
|
181
|
+
tr: 'Test tipi enum değerleri ve açıklamaları (MANUAL/API/AUTOMATED vb.).',
|
|
182
|
+
en: 'Test type enum values and descriptions (MANUAL/API/AUTOMATED etc.).',
|
|
183
|
+
},
|
|
184
|
+
inputSchema: { type: 'object', properties: {} },
|
|
185
|
+
},
|
|
186
|
+
// === Write tools (12) ===
|
|
187
|
+
{
|
|
188
|
+
name: 'create_project',
|
|
189
|
+
description: {
|
|
190
|
+
tr: 'Yeni proje oluşturur.',
|
|
191
|
+
en: 'Creates a new project.',
|
|
192
|
+
},
|
|
193
|
+
inputSchema: {
|
|
194
|
+
type: 'object',
|
|
195
|
+
properties: {
|
|
196
|
+
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
197
|
+
code: { type: 'string', minLength: 1, maxLength: 50 },
|
|
198
|
+
description: { type: 'string', maxLength: 1000 },
|
|
199
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
200
|
+
},
|
|
201
|
+
required: ['name', 'code'],
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: 'update_project',
|
|
206
|
+
description: {
|
|
207
|
+
tr: 'Proje bilgilerini günceller.',
|
|
208
|
+
en: 'Updates project info.',
|
|
209
|
+
},
|
|
210
|
+
inputSchema: {
|
|
211
|
+
type: 'object',
|
|
212
|
+
properties: {
|
|
213
|
+
...REQ_PROJECT_ID,
|
|
214
|
+
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
215
|
+
description: { type: 'string', maxLength: 1000 },
|
|
216
|
+
},
|
|
217
|
+
required: ['projectId'],
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: 'create_folder',
|
|
222
|
+
description: {
|
|
223
|
+
tr: 'Klasör oluşturur. parentId ile nested.',
|
|
224
|
+
en: 'Creates a folder. Use parentId for nested.',
|
|
225
|
+
},
|
|
226
|
+
inputSchema: {
|
|
227
|
+
type: 'object',
|
|
228
|
+
properties: {
|
|
229
|
+
...REQ_PROJECT_ID,
|
|
230
|
+
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
231
|
+
parentId: { type: 'string', format: 'uuid' },
|
|
232
|
+
},
|
|
233
|
+
required: ['projectId', 'name'],
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
name: 'update_folder',
|
|
238
|
+
description: {
|
|
239
|
+
tr: "Klasör adını/parent'ı günceller.",
|
|
240
|
+
en: 'Updates folder name/parent.',
|
|
241
|
+
},
|
|
242
|
+
inputSchema: {
|
|
243
|
+
type: 'object',
|
|
244
|
+
properties: {
|
|
245
|
+
...REQ_PROJECT_ID,
|
|
246
|
+
folderId: { type: 'string', format: 'uuid' },
|
|
247
|
+
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
248
|
+
parentId: { type: 'string', format: 'uuid' },
|
|
249
|
+
},
|
|
250
|
+
required: ['projectId', 'folderId'],
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
name: 'create_test_case',
|
|
255
|
+
description: {
|
|
256
|
+
tr: "Yeni test case oluşturur. type MANUAL veya AUTOMATED; API/FUNCTIONAL/UI/E2E/PERFORMANCE/SECURITY otomatik MANUAL'a coerce + testTypes'a eklenir.",
|
|
257
|
+
en: 'Creates a new test case. type must be MANUAL or AUTOMATED; API/FUNCTIONAL/UI/E2E/PERFORMANCE/SECURITY auto-coerce to MANUAL with value pushed to testTypes.',
|
|
258
|
+
},
|
|
259
|
+
inputSchema: {
|
|
260
|
+
type: 'object',
|
|
261
|
+
properties: {
|
|
262
|
+
...REQ_PROJECT_ID,
|
|
263
|
+
title: { type: 'string', minLength: 1, maxLength: 200 },
|
|
264
|
+
description: { type: 'string', maxLength: 1000 },
|
|
265
|
+
preconditions: { type: 'string' },
|
|
266
|
+
type: {
|
|
267
|
+
type: 'string',
|
|
268
|
+
enum: ['MANUAL', 'AUTOMATED', 'CUCUMBER', 'API', 'PERFORMANCE', 'SECURITY', 'EXPLORATORY'],
|
|
269
|
+
},
|
|
270
|
+
priority: { type: 'string', enum: ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] },
|
|
271
|
+
tags: { type: 'array', items: { type: 'string' } },
|
|
272
|
+
testTypes: { type: 'array', items: { type: 'string' } },
|
|
273
|
+
steps: {
|
|
274
|
+
type: 'array',
|
|
275
|
+
minItems: 1,
|
|
276
|
+
items: {
|
|
277
|
+
type: 'object',
|
|
278
|
+
properties: {
|
|
279
|
+
order: { type: 'number' },
|
|
280
|
+
action: { type: 'string' },
|
|
281
|
+
expectedResult: { type: 'string' },
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
folderId: { type: 'string', format: 'uuid' },
|
|
286
|
+
metadata: { type: 'object', additionalProperties: true },
|
|
287
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
288
|
+
},
|
|
289
|
+
required: ['projectId', 'title', 'steps'],
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
name: 'update_test_case',
|
|
294
|
+
description: {
|
|
295
|
+
tr: "Test case alanlarını günceller. folderId vererek case'i başka bir klasöre taşıyabilirsin (null = proje kökü); hedef klasör aynı projeye ait olmalı. Çoklu taşıma için bulk_move_test_cases kullan.",
|
|
296
|
+
en: 'Updates test case fields. Pass folderId to move the case to another folder (null = project root); the target folder must belong to the same project. For moving many cases use bulk_move_test_cases.',
|
|
297
|
+
},
|
|
298
|
+
inputSchema: {
|
|
299
|
+
type: 'object',
|
|
300
|
+
properties: {
|
|
301
|
+
...REQ_PROJECT_ID,
|
|
302
|
+
caseId: { type: 'string', format: 'uuid' },
|
|
303
|
+
title: { type: 'string', minLength: 1, maxLength: 200 },
|
|
304
|
+
description: { type: 'string', maxLength: 1000 },
|
|
305
|
+
priority: { type: 'string', enum: ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] },
|
|
306
|
+
status: { type: 'string', enum: ['ACTIVE', 'ARCHIVED'] },
|
|
307
|
+
tags: { type: 'array', items: { type: 'string' } },
|
|
308
|
+
steps: { type: 'array' },
|
|
309
|
+
folderId: { type: ['string', 'null'], format: 'uuid' },
|
|
310
|
+
},
|
|
311
|
+
required: ['projectId', 'caseId'],
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: 'bulk_create_test_cases',
|
|
316
|
+
description: {
|
|
317
|
+
tr: 'Birden fazla test case oluşturur (max 50). Daha fazlası için import_test_cases_json kullan.',
|
|
318
|
+
en: 'Bulk create test cases (max 50). For more, use import_test_cases_json.',
|
|
319
|
+
},
|
|
320
|
+
inputSchema: {
|
|
321
|
+
type: 'object',
|
|
322
|
+
properties: {
|
|
323
|
+
...REQ_PROJECT_ID,
|
|
324
|
+
testCases: { type: 'array', minItems: 1, maxItems: 50, items: { type: 'object' } },
|
|
325
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
326
|
+
},
|
|
327
|
+
required: ['projectId', 'testCases'],
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
name: 'bulk_move_test_cases',
|
|
332
|
+
description: {
|
|
333
|
+
tr: "Birden fazla test case'i (max 200) tek seferde bir klasöre taşır; folderId null verilirse proje köküne taşır. Hedef klasör belirtilen projeye ait olmalı; farklı projeye/eksik/silinmiş id'ler taşınmaz ve notFound içinde döner.",
|
|
334
|
+
en: 'Moves many test cases (max 200) into one folder at once; pass folderId null to move them to the project root. The target folder must belong to the given project; ids from another project / missing / soft-deleted are skipped and returned in notFound.',
|
|
335
|
+
},
|
|
336
|
+
inputSchema: {
|
|
337
|
+
type: 'object',
|
|
338
|
+
properties: {
|
|
339
|
+
...REQ_PROJECT_ID,
|
|
340
|
+
caseIds: {
|
|
341
|
+
type: 'array',
|
|
342
|
+
minItems: 1,
|
|
343
|
+
maxItems: 200,
|
|
344
|
+
items: { type: 'string', format: 'uuid' },
|
|
345
|
+
},
|
|
346
|
+
folderId: { type: ['string', 'null'], format: 'uuid' },
|
|
347
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
348
|
+
},
|
|
349
|
+
required: ['projectId', 'caseIds', 'folderId'],
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
name: 'import_test_cases_json',
|
|
354
|
+
description: {
|
|
355
|
+
tr: 'JSON içerik ile bulk test case import. CLARITY JSON şeması kullanılır (canonical veya suggestions[] alias). folderStrategy ve duplicateStrategy ile akış kontrolü.',
|
|
356
|
+
en: 'Bulk import test cases via JSON content. Uses CLARITY JSON schema (canonical or suggestions[] alias). Control flow with folderStrategy and duplicateStrategy.',
|
|
357
|
+
},
|
|
358
|
+
inputSchema: {
|
|
359
|
+
type: 'object',
|
|
360
|
+
properties: {
|
|
361
|
+
...REQ_PROJECT_ID,
|
|
362
|
+
jsonContent: { type: 'string', minLength: 2 },
|
|
363
|
+
folderId: { type: 'string', format: 'uuid' },
|
|
364
|
+
folderStrategy: {
|
|
365
|
+
type: 'string',
|
|
366
|
+
enum: ['auto-create', 'find-or-create', 'existing-only'],
|
|
367
|
+
default: 'find-or-create',
|
|
368
|
+
},
|
|
369
|
+
duplicateStrategy: {
|
|
370
|
+
type: 'string',
|
|
371
|
+
enum: ['skip', 'update', 'create-new'],
|
|
372
|
+
default: 'skip',
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
required: ['projectId', 'jsonContent'],
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
name: 'create_suite',
|
|
380
|
+
description: {
|
|
381
|
+
tr: 'Yeni test suite oluşturur.',
|
|
382
|
+
en: 'Creates a new test suite.',
|
|
383
|
+
},
|
|
384
|
+
inputSchema: {
|
|
385
|
+
type: 'object',
|
|
386
|
+
properties: {
|
|
387
|
+
...REQ_PROJECT_ID,
|
|
388
|
+
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
389
|
+
description: { type: 'string', maxLength: 1000 },
|
|
390
|
+
},
|
|
391
|
+
required: ['projectId', 'name'],
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
name: 'update_suite',
|
|
396
|
+
description: {
|
|
397
|
+
tr: "Suite'i günceller. addCaseIds/removeCaseIds ile case ekleme/çıkarma.",
|
|
398
|
+
en: 'Updates a suite. Use addCaseIds/removeCaseIds for case mgmt.',
|
|
399
|
+
},
|
|
400
|
+
inputSchema: {
|
|
401
|
+
type: 'object',
|
|
402
|
+
properties: {
|
|
403
|
+
...REQ_PROJECT_ID,
|
|
404
|
+
suiteId: { type: 'string', format: 'uuid' },
|
|
405
|
+
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
406
|
+
description: { type: 'string', maxLength: 1000 },
|
|
407
|
+
addCaseIds: { type: 'array', items: { type: 'string', format: 'uuid' } },
|
|
408
|
+
removeCaseIds: { type: 'array', items: { type: 'string', format: 'uuid' } },
|
|
409
|
+
},
|
|
410
|
+
required: ['projectId', 'suiteId'],
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: 'create_run',
|
|
415
|
+
description: {
|
|
416
|
+
tr: 'Test run oluşturur. suiteId VEYA caseIds[] VEYA suggestSuite zorunlu. assignee (userId) ile atama yapılabilir.',
|
|
417
|
+
en: 'Creates a test run. Either suiteId OR caseIds[] OR suggestSuite required. Optional assignee (userId) reassigns executions.',
|
|
418
|
+
},
|
|
419
|
+
inputSchema: {
|
|
420
|
+
type: 'object',
|
|
421
|
+
properties: {
|
|
422
|
+
...REQ_PROJECT_ID,
|
|
423
|
+
name: { type: 'string', minLength: 1, maxLength: 100 },
|
|
424
|
+
testSuiteId: { type: 'string', format: 'uuid' },
|
|
425
|
+
testCaseIds: { type: 'array', items: { type: 'string', format: 'uuid' } },
|
|
426
|
+
plannedStartDate: { type: 'string', format: 'date-time' },
|
|
427
|
+
plannedEndDate: { type: 'string', format: 'date-time' },
|
|
428
|
+
assignee: {
|
|
429
|
+
type: 'string',
|
|
430
|
+
format: 'uuid',
|
|
431
|
+
description: 'Optional userId to assign the run executions to (tenant-scoped).',
|
|
432
|
+
},
|
|
433
|
+
suggestSuite: {
|
|
434
|
+
type: 'boolean',
|
|
435
|
+
description: 'When true and no explicit suite/cases given, heuristically pick stale-first ACTIVE cases.',
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
required: ['projectId', 'name'],
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
name: 'update_execution_result',
|
|
443
|
+
description: {
|
|
444
|
+
tr: "Run içindeki bir case'in execution sonucunu günceller (passed/failed/skipped/blocked).",
|
|
445
|
+
en: 'Updates execution result for a case within a run (passed/failed/skipped/blocked).',
|
|
446
|
+
},
|
|
447
|
+
inputSchema: {
|
|
448
|
+
type: 'object',
|
|
449
|
+
properties: {
|
|
450
|
+
...REQ_PROJECT_ID,
|
|
451
|
+
runId: { type: 'string', format: 'uuid' },
|
|
452
|
+
caseId: { type: 'string', format: 'uuid' },
|
|
453
|
+
status: { type: 'string', enum: ['PASS', 'FAIL', 'SKIP', 'BLOCKED'] },
|
|
454
|
+
comment: { type: 'string', maxLength: 2000 },
|
|
455
|
+
},
|
|
456
|
+
required: ['projectId', 'runId', 'caseId', 'status'],
|
|
457
|
+
},
|
|
458
|
+
},
|
|
459
|
+
// === Delete tools (3, with confirmation) ===
|
|
460
|
+
{
|
|
461
|
+
name: 'delete_test_case',
|
|
462
|
+
description: {
|
|
463
|
+
tr: "Test case'i siler (soft-delete, 30 gün geri alınabilir). 1. çağrı confirmationToken döner; 2. çağrıda confirmationToken parametresi gönderin.",
|
|
464
|
+
en: 'Deletes a test case (soft-delete, restorable in 30 days). 1st call returns confirmationToken; 2nd call must include confirmationToken parameter.',
|
|
465
|
+
},
|
|
466
|
+
inputSchema: {
|
|
467
|
+
type: 'object',
|
|
468
|
+
properties: {
|
|
469
|
+
...REQ_PROJECT_ID,
|
|
470
|
+
caseId: { type: 'string', format: 'uuid' },
|
|
471
|
+
confirmationToken: { type: 'string' },
|
|
472
|
+
},
|
|
473
|
+
required: ['projectId', 'caseId'],
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
name: 'delete_folder',
|
|
478
|
+
description: {
|
|
479
|
+
tr: "Klasör ve içindeki case'leri siler (soft-delete, 30 gün geri alınabilir). 2-aşamalı confirmation.",
|
|
480
|
+
en: 'Deletes folder + cases inside (soft-delete, restorable in 30 days). 2-step confirmation.',
|
|
481
|
+
},
|
|
482
|
+
inputSchema: {
|
|
483
|
+
type: 'object',
|
|
484
|
+
properties: {
|
|
485
|
+
...REQ_PROJECT_ID,
|
|
486
|
+
folderId: { type: 'string', format: 'uuid' },
|
|
487
|
+
confirmationToken: { type: 'string' },
|
|
488
|
+
},
|
|
489
|
+
required: ['projectId', 'folderId'],
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
name: 'delete_suite',
|
|
494
|
+
description: {
|
|
495
|
+
tr: "Suite'i siler (case'ler kalır). 2-aşamalı confirmation.",
|
|
496
|
+
en: 'Deletes a suite (cases remain). 2-step confirmation.',
|
|
497
|
+
},
|
|
498
|
+
inputSchema: {
|
|
499
|
+
type: 'object',
|
|
500
|
+
properties: {
|
|
501
|
+
...REQ_PROJECT_ID,
|
|
502
|
+
suiteId: { type: 'string', format: 'uuid' },
|
|
503
|
+
confirmationToken: { type: 'string' },
|
|
504
|
+
},
|
|
505
|
+
required: ['projectId', 'suiteId'],
|
|
506
|
+
},
|
|
507
|
+
},
|
|
508
|
+
// === Requirements (5) ===
|
|
509
|
+
{
|
|
510
|
+
name: 'list_requirements',
|
|
511
|
+
description: {
|
|
512
|
+
tr: 'Bir projedeki gereksinimleri listeler. type / status / priority / assignee / source / syncStatus / testable / search filtreleri destekler.',
|
|
513
|
+
en: 'Lists requirements in a project. Supports type / status / priority / assignee / source / syncStatus / testable / search filters.',
|
|
514
|
+
},
|
|
515
|
+
inputSchema: {
|
|
516
|
+
type: 'object',
|
|
517
|
+
properties: {
|
|
518
|
+
projectId: { type: 'string', format: 'uuid', description: 'Project UUID (REQUIRED)' },
|
|
519
|
+
type: { type: 'string', description: 'Type key (story, epic, task...) or UUID typeId — service auto-resolves' },
|
|
520
|
+
status: { type: 'string', description: 'Status key (open, in_progress, resolved, closed) or UUID statusId' },
|
|
521
|
+
priority: { type: 'string', enum: ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] },
|
|
522
|
+
source: { type: 'string', enum: ['jira', 'azure_devops', 'manual'] },
|
|
523
|
+
syncStatus: { type: 'string', enum: ['synced', 'pending', 'error', 'conflict', 'manual'] },
|
|
524
|
+
testable: { type: 'boolean' },
|
|
525
|
+
assignee: { type: 'string' },
|
|
526
|
+
search: { type: 'string', maxLength: 200, description: 'Free-text match on code/title/description' },
|
|
527
|
+
limit: { type: 'number', minimum: 1, maximum: 500, default: 100 },
|
|
528
|
+
},
|
|
529
|
+
required: ['projectId'],
|
|
530
|
+
},
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
name: 'get_requirement',
|
|
534
|
+
description: {
|
|
535
|
+
tr: 'Tek bir gereksinimin tam detayını döner (attachments, Jira/Azure sync durumu dahil).',
|
|
536
|
+
en: 'Returns full requirement detail including attachments and Jira/Azure sync status.',
|
|
537
|
+
},
|
|
538
|
+
inputSchema: {
|
|
539
|
+
type: 'object',
|
|
540
|
+
properties: {
|
|
541
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
542
|
+
},
|
|
543
|
+
required: ['requirementId'],
|
|
544
|
+
},
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
name: 'create_requirement',
|
|
548
|
+
description: {
|
|
549
|
+
tr: 'Yeni gereksinim oluşturur. `type`/`status` legacy varchar key veya `typeId`/`statusId` UUID kabul eder — backend otomatik resolve eder. idempotencyKey ile tekrar denemeler güvenli.',
|
|
550
|
+
en: 'Creates a new requirement. Accepts legacy varchar `type`/`status` OR modern `typeId`/`statusId` UUIDs — backend auto-resolves. idempotencyKey makes retries safe.',
|
|
551
|
+
},
|
|
552
|
+
inputSchema: {
|
|
553
|
+
type: 'object',
|
|
554
|
+
properties: {
|
|
555
|
+
projectId: { type: 'string', format: 'uuid', description: 'Project UUID (REQUIRED)' },
|
|
556
|
+
key: { type: 'string', minLength: 1, maxLength: 64, description: 'Per-project unique key, e.g. REQ-101' },
|
|
557
|
+
title: { type: 'string', minLength: 1, maxLength: 500 },
|
|
558
|
+
description: { type: 'string', maxLength: 10000 },
|
|
559
|
+
type: { type: 'string', description: 'Legacy varchar key (story/epic/task/bug/improvement) — backend resolves' },
|
|
560
|
+
typeId: { type: 'string', format: 'uuid', description: 'Configured RequirementType UUID — preferred over type' },
|
|
561
|
+
status: { type: 'string', description: 'Legacy varchar key (open/in_progress/...)' },
|
|
562
|
+
statusId: { type: 'string', format: 'uuid', description: 'Configured RequirementStatus UUID — preferred' },
|
|
563
|
+
priority: { type: 'string', enum: ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] },
|
|
564
|
+
assignee: { type: 'string', maxLength: 200 },
|
|
565
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
566
|
+
},
|
|
567
|
+
required: ['projectId', 'key', 'title'],
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
name: 'update_requirement',
|
|
572
|
+
description: {
|
|
573
|
+
tr: "Gereksinim alanlarını günceller. Jira/Azure'a bağlı bir gereksinim güncellenirse syncStatus otomatik 'pending'e düşer — sonra sync_requirement çağırılmalı (v1.3'te gelecek).",
|
|
574
|
+
en: "Updates requirement fields. If linked to Jira/Azure, syncStatus auto-flips to 'pending' — call sync_requirement (v1.3) to push back.",
|
|
575
|
+
},
|
|
576
|
+
inputSchema: {
|
|
577
|
+
type: 'object',
|
|
578
|
+
properties: {
|
|
579
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
580
|
+
key: { type: 'string', minLength: 1, maxLength: 64 },
|
|
581
|
+
title: { type: 'string', minLength: 1, maxLength: 500 },
|
|
582
|
+
description: { type: 'string', maxLength: 10000 },
|
|
583
|
+
type: { type: 'string' },
|
|
584
|
+
typeId: { type: 'string', format: 'uuid' },
|
|
585
|
+
status: { type: 'string' },
|
|
586
|
+
statusId: { type: 'string', format: 'uuid' },
|
|
587
|
+
priority: { type: 'string', enum: ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] },
|
|
588
|
+
assignee: { type: 'string', maxLength: 200 },
|
|
589
|
+
testable: { type: 'boolean' },
|
|
590
|
+
},
|
|
591
|
+
required: ['requirementId'],
|
|
592
|
+
},
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
name: 'link_requirement_to_test_case',
|
|
596
|
+
description: {
|
|
597
|
+
tr: 'Bir gereksinimi bir veya daha fazla test case ile ilişkilendirir (max 100 per call). Zaten bağlı olanlar sessizce atlanır → idempotent.',
|
|
598
|
+
en: 'Links a requirement to one or more test cases (max 100 per call). Already-linked entries are silently skipped → idempotent.',
|
|
599
|
+
},
|
|
600
|
+
inputSchema: {
|
|
601
|
+
type: 'object',
|
|
602
|
+
properties: {
|
|
603
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
604
|
+
testCaseIds: {
|
|
605
|
+
type: 'array',
|
|
606
|
+
items: { type: 'string', format: 'uuid' },
|
|
607
|
+
minItems: 1,
|
|
608
|
+
maxItems: 100,
|
|
609
|
+
},
|
|
610
|
+
},
|
|
611
|
+
required: ['requirementId', 'testCaseIds'],
|
|
612
|
+
},
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
name: 'unlink_requirement_from_test_case',
|
|
616
|
+
description: {
|
|
617
|
+
tr: 'Bir gereksinim ile bir test case arasındaki bağlantıyı kaldırır. Bağlantı yoksa sessizce no-op → idempotent.',
|
|
618
|
+
en: 'Removes the link between a requirement and a single test case. No-op if the link does not exist → idempotent.',
|
|
619
|
+
},
|
|
620
|
+
inputSchema: {
|
|
621
|
+
type: 'object',
|
|
622
|
+
properties: {
|
|
623
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
624
|
+
testCaseId: { type: 'string', format: 'uuid' },
|
|
625
|
+
},
|
|
626
|
+
required: ['requirementId', 'testCaseId'],
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
name: 'delete_requirement',
|
|
631
|
+
description: {
|
|
632
|
+
tr: 'Bir gereksinimi soft-delete eder. Test case bağlantıları kaldırılır, test case\'lerin kendisi etkilenmez. İki adımlı onay gerekir (confirmationToken).',
|
|
633
|
+
en: 'Soft-deletes a requirement. Test case links are removed but the test cases themselves remain intact. Requires two-step confirmation (confirmationToken).',
|
|
634
|
+
},
|
|
635
|
+
inputSchema: {
|
|
636
|
+
type: 'object',
|
|
637
|
+
properties: {
|
|
638
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
639
|
+
confirmationToken: { type: 'string', description: 'Returned by the first call; required to confirm deletion.' },
|
|
640
|
+
},
|
|
641
|
+
required: ['requirementId'],
|
|
642
|
+
},
|
|
643
|
+
},
|
|
644
|
+
{
|
|
645
|
+
name: 'get_requirement_traceability',
|
|
646
|
+
description: {
|
|
647
|
+
tr: 'Projenin gereksinim → test case → son çalıştırma sonucu matrisini döner. Coverage yüzdesi ve özet istatistikler dahil.',
|
|
648
|
+
en: 'Returns the project\'s requirement → test case → last execution status traceability matrix. Includes coverage percentage and summary stats.',
|
|
649
|
+
},
|
|
650
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
name: 'list_requirement_types',
|
|
654
|
+
description: {
|
|
655
|
+
tr: 'Projedeki gereksinim tiplerini (system + project overrides) listeler. create/update_requirement için typeId değerlerini buradan alabilirsin.',
|
|
656
|
+
en: 'Lists requirement types for a project (system defaults + project overrides). Use these typeIds in create/update_requirement calls.',
|
|
657
|
+
},
|
|
658
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
659
|
+
},
|
|
660
|
+
{
|
|
661
|
+
name: 'list_requirement_statuses',
|
|
662
|
+
description: {
|
|
663
|
+
tr: 'Projedeki gereksinim statülerini (system + project overrides) listeler. create/update_requirement için statusId değerlerini buradan alabilirsin.',
|
|
664
|
+
en: 'Lists requirement statuses for a project (system defaults + project overrides). Use these statusIds in create/update_requirement calls.',
|
|
665
|
+
},
|
|
666
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
name: 'push_requirement_to_jira',
|
|
670
|
+
description: {
|
|
671
|
+
tr: 'Manuel olarak oluşturulmuş bir gereksinimi Jira\'ya yeni bir issue olarak push eder. Projenin Jira entegrasyonu yapılandırılmış olmalı.',
|
|
672
|
+
en: 'Pushes a manually-created requirement to Jira as a new issue. Project must have a Jira integration configured.',
|
|
673
|
+
},
|
|
674
|
+
inputSchema: {
|
|
675
|
+
type: 'object',
|
|
676
|
+
properties: {
|
|
677
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
678
|
+
jiraProjectKey: { type: 'string', minLength: 1, maxLength: 64, description: 'Jira project key (e.g. CLAR)' },
|
|
679
|
+
issueType: { type: 'string', minLength: 1, maxLength: 64, description: 'Jira issue type name (Story, Task, Bug...)' },
|
|
680
|
+
},
|
|
681
|
+
required: ['requirementId', 'jiraProjectKey', 'issueType'],
|
|
682
|
+
},
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
name: 'link_requirement_to_jira',
|
|
686
|
+
description: {
|
|
687
|
+
tr: 'Var olan bir Jira issue ile gereksinimi eşler. Gereksinim alanları Jira\'dan gelen verilerle güncellenir.',
|
|
688
|
+
en: 'Links a requirement to an existing Jira issue. Requirement fields are overwritten with Jira data.',
|
|
689
|
+
},
|
|
690
|
+
inputSchema: {
|
|
691
|
+
type: 'object',
|
|
692
|
+
properties: {
|
|
693
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
694
|
+
jiraIssueKey: { type: 'string', minLength: 1, maxLength: 64, description: 'Existing Jira issue key (e.g. CLAR-123)' },
|
|
695
|
+
},
|
|
696
|
+
required: ['requirementId', 'jiraIssueKey'],
|
|
697
|
+
},
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
name: 'sync_requirement',
|
|
701
|
+
description: {
|
|
702
|
+
tr: 'Jira/Azure DevOps\'a bağlı bir gereksinim için tek yönlü pull-sync yapar (uzaktan local\'e). Conflict varsa syncStatus="conflict" döner; manuel sadece reddedilir.',
|
|
703
|
+
en: 'One-way pull-sync from Jira/Azure DevOps to local for a linked requirement. Returns syncStatus="conflict" if both sides changed; manual requirements are rejected.',
|
|
704
|
+
},
|
|
705
|
+
inputSchema: {
|
|
706
|
+
type: 'object',
|
|
707
|
+
properties: { requirementId: { type: 'string', format: 'uuid' } },
|
|
708
|
+
required: ['requirementId'],
|
|
709
|
+
},
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
name: 'push_requirement_update_to_jira',
|
|
713
|
+
description: {
|
|
714
|
+
tr: "CLARITY tarafındaki değişiklikleri, halihazırda bağlı olan Jira issue'ya YUKARI doğru push eder (sync_requirement'ın tersi). Strateji: last-write-wins + conflict tespiti. Jira son sync'ten sonra değişmişse push yapılmaz, syncStatus=\"conflict\" döner ve {pushed:false, conflict} ile yanıtlar. Sadece title/description/priority/assignee push edilir; status Jira workflow transition gerektirir.",
|
|
715
|
+
en: "Pushes CLARITY changes UP to the already-linked Jira issue (opposite of sync_requirement). Strategy: last-write-wins with conflict detection. If Jira was modified after the last sync, the push is rejected with syncStatus='conflict' and a {pushed:false, conflict} response. Only title/description/priority/assignee are pushed; status requires Jira workflow transitions.",
|
|
716
|
+
},
|
|
717
|
+
inputSchema: {
|
|
718
|
+
type: 'object',
|
|
719
|
+
properties: { requirementId: { type: 'string', format: 'uuid' } },
|
|
720
|
+
required: ['requirementId'],
|
|
721
|
+
},
|
|
722
|
+
},
|
|
723
|
+
// === Releases (10) ===
|
|
724
|
+
{
|
|
725
|
+
name: 'list_releases',
|
|
726
|
+
description: {
|
|
727
|
+
tr: 'Projedeki sürümleri (release) listeler. status filtresi destekler. coveragePercent, overallPassRate, readinessScore otomatik hesaplanır.',
|
|
728
|
+
en: 'Lists releases in a project. Supports status filter. coveragePercent / overallPassRate / readinessScore are auto-computed.',
|
|
729
|
+
},
|
|
730
|
+
inputSchema: {
|
|
731
|
+
type: 'object',
|
|
732
|
+
properties: {
|
|
733
|
+
...REQ_PROJECT_ID,
|
|
734
|
+
status: {
|
|
735
|
+
type: 'string',
|
|
736
|
+
enum: ['planning', 'testing', 'ready', 'released', 'cancelled'],
|
|
737
|
+
},
|
|
738
|
+
limit: { type: 'number', minimum: 1, maximum: 500, default: 100 },
|
|
739
|
+
},
|
|
740
|
+
required: ['projectId'],
|
|
741
|
+
},
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
name: 'get_release',
|
|
745
|
+
description: {
|
|
746
|
+
tr: 'Sürüm detayı — birleşik test koşumları (direkt + gereksinim üzerinden miras) ve koşum bazlı istatistikler dahil.',
|
|
747
|
+
en: 'Release detail — merged test runs (direct + inherited via requirements) with per-run statistics.',
|
|
748
|
+
},
|
|
749
|
+
inputSchema: {
|
|
750
|
+
type: 'object',
|
|
751
|
+
properties: { releaseId: { type: 'string', format: 'uuid' } },
|
|
752
|
+
required: ['releaseId'],
|
|
753
|
+
},
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
name: 'create_release',
|
|
757
|
+
description: {
|
|
758
|
+
tr: 'Yeni sürüm oluşturur. status varsayılan "planning". jiraFixVersionId veya jiraSprintId ile Jira scope bağlanabilir. idempotencyKey ile tekrar denemeler güvenli.',
|
|
759
|
+
en: 'Creates a new release. status defaults to "planning". Optional jiraFixVersionId / jiraSprintId binds Jira scope. idempotencyKey makes retries safe.',
|
|
760
|
+
},
|
|
761
|
+
inputSchema: {
|
|
762
|
+
type: 'object',
|
|
763
|
+
properties: {
|
|
764
|
+
...REQ_PROJECT_ID,
|
|
765
|
+
name: { type: 'string', minLength: 1, maxLength: 200 },
|
|
766
|
+
version: { type: 'string', maxLength: 50 },
|
|
767
|
+
description: { type: 'string', maxLength: 10000 },
|
|
768
|
+
status: {
|
|
769
|
+
type: 'string',
|
|
770
|
+
enum: ['planning', 'testing', 'ready', 'released', 'cancelled'],
|
|
771
|
+
},
|
|
772
|
+
plannedDate: { type: 'string', format: 'date-time' },
|
|
773
|
+
jiraFixVersion: { type: 'string', maxLength: 200 },
|
|
774
|
+
jiraFixVersionId: { type: 'string', maxLength: 100 },
|
|
775
|
+
jiraSprintId: { type: 'string', maxLength: 100 },
|
|
776
|
+
jiraSprintName: { type: 'string', maxLength: 200 },
|
|
777
|
+
releaseNotes: { type: 'string' },
|
|
778
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
779
|
+
},
|
|
780
|
+
required: ['projectId', 'name'],
|
|
781
|
+
},
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
name: 'update_release',
|
|
785
|
+
description: {
|
|
786
|
+
tr: 'Sürüm alanlarını günceller (partial). status "released" yapılırsa actualDate otomatik atanır. idempotencyKey destekler.',
|
|
787
|
+
en: 'Partial update of release fields. Setting status="released" auto-sets actualDate if missing. Supports idempotencyKey.',
|
|
788
|
+
},
|
|
789
|
+
inputSchema: {
|
|
790
|
+
type: 'object',
|
|
791
|
+
properties: {
|
|
792
|
+
releaseId: { type: 'string', format: 'uuid' },
|
|
793
|
+
name: { type: 'string', minLength: 1, maxLength: 200 },
|
|
794
|
+
version: { type: 'string', maxLength: 50 },
|
|
795
|
+
description: { type: 'string', maxLength: 10000 },
|
|
796
|
+
status: {
|
|
797
|
+
type: 'string',
|
|
798
|
+
enum: ['planning', 'testing', 'ready', 'released', 'cancelled'],
|
|
799
|
+
},
|
|
800
|
+
plannedDate: { type: 'string', format: 'date-time' },
|
|
801
|
+
actualDate: { type: 'string', format: 'date-time' },
|
|
802
|
+
jiraFixVersion: { type: 'string', maxLength: 200 },
|
|
803
|
+
jiraFixVersionId: { type: 'string', maxLength: 100 },
|
|
804
|
+
jiraSprintId: { type: 'string', maxLength: 100 },
|
|
805
|
+
jiraSprintName: { type: 'string', maxLength: 200 },
|
|
806
|
+
releaseNotes: { type: 'string' },
|
|
807
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
808
|
+
},
|
|
809
|
+
required: ['releaseId'],
|
|
810
|
+
},
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
name: 'delete_release',
|
|
814
|
+
description: {
|
|
815
|
+
tr: 'Sürümü soft-delete eder. Bağlı test koşumları ve gereksinimler etkilenmez. 2-aşamalı confirmation (1. çağrı confirmationToken döner; 2. çağrıda gönderin).',
|
|
816
|
+
en: 'Soft-deletes a release. Linked test runs and requirements remain intact. 2-step confirmation (1st call returns confirmationToken; 2nd must include it).',
|
|
817
|
+
},
|
|
818
|
+
inputSchema: {
|
|
819
|
+
type: 'object',
|
|
820
|
+
properties: {
|
|
821
|
+
releaseId: { type: 'string', format: 'uuid' },
|
|
822
|
+
confirmationToken: { type: 'string' },
|
|
823
|
+
},
|
|
824
|
+
required: ['releaseId'],
|
|
825
|
+
},
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
name: 'add_requirement_to_release',
|
|
829
|
+
description: {
|
|
830
|
+
tr: 'Bir gereksinimi sürüme ekler. Bu gereksinime bağlı test case\'ler içeren test koşumları otomatik olarak sürüme miras yoluyla bağlanır.',
|
|
831
|
+
en: 'Links a requirement to a release. Test runs whose cases are tied to that requirement are auto-linked (inherited) to the release.',
|
|
832
|
+
},
|
|
833
|
+
inputSchema: {
|
|
834
|
+
type: 'object',
|
|
835
|
+
properties: {
|
|
836
|
+
releaseId: { type: 'string', format: 'uuid' },
|
|
837
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
838
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
839
|
+
},
|
|
840
|
+
required: ['releaseId', 'requirementId'],
|
|
841
|
+
},
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
name: 'remove_requirement_from_release',
|
|
845
|
+
description: {
|
|
846
|
+
tr: 'Sürümden gereksinim bağlantısını kaldırır. Zaten bağlı değilse no-op döner — idempotent.',
|
|
847
|
+
en: 'Unlinks a requirement from a release. No-op if not linked — idempotent.',
|
|
848
|
+
},
|
|
849
|
+
inputSchema: {
|
|
850
|
+
type: 'object',
|
|
851
|
+
properties: {
|
|
852
|
+
releaseId: { type: 'string', format: 'uuid' },
|
|
853
|
+
requirementId: { type: 'string', format: 'uuid' },
|
|
854
|
+
},
|
|
855
|
+
required: ['releaseId', 'requirementId'],
|
|
856
|
+
},
|
|
857
|
+
},
|
|
858
|
+
{
|
|
859
|
+
name: 'bulk_remove_requirements_from_release',
|
|
860
|
+
description: {
|
|
861
|
+
tr: 'Sürümden birden fazla gereksinim bağlantısını tek seferde kaldırır (max 500). Bağlı olmayan ID\'ler sessizce atlanır — inherently idempotent.',
|
|
862
|
+
en: 'Bulk-unlink multiple requirements from a release (max 500). Non-linked IDs are silently skipped — inherently idempotent.',
|
|
863
|
+
},
|
|
864
|
+
inputSchema: {
|
|
865
|
+
type: 'object',
|
|
866
|
+
properties: {
|
|
867
|
+
releaseId: { type: 'string', format: 'uuid' },
|
|
868
|
+
requirementIds: {
|
|
869
|
+
type: 'array',
|
|
870
|
+
items: { type: 'string', format: 'uuid' },
|
|
871
|
+
minItems: 1,
|
|
872
|
+
maxItems: 500,
|
|
873
|
+
},
|
|
874
|
+
},
|
|
875
|
+
required: ['releaseId', 'requirementIds'],
|
|
876
|
+
},
|
|
877
|
+
},
|
|
878
|
+
{
|
|
879
|
+
name: 'add_test_run_to_release',
|
|
880
|
+
description: {
|
|
881
|
+
tr: 'Bir test koşumunu sürüme direkt olarak bağlar. runType ile koşumun tipini (feature/regression/smoke/re_test/custom) belirleyin.',
|
|
882
|
+
en: 'Directly attaches a test run to a release. Use runType to classify (feature/regression/smoke/re_test/custom).',
|
|
883
|
+
},
|
|
884
|
+
inputSchema: {
|
|
885
|
+
type: 'object',
|
|
886
|
+
properties: {
|
|
887
|
+
releaseId: { type: 'string', format: 'uuid' },
|
|
888
|
+
testRunId: { type: 'string', format: 'uuid' },
|
|
889
|
+
runType: {
|
|
890
|
+
type: 'string',
|
|
891
|
+
enum: ['feature', 'regression', 'smoke', 're_test', 'custom'],
|
|
892
|
+
default: 'feature',
|
|
893
|
+
},
|
|
894
|
+
label: { type: 'string', maxLength: 200 },
|
|
895
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
896
|
+
},
|
|
897
|
+
required: ['releaseId', 'testRunId'],
|
|
898
|
+
},
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
name: 'get_release_readiness',
|
|
902
|
+
description: {
|
|
903
|
+
tr: 'Sürüm release hazırlık skoru (60% pass rate + 40% coverage), gate pass/fail listesi, blocker listesi. NOT_READY/AT_RISK/READY durumu döner.',
|
|
904
|
+
en: 'Release readiness score (60% pass rate + 40% coverage), gates pass/fail array, blockers list. Returns NOT_READY / AT_RISK / READY status.',
|
|
905
|
+
},
|
|
906
|
+
inputSchema: {
|
|
907
|
+
type: 'object',
|
|
908
|
+
properties: { releaseId: { type: 'string', format: 'uuid' } },
|
|
909
|
+
required: ['releaseId'],
|
|
910
|
+
},
|
|
911
|
+
},
|
|
912
|
+
// === Users (2) ===
|
|
913
|
+
{
|
|
914
|
+
name: 'list_users',
|
|
915
|
+
description: {
|
|
916
|
+
tr: 'Bir projeye atanmış kullanıcıları listeler (id, email, ad, soyad, rol).',
|
|
917
|
+
en: 'Lists users assigned to a project (id, email, firstName, lastName, role).',
|
|
918
|
+
},
|
|
919
|
+
inputSchema: {
|
|
920
|
+
type: 'object',
|
|
921
|
+
properties: {
|
|
922
|
+
...REQ_PROJECT_ID,
|
|
923
|
+
limit: { type: 'number', minimum: 1, maximum: 500, default: 100 },
|
|
924
|
+
},
|
|
925
|
+
required: ['projectId'],
|
|
926
|
+
},
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
name: 'get_user',
|
|
930
|
+
description: {
|
|
931
|
+
tr: 'Kullanıcı detaylarını döner — rol, departman, son giriş, proje üyeliği sayısı dahil.',
|
|
932
|
+
en: 'Returns user details — role, department, last login, project membership count.',
|
|
933
|
+
},
|
|
934
|
+
inputSchema: {
|
|
935
|
+
type: 'object',
|
|
936
|
+
properties: { userId: { type: 'string', format: 'uuid' } },
|
|
937
|
+
required: ['userId'],
|
|
938
|
+
},
|
|
939
|
+
},
|
|
940
|
+
// === Tags (1) ===
|
|
941
|
+
{
|
|
942
|
+
name: 'list_tags',
|
|
943
|
+
description: {
|
|
944
|
+
tr: "Projedeki test case'lerde kullanılan tüm benzersiz etiketleri alfabetik olarak listeler.",
|
|
945
|
+
en: 'Lists all unique tags used in test cases of a project, alphabetically sorted.',
|
|
946
|
+
},
|
|
947
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
948
|
+
},
|
|
949
|
+
// === Custom Fields (1) ===
|
|
950
|
+
{
|
|
951
|
+
name: 'list_custom_fields',
|
|
952
|
+
description: {
|
|
953
|
+
tr: 'Tenant kapsamındaki özel alan tanımlarını listeler (id, name, type, required, options).',
|
|
954
|
+
en: 'Lists tenant-scoped custom field definitions (id, name, type, required, options).',
|
|
955
|
+
},
|
|
956
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
957
|
+
},
|
|
958
|
+
// === Webhooks (1) ===
|
|
959
|
+
{
|
|
960
|
+
name: 'list_webhooks',
|
|
961
|
+
description: {
|
|
962
|
+
tr: 'Projeye veya tenant geneline tanımlı webhook listesini döner (url, events, enabled).',
|
|
963
|
+
en: 'Lists webhooks scoped to the project or tenant-wide (url, events, enabled).',
|
|
964
|
+
},
|
|
965
|
+
inputSchema: { type: 'object', properties: REQ_PROJECT_ID, required: ['projectId'] },
|
|
966
|
+
},
|
|
967
|
+
// === Pipelines (1) ===
|
|
968
|
+
{
|
|
969
|
+
name: 'list_pipelines',
|
|
970
|
+
description: {
|
|
971
|
+
tr: "Projedeki CI/CD pipeline'larını ve son koşum durumlarını listeler.",
|
|
972
|
+
en: 'Lists CI/CD pipelines for a project with their most recent run status.',
|
|
973
|
+
},
|
|
974
|
+
inputSchema: {
|
|
975
|
+
type: 'object',
|
|
976
|
+
properties: {
|
|
977
|
+
...REQ_PROJECT_ID,
|
|
978
|
+
limit: { type: 'number', minimum: 1, maximum: 100, default: 20 },
|
|
979
|
+
},
|
|
980
|
+
required: ['projectId'],
|
|
981
|
+
},
|
|
982
|
+
},
|
|
983
|
+
// === Dashboard (1) ===
|
|
984
|
+
{
|
|
985
|
+
name: 'get_dashboard_metrics',
|
|
986
|
+
description: {
|
|
987
|
+
tr: "Proje için analitik özeti (toplam case, run, pass rate, recent failures, top flaky, ortalama yürütme süresi). days=30 varsayılan.",
|
|
988
|
+
en: 'Analytics digest for a project (total cases, runs, pass rate, recent failures, top flaky, avg execution time). days defaults to 30.',
|
|
989
|
+
},
|
|
990
|
+
inputSchema: {
|
|
991
|
+
type: 'object',
|
|
992
|
+
properties: {
|
|
993
|
+
...REQ_PROJECT_ID,
|
|
994
|
+
days: { type: 'number', minimum: 1, maximum: 365, default: 30 },
|
|
995
|
+
},
|
|
996
|
+
required: ['projectId'],
|
|
997
|
+
},
|
|
998
|
+
},
|
|
999
|
+
// === Test Case Attachments (1) ===
|
|
1000
|
+
{
|
|
1001
|
+
name: 'add_test_case_attachment',
|
|
1002
|
+
description: {
|
|
1003
|
+
tr: "Bir test case'e dış URL üzerinden kanıt (screenshot, log dosyası vb.) ekler. Dosya bytes'ı yüklenmez — URL referansı saklanır. mime tipi otomatik olarak IMAGE/VIDEO/DOCUMENT/OTHER kategorisine eşlenir.",
|
|
1004
|
+
en: 'Attaches external evidence to a test case via URL (screenshot, log file, etc.). File bytes are NOT uploaded — only the URL reference is stored. The mime type auto-maps to IMAGE/VIDEO/DOCUMENT/OTHER.',
|
|
1005
|
+
},
|
|
1006
|
+
inputSchema: {
|
|
1007
|
+
type: 'object',
|
|
1008
|
+
properties: {
|
|
1009
|
+
caseId: { type: 'string', format: 'uuid' },
|
|
1010
|
+
url: { type: 'string', format: 'uri', maxLength: 2048 },
|
|
1011
|
+
mime: { type: 'string', minLength: 1, maxLength: 200, description: 'MIME type (e.g. image/png, text/plain)' },
|
|
1012
|
+
filename: { type: 'string', maxLength: 255, description: 'Optional display name — derived from URL if omitted' },
|
|
1013
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
1014
|
+
},
|
|
1015
|
+
required: ['caseId', 'url', 'mime'],
|
|
1016
|
+
},
|
|
1017
|
+
},
|
|
1018
|
+
// === Test Case Comments (1) ===
|
|
1019
|
+
{
|
|
1020
|
+
name: 'add_test_case_comment',
|
|
1021
|
+
description: {
|
|
1022
|
+
tr: "Bir test case'e markdown destekli yorum ekler. mentions[] parametresine UUID listesi geçirilirse @-mention bildirimleri (e-posta + uygulama içi) otomatik tetiklenir.",
|
|
1023
|
+
en: 'Adds a markdown-formatted comment to a test case. If mentions[] is provided as user UUIDs, @-mention notifications (email + in-app) are auto-fanned-out via the existing notification queue.',
|
|
1024
|
+
},
|
|
1025
|
+
inputSchema: {
|
|
1026
|
+
type: 'object',
|
|
1027
|
+
properties: {
|
|
1028
|
+
caseId: { type: 'string', format: 'uuid' },
|
|
1029
|
+
body: { type: 'string', minLength: 1, maxLength: 10000 },
|
|
1030
|
+
mentions: {
|
|
1031
|
+
type: 'array',
|
|
1032
|
+
items: { type: 'string', format: 'uuid' },
|
|
1033
|
+
maxItems: 50,
|
|
1034
|
+
description: 'Optional user UUIDs to notify. Injected as @[user](uuid) at the end of the body.',
|
|
1035
|
+
},
|
|
1036
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
1037
|
+
},
|
|
1038
|
+
required: ['caseId', 'body'],
|
|
1039
|
+
},
|
|
1040
|
+
},
|
|
1041
|
+
// === Scheduled Runs (3) ===
|
|
1042
|
+
{
|
|
1043
|
+
name: 'list_scheduled_runs',
|
|
1044
|
+
description: {
|
|
1045
|
+
tr: 'Projedeki zamanlanmış test koşumlarını listeler. status filtresi (active/paused/completed/failed) destekler. cronExpression, nextRunAt, lastRunAt ve enabled boolean alanı döner.',
|
|
1046
|
+
en: 'Lists scheduled test runs for a project. Supports status filter (active/paused/completed/failed). Returns cronExpression, nextRunAt, lastRunAt and a flattened `enabled` boolean.',
|
|
1047
|
+
},
|
|
1048
|
+
inputSchema: {
|
|
1049
|
+
type: 'object',
|
|
1050
|
+
properties: {
|
|
1051
|
+
...REQ_PROJECT_ID,
|
|
1052
|
+
status: { type: 'string', enum: ['active', 'paused', 'completed', 'failed'] },
|
|
1053
|
+
limit: { type: 'number', minimum: 1, maximum: 500, default: 100 },
|
|
1054
|
+
},
|
|
1055
|
+
required: ['projectId'],
|
|
1056
|
+
},
|
|
1057
|
+
},
|
|
1058
|
+
{
|
|
1059
|
+
name: 'create_scheduled_run',
|
|
1060
|
+
description: {
|
|
1061
|
+
tr: "Belirtilen test paketi için zamanlanmış bir koşum oluşturur. schedule.type='cron' → CUSTOM frequency + cron expression; schedule.type='interval' → DAILY frequency, expression ISO date olarak parse edilir. enabled=false ile pasif başlatılabilir.",
|
|
1062
|
+
en: "Creates a scheduled test run for a suite. schedule.type='cron' → CUSTOM frequency + cron expression; schedule.type='interval' → DAILY frequency, expression parsed as ISO date. Set enabled=false to start paused.",
|
|
1063
|
+
},
|
|
1064
|
+
inputSchema: {
|
|
1065
|
+
type: 'object',
|
|
1066
|
+
properties: {
|
|
1067
|
+
...REQ_PROJECT_ID,
|
|
1068
|
+
name: { type: 'string', minLength: 1, maxLength: 200 },
|
|
1069
|
+
suiteId: { type: 'string', format: 'uuid' },
|
|
1070
|
+
schedule: {
|
|
1071
|
+
type: 'object',
|
|
1072
|
+
properties: {
|
|
1073
|
+
type: { type: 'string', enum: ['cron', 'interval'] },
|
|
1074
|
+
expression: { type: 'string', minLength: 1, maxLength: 200 },
|
|
1075
|
+
},
|
|
1076
|
+
required: ['type', 'expression'],
|
|
1077
|
+
},
|
|
1078
|
+
enabled: { type: 'boolean', default: true },
|
|
1079
|
+
timezone: { type: 'string', maxLength: 100, default: 'UTC' },
|
|
1080
|
+
idempotencyKey: { type: 'string', maxLength: 64 },
|
|
1081
|
+
},
|
|
1082
|
+
required: ['projectId', 'name', 'suiteId', 'schedule'],
|
|
1083
|
+
},
|
|
1084
|
+
},
|
|
1085
|
+
{
|
|
1086
|
+
name: 'pause_scheduled_run',
|
|
1087
|
+
description: {
|
|
1088
|
+
tr: 'Aktif bir zamanlanmış koşumu duraklatır (status=paused). Resume için update_scheduled_run veya UI üzerinden devam ettirilebilir.',
|
|
1089
|
+
en: 'Pauses an active scheduled run (status=paused). Use update_scheduled_run or the UI to resume.',
|
|
1090
|
+
},
|
|
1091
|
+
inputSchema: {
|
|
1092
|
+
type: 'object',
|
|
1093
|
+
properties: { scheduledRunId: { type: 'string', format: 'uuid' } },
|
|
1094
|
+
required: ['scheduledRunId'],
|
|
1095
|
+
},
|
|
1096
|
+
},
|
|
1097
|
+
// === Meta tools (2) ===
|
|
1098
|
+
{
|
|
1099
|
+
name: 'get_my_quota',
|
|
1100
|
+
description: {
|
|
1101
|
+
tr: "Token'ın scope'larını, erişebildiği projeleri ve rate limit'lerini gösterir.",
|
|
1102
|
+
en: "Shows your token's scopes, accessible projects, and rate limits.",
|
|
1103
|
+
},
|
|
1104
|
+
inputSchema: { type: 'object', properties: {} },
|
|
1105
|
+
},
|
|
1106
|
+
{
|
|
1107
|
+
name: 'get_schema',
|
|
1108
|
+
description: {
|
|
1109
|
+
tr: "Tüm tool'ların listesini veya belirli bir tool'un şemasını döner.",
|
|
1110
|
+
en: 'Returns list of all tools or schema of a specific tool.',
|
|
1111
|
+
},
|
|
1112
|
+
inputSchema: {
|
|
1113
|
+
type: 'object',
|
|
1114
|
+
properties: {
|
|
1115
|
+
toolName: { type: 'string' },
|
|
1116
|
+
},
|
|
1117
|
+
},
|
|
1118
|
+
},
|
|
1119
|
+
];
|
|
1120
|
+
//# sourceMappingURL=index.js.map
|