common-qa-mcp 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/adapters/factory.d.ts +1 -1
  2. package/dist/adapters/factory.d.ts.map +1 -1
  3. package/dist/adapters/factory.js +12 -29
  4. package/dist/adapters/factory.js.map +1 -1
  5. package/dist/adapters/http.js +2 -3
  6. package/dist/adapters/http.js.map +1 -1
  7. package/dist/adapters/remoteMcp/adapter.d.ts +7 -2
  8. package/dist/adapters/remoteMcp/adapter.d.ts.map +1 -1
  9. package/dist/adapters/remoteMcp/adapter.js +9 -3
  10. package/dist/adapters/remoteMcp/adapter.js.map +1 -1
  11. package/dist/adapters/simplifyqa/adapter.d.ts +306 -23
  12. package/dist/adapters/simplifyqa/adapter.d.ts.map +1 -1
  13. package/dist/adapters/simplifyqa/adapter.js +2033 -86
  14. package/dist/adapters/simplifyqa/adapter.js.map +1 -1
  15. package/dist/adapters/simplifyqa/mapper.d.ts +43 -11
  16. package/dist/adapters/simplifyqa/mapper.d.ts.map +1 -1
  17. package/dist/adapters/simplifyqa/mapper.js +470 -21
  18. package/dist/adapters/simplifyqa/mapper.js.map +1 -1
  19. package/dist/adapters/types.d.ts +121 -5
  20. package/dist/adapters/types.d.ts.map +1 -1
  21. package/dist/adapters/walnut/adapter.d.ts +6 -2
  22. package/dist/adapters/walnut/adapter.d.ts.map +1 -1
  23. package/dist/adapters/walnut/adapter.js +33 -2
  24. package/dist/adapters/walnut/adapter.js.map +1 -1
  25. package/dist/adapters/walnut/mapper.d.ts +2 -1
  26. package/dist/adapters/walnut/mapper.d.ts.map +1 -1
  27. package/dist/adapters/walnut/mapper.js +13 -0
  28. package/dist/adapters/walnut/mapper.js.map +1 -1
  29. package/dist/config.d.ts +10 -0
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +36 -0
  32. package/dist/config.js.map +1 -1
  33. package/dist/connection.d.ts.map +1 -1
  34. package/dist/connection.js +15 -7
  35. package/dist/connection.js.map +1 -1
  36. package/dist/domain/types.d.ts +485 -4
  37. package/dist/domain/types.d.ts.map +1 -1
  38. package/dist/initAgents.d.ts.map +1 -1
  39. package/dist/initAgents.js +22 -9
  40. package/dist/initAgents.js.map +1 -1
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/server.js +23 -1
  43. package/dist/server.js.map +1 -1
  44. package/dist/tools/backlog.tools.d.ts +13 -0
  45. package/dist/tools/backlog.tools.d.ts.map +1 -0
  46. package/dist/tools/backlog.tools.js +399 -0
  47. package/dist/tools/backlog.tools.js.map +1 -0
  48. package/dist/tools/defects.tools.d.ts +7 -0
  49. package/dist/tools/defects.tools.d.ts.map +1 -0
  50. package/dist/tools/defects.tools.js +82 -0
  51. package/dist/tools/defects.tools.js.map +1 -0
  52. package/dist/tools/discovery.tools.d.ts.map +1 -1
  53. package/dist/tools/discovery.tools.js +871 -55
  54. package/dist/tools/discovery.tools.js.map +1 -1
  55. package/dist/tools/markdown.d.ts +3 -3
  56. package/dist/tools/markdown.d.ts.map +1 -1
  57. package/dist/tools/markdown.js +89 -18
  58. package/dist/tools/markdown.js.map +1 -1
  59. package/dist/tools/objects.tools.d.ts +7 -0
  60. package/dist/tools/objects.tools.d.ts.map +1 -0
  61. package/dist/tools/objects.tools.js +201 -0
  62. package/dist/tools/objects.tools.js.map +1 -0
  63. package/dist/tools/recording.tools.d.ts.map +1 -1
  64. package/dist/tools/recording.tools.js +64 -5
  65. package/dist/tools/recording.tools.js.map +1 -1
  66. package/dist/tools/run.tools.d.ts.map +1 -1
  67. package/dist/tools/run.tools.js +102 -18
  68. package/dist/tools/run.tools.js.map +1 -1
  69. package/dist/tools/schemas.d.ts +21 -4
  70. package/dist/tools/schemas.d.ts.map +1 -1
  71. package/dist/tools/schemas.js +14 -1
  72. package/dist/tools/schemas.js.map +1 -1
  73. package/dist/tools/tasks.tools.d.ts +7 -0
  74. package/dist/tools/tasks.tools.d.ts.map +1 -0
  75. package/dist/tools/tasks.tools.js +75 -0
  76. package/dist/tools/tasks.tools.js.map +1 -0
  77. package/dist/tools/testcase.tools.d.ts.map +1 -1
  78. package/dist/tools/testcase.tools.js +146 -100
  79. package/dist/tools/testcase.tools.js.map +1 -1
  80. package/dist/tools/testdata.tools.d.ts.map +1 -1
  81. package/dist/tools/testdata.tools.js +99 -11
  82. package/dist/tools/testdata.tools.js.map +1 -1
  83. package/package.json +3 -3
@@ -0,0 +1,399 @@
1
+ import { z } from 'zod';
2
+ import { ok, err } from '../mcpResult.js';
3
+ const NOT_CONNECTED = 'Not connected to a product. Use qa_connect first — backlog CRUD needs a live backend.';
4
+ function describeError(e) {
5
+ return e instanceof Error ? e.message : String(e);
6
+ }
7
+ function escCell(v) {
8
+ return String(v ?? '').replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
9
+ }
10
+ function totalOf(rows) {
11
+ const t = rows.totalCount;
12
+ return typeof t === 'number' ? t : undefined;
13
+ }
14
+ function countHeader(rows, singular, plural = singular + 's') {
15
+ const shown = rows.length;
16
+ const total = totalOf(rows) ?? shown;
17
+ const word = total === 1 ? singular : plural;
18
+ return total > shown ? `Showing ${shown} of ${total} ${word}` : `${total} ${word}`;
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // Shared user-filter fields (matches story_list) — passed to every list tool.
22
+ // ---------------------------------------------------------------------------
23
+ const userFilterShape = {
24
+ createdBy: z.string().optional().describe('Numeric userId of the creator. Pass "me" to filter by the current caller. Resolve names via list_users first.'),
25
+ updatedBy: z.string().optional().describe('Numeric userId of the last updater. Pass "me" for the current caller. Resolve names via list_users first.'),
26
+ ownerId: z.string().optional().describe('Numeric userId of the owner (assignee). Pass "me" for the current caller. Resolve names via list_users first.'),
27
+ };
28
+ export function registerBacklogTools(server, deps) {
29
+ // ------------------------------------------------------------------------- Epics
30
+ server.registerTool('epic_list', {
31
+ title: 'List / search epics',
32
+ description: 'Pull up EPICS in the connected project — id, key (EP_…), name, state. Top of the backlog ' +
33
+ 'hierarchy: epic → feature → story. Use `search` for keyword matches on name. Requires a live ' +
34
+ 'connection. Read-only.',
35
+ inputSchema: {
36
+ search: z.string().optional().describe('Keyword match on epic name.'),
37
+ state: z.string().optional().describe('Filter by state (must match the project state config).'),
38
+ limit: z.number().int().positive().optional(),
39
+ offset: z.number().int().nonnegative().optional(),
40
+ ...userFilterShape,
41
+ },
42
+ annotations: { readOnlyHint: true },
43
+ }, async ({ search, state, limit, offset, createdBy, updatedBy, ownerId }) => {
44
+ const adapter = deps.getAdapter();
45
+ if (!adapter)
46
+ return err(NOT_CONNECTED);
47
+ if (!adapter.listEpics)
48
+ return err('This product does not expose epics.');
49
+ try {
50
+ const rows = await adapter.listEpics({
51
+ ...(search ? { search } : {}),
52
+ ...(state ? { state } : {}),
53
+ ...(limit != null ? { limit } : {}),
54
+ ...(offset != null ? { offset } : {}),
55
+ ...(createdBy ? { createdBy } : {}),
56
+ ...(updatedBy ? { updatedBy } : {}),
57
+ ...(ownerId ? { ownerId } : {}),
58
+ });
59
+ if (!rows.length)
60
+ return ok('No epics found.', { epics: [], totalCount: totalOf(rows) ?? 0 });
61
+ const text = `${countHeader(rows, 'epic')}:\n\n` +
62
+ '| key | name | state |\n|---|---|---|\n' +
63
+ rows.map((e) => `| ${escCell(e.key ?? e.id)} | ${escCell(e.name)} | ${escCell(e.state ?? '-')} |`).join('\n');
64
+ return ok(text, { epics: rows, totalCount: totalOf(rows) ?? rows.length });
65
+ }
66
+ catch (e) {
67
+ return err(describeError(e));
68
+ }
69
+ });
70
+ server.registerTool('epic_get', {
71
+ title: 'Read one epic',
72
+ description: 'Read a single EPIC — name, state, description, dates, effort — by id or business key (EP_123). ' +
73
+ 'Requires a live connection. Read-only.',
74
+ inputSchema: { id: z.string().describe('Epic id or business key (EP_123).') },
75
+ annotations: { readOnlyHint: true },
76
+ }, async ({ id }) => {
77
+ const adapter = deps.getAdapter();
78
+ if (!adapter)
79
+ return err(NOT_CONNECTED);
80
+ if (!adapter.getEpic)
81
+ return err('This product does not expose epics.');
82
+ try {
83
+ const epic = await adapter.getEpic(id);
84
+ const header = `**${epic.name}**${epic.key ? ` · ${epic.key}` : ''}${epic.state ? ` · ${epic.state}` : ''}`;
85
+ const desc = epic.description ? `\n\n${epic.description}` : '';
86
+ const dates = (epic.plannedStartDate || epic.plannedEndDate)
87
+ ? `\n\n_Planned:_ ${epic.plannedStartDate ?? '—'} → ${epic.plannedEndDate ?? '—'}`
88
+ : '';
89
+ return ok(`${header}${desc}${dates}`, { epic });
90
+ }
91
+ catch (e) {
92
+ return err(describeError(e));
93
+ }
94
+ });
95
+ server.registerTool('epic_create', {
96
+ title: 'Create an epic',
97
+ description: 'Create a new EPIC in the connected project. `projectIds` defaults to the current project when ' +
98
+ 'omitted. Backend requires `name`, `state`, `estimatedEffort`, `plannedStartDate`, ' +
99
+ '`plannedEndDate` — state must match an existing state in the project config (use epic_list ' +
100
+ 'or epic_get on an existing epic to see valid values).',
101
+ inputSchema: {
102
+ name: z.string().min(3).max(500).describe('Epic name (3–500 chars).'),
103
+ state: z.string().describe('State — must match the project state config.'),
104
+ estimatedEffort: z.number().nonnegative().describe('Estimated effort (hours).'),
105
+ plannedStartDate: z.string().describe('ISO date/datetime for planned start.'),
106
+ plannedEndDate: z.string().describe('ISO date/datetime for planned end.'),
107
+ projectIds: z.array(z.number()).optional().describe('Project ids the epic belongs to. Defaults to [currentProject].'),
108
+ ownerId: z.number().optional().describe('Numeric userId of the epic owner.'),
109
+ description: z.string().optional(),
110
+ tags: z.array(z.string()).optional(),
111
+ teamId: z.array(z.number()).optional(),
112
+ actualStartDate: z.string().optional(),
113
+ actualEndDate: z.string().optional(),
114
+ actualEffort: z.number().optional(),
115
+ remainingEffort: z.number().optional(),
116
+ plannedBudget: z.number().optional(),
117
+ customFields: z.record(z.string(), z.unknown()).optional(),
118
+ },
119
+ }, async (input) => {
120
+ const adapter = deps.getAdapter();
121
+ if (!adapter)
122
+ return err(NOT_CONNECTED);
123
+ if (!adapter.createEpic)
124
+ return err('This product does not expose epic creation.');
125
+ try {
126
+ const ref = await adapter.createEpic(input);
127
+ return ok(`Created epic \`${ref.id}\`.`, { savedRef: ref });
128
+ }
129
+ catch (e) {
130
+ return err(describeError(e));
131
+ }
132
+ });
133
+ server.registerTool('epic_update', {
134
+ title: 'Update an epic (partial)',
135
+ description: 'PATCH an existing EPIC — pass only the fields to change plus `updateVersion` (optimistic ' +
136
+ 'concurrency, from the last epic_get). Accepts id or business key (EP_123). ' +
137
+ 'Cannot rename the epic to a duplicate of another epic in the same customer.',
138
+ inputSchema: {
139
+ id: z.string().describe('Epic id or business key (EP_123).'),
140
+ name: z.string().min(3).max(500).optional(),
141
+ state: z.string().optional(),
142
+ estimatedEffort: z.number().optional(),
143
+ plannedStartDate: z.string().optional(),
144
+ plannedEndDate: z.string().optional(),
145
+ projectIds: z.array(z.number()).optional(),
146
+ ownerId: z.number().optional(),
147
+ description: z.string().optional(),
148
+ tags: z.array(z.string()).optional(),
149
+ teamId: z.array(z.number()).optional(),
150
+ actualStartDate: z.string().optional(),
151
+ actualEndDate: z.string().optional(),
152
+ actualEffort: z.number().optional(),
153
+ remainingEffort: z.number().optional(),
154
+ plannedBudget: z.number().optional(),
155
+ customFields: z.record(z.string(), z.unknown()).optional(),
156
+ updateVersion: z.number().optional().describe('Optimistic-concurrency version from the last read.'),
157
+ },
158
+ }, async ({ id, ...patch }) => {
159
+ const adapter = deps.getAdapter();
160
+ if (!adapter)
161
+ return err(NOT_CONNECTED);
162
+ if (!adapter.updateEpic)
163
+ return err('This product does not expose epic updates.');
164
+ try {
165
+ const ref = await adapter.updateEpic(id, patch);
166
+ return ok(`Updated epic \`${ref.id || id}\`.`, { savedRef: ref });
167
+ }
168
+ catch (e) {
169
+ return err(describeError(e));
170
+ }
171
+ });
172
+ // ------------------------------------------------------------------------- Features
173
+ server.registerTool('feature_list', {
174
+ title: 'List / search features',
175
+ description: 'Pull up FEATURES in the connected project — id, key (FT_…), name, state, parent epic. Middle ' +
176
+ 'of the backlog hierarchy. Pass `epicId` to list features under a specific epic. Requires a ' +
177
+ 'live connection. Read-only.',
178
+ inputSchema: {
179
+ search: z.string().optional().describe('Keyword match on feature name.'),
180
+ state: z.string().optional(),
181
+ epicId: z.string().optional().describe('Only features under this parent epic id.'),
182
+ limit: z.number().int().positive().optional(),
183
+ offset: z.number().int().nonnegative().optional(),
184
+ ...userFilterShape,
185
+ },
186
+ annotations: { readOnlyHint: true },
187
+ }, async ({ search, state, epicId, limit, offset, createdBy, updatedBy, ownerId }) => {
188
+ const adapter = deps.getAdapter();
189
+ if (!adapter)
190
+ return err(NOT_CONNECTED);
191
+ if (!adapter.listFeatures)
192
+ return err('This product does not expose features.');
193
+ try {
194
+ const rows = await adapter.listFeatures({
195
+ ...(search ? { search } : {}),
196
+ ...(state ? { state } : {}),
197
+ ...(epicId ? { epicId } : {}),
198
+ ...(limit != null ? { limit } : {}),
199
+ ...(offset != null ? { offset } : {}),
200
+ ...(createdBy ? { createdBy } : {}),
201
+ ...(updatedBy ? { updatedBy } : {}),
202
+ ...(ownerId ? { ownerId } : {}),
203
+ });
204
+ if (!rows.length)
205
+ return ok('No features found.', { features: [], totalCount: totalOf(rows) ?? 0 });
206
+ const text = `${countHeader(rows, 'feature')}:\n\n` +
207
+ '| key | name | state | epicId |\n|---|---|---|---|\n' +
208
+ rows.map((f) => `| ${escCell(f.key ?? f.id)} | ${escCell(f.name)} | ${escCell(f.state ?? '-')} | ${escCell(f.epicId ?? '-')} |`).join('\n');
209
+ return ok(text, { features: rows, totalCount: totalOf(rows) ?? rows.length });
210
+ }
211
+ catch (e) {
212
+ return err(describeError(e));
213
+ }
214
+ });
215
+ server.registerTool('feature_get', {
216
+ title: 'Read one feature',
217
+ description: 'Read a single FEATURE by id or business key (FT_123). Requires a live connection. Read-only.',
218
+ inputSchema: { id: z.string().describe('Feature id or business key (FT_123).') },
219
+ annotations: { readOnlyHint: true },
220
+ }, async ({ id }) => {
221
+ const adapter = deps.getAdapter();
222
+ if (!adapter)
223
+ return err(NOT_CONNECTED);
224
+ if (!adapter.getFeature)
225
+ return err('This product does not expose features.');
226
+ try {
227
+ const feature = await adapter.getFeature(id);
228
+ const header = `**${feature.name}**${feature.key ? ` · ${feature.key}` : ''}${feature.state ? ` · ${feature.state}` : ''}`;
229
+ const desc = feature.description ? `\n\n${feature.description}` : '';
230
+ const parent = feature.epicId ? `\n\n_Parent epic:_ ${feature.epicId}` : '';
231
+ return ok(`${header}${desc}${parent}`, { feature });
232
+ }
233
+ catch (e) {
234
+ return err(describeError(e));
235
+ }
236
+ });
237
+ server.registerTool('feature_create', {
238
+ title: 'Create a feature',
239
+ description: 'Create a new FEATURE. `projectIds` defaults to the current project when omitted. Link to a ' +
240
+ 'parent epic via `epicId`. Backend requires `name`, `estimatedEffort`, `plannedStartDate`, ' +
241
+ '`plannedEndDate`.',
242
+ inputSchema: {
243
+ name: z.string().min(3).max(500),
244
+ estimatedEffort: z.number().nonnegative(),
245
+ plannedStartDate: z.string(),
246
+ plannedEndDate: z.string(),
247
+ projectIds: z.array(z.number()).optional(),
248
+ epicId: z.number().optional().describe('Parent epic numeric id.'),
249
+ state: z.string().optional(),
250
+ priority: z.string().optional(),
251
+ ownerId: z.number().optional(),
252
+ description: z.string().optional(),
253
+ tags: z.array(z.number()).optional(),
254
+ teamId: z.array(z.number()).optional(),
255
+ actualStartDate: z.string().optional(),
256
+ actualEndDate: z.string().optional(),
257
+ actualEffort: z.number().optional(),
258
+ remainingEffort: z.number().optional(),
259
+ customFields: z.record(z.string(), z.unknown()).optional(),
260
+ },
261
+ }, async (input) => {
262
+ const adapter = deps.getAdapter();
263
+ if (!adapter)
264
+ return err(NOT_CONNECTED);
265
+ if (!adapter.createFeature)
266
+ return err('This product does not expose feature creation.');
267
+ try {
268
+ const ref = await adapter.createFeature(input);
269
+ return ok(`Created feature \`${ref.id}\`.`, { savedRef: ref });
270
+ }
271
+ catch (e) {
272
+ return err(describeError(e));
273
+ }
274
+ });
275
+ server.registerTool('feature_update', {
276
+ title: 'Update a feature (partial)',
277
+ description: 'PATCH an existing FEATURE — pass only the fields to change plus `updateVersion` (optimistic ' +
278
+ 'concurrency, from the last feature_get). Accepts id or business key (FT_123).',
279
+ inputSchema: {
280
+ id: z.string().describe('Feature id or business key (FT_123).'),
281
+ name: z.string().min(3).max(500).optional(),
282
+ estimatedEffort: z.number().optional(),
283
+ plannedStartDate: z.string().optional(),
284
+ plannedEndDate: z.string().optional(),
285
+ projectIds: z.array(z.number()).optional(),
286
+ epicId: z.number().optional(),
287
+ state: z.string().optional(),
288
+ priority: z.string().optional(),
289
+ ownerId: z.number().optional(),
290
+ description: z.string().optional(),
291
+ tags: z.array(z.number()).optional(),
292
+ teamId: z.array(z.number()).optional(),
293
+ actualStartDate: z.string().optional(),
294
+ actualEndDate: z.string().optional(),
295
+ actualEffort: z.number().optional(),
296
+ remainingEffort: z.number().optional(),
297
+ customFields: z.record(z.string(), z.unknown()).optional(),
298
+ updateVersion: z.number().optional(),
299
+ },
300
+ }, async ({ id, ...patch }) => {
301
+ const adapter = deps.getAdapter();
302
+ if (!adapter)
303
+ return err(NOT_CONNECTED);
304
+ if (!adapter.updateFeature)
305
+ return err('This product does not expose feature updates.');
306
+ try {
307
+ const ref = await adapter.updateFeature(id, patch);
308
+ return ok(`Updated feature \`${ref.id || id}\`.`, { savedRef: ref });
309
+ }
310
+ catch (e) {
311
+ return err(describeError(e));
312
+ }
313
+ });
314
+ // ------------------------------------------------------------------------- Stories (write)
315
+ server.registerTool('story_create', {
316
+ title: 'Create a user story',
317
+ description: 'Create a new USER STORY under the connected project. `projectId` defaults to the current ' +
318
+ 'project. Link to parents via `epicId` / `featureId`. Backend requires `name`, `state`, ' +
319
+ '`estimatedEffort`. Pass `acceptanceCriteria` as a newline-separated string — one AC per line ' +
320
+ '(the SQA `userstory.acceptanceCriteria` column is a single string).',
321
+ inputSchema: {
322
+ name: z.string().min(3).max(500),
323
+ state: z.string().describe('State — must match the project state config.'),
324
+ estimatedEffort: z.number().nonnegative(),
325
+ projectId: z.number().optional().describe('Defaults to the connected project.'),
326
+ epicId: z.number().optional().describe('Parent epic numeric id.'),
327
+ featureId: z.number().optional().describe('Parent feature numeric id.'),
328
+ moduleId: z.number().optional(),
329
+ releaseId: z.number().optional(),
330
+ iterationId: z.number().optional().describe('Sprint numeric id (SQA `iterationId`).'),
331
+ acceptanceCriteria: z.string().optional().describe('Newline-separated AC lines.'),
332
+ description: z.string().optional(),
333
+ priority: z.string().optional(),
334
+ ownerId: z.array(z.number()).optional().describe('Numeric userIds of story owners.'),
335
+ tags: z.array(z.number()).optional(),
336
+ teamId: z.array(z.number()).optional(),
337
+ type: z.string().optional(),
338
+ plannedStartDate: z.string().optional(),
339
+ plannedEndDate: z.string().optional(),
340
+ customFields: z.record(z.string(), z.unknown()).optional(),
341
+ },
342
+ }, async (input) => {
343
+ const adapter = deps.getAdapter();
344
+ if (!adapter)
345
+ return err(NOT_CONNECTED);
346
+ if (!adapter.createStory)
347
+ return err('This product does not expose story creation.');
348
+ try {
349
+ const ref = await adapter.createStory(input);
350
+ return ok(`Created story \`${ref.id}\`.`, { savedRef: ref });
351
+ }
352
+ catch (e) {
353
+ return err(describeError(e));
354
+ }
355
+ });
356
+ server.registerTool('story_update', {
357
+ title: 'Update a user story (partial)',
358
+ description: 'PATCH an existing USER STORY — pass only the fields to change plus `updateVersion` ' +
359
+ '(optimistic concurrency, from the last story_get). Accepts id or business key (US_123). ' +
360
+ 'Pass `acceptanceCriteria` as a newline-separated string when replacing AC lines.',
361
+ inputSchema: {
362
+ id: z.string().describe('Story id or business key (US_123).'),
363
+ name: z.string().min(3).max(500).optional(),
364
+ state: z.string().optional(),
365
+ estimatedEffort: z.number().optional(),
366
+ projectId: z.number().optional(),
367
+ epicId: z.number().optional(),
368
+ featureId: z.number().optional(),
369
+ moduleId: z.number().optional(),
370
+ releaseId: z.number().optional(),
371
+ iterationId: z.number().optional(),
372
+ acceptanceCriteria: z.string().optional(),
373
+ description: z.string().optional(),
374
+ priority: z.string().optional(),
375
+ ownerId: z.array(z.number()).optional(),
376
+ tags: z.array(z.number()).optional(),
377
+ teamId: z.array(z.number()).optional(),
378
+ type: z.string().optional(),
379
+ plannedStartDate: z.string().optional(),
380
+ plannedEndDate: z.string().optional(),
381
+ customFields: z.record(z.string(), z.unknown()).optional(),
382
+ updateVersion: z.number().optional(),
383
+ },
384
+ }, async ({ id, ...patch }) => {
385
+ const adapter = deps.getAdapter();
386
+ if (!adapter)
387
+ return err(NOT_CONNECTED);
388
+ if (!adapter.updateStory)
389
+ return err('This product does not expose story updates.');
390
+ try {
391
+ const ref = await adapter.updateStory(id, patch);
392
+ return ok(`Updated story \`${ref.id || id}\`.`, { savedRef: ref });
393
+ }
394
+ catch (e) {
395
+ return err(describeError(e));
396
+ }
397
+ });
398
+ }
399
+ //# sourceMappingURL=backlog.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.tools.js","sourceRoot":"","sources":["../../src/tools/backlog.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ProviderAdapter } from '../adapters/types.js';
3
+ export type DefectToolsDeps = {
4
+ getAdapter: () => ProviderAdapter | null;
5
+ };
6
+ export declare function registerDefectTools(server: McpServer, deps: DefectToolsDeps): void;
7
+ //# sourceMappingURL=defects.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defects.tools.d.ts","sourceRoot":"","sources":["../../src/tools/defects.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,eAAe,GAAG,IAAI,CAAC;CAC1C,CAAC;AA2BF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CA4DlF"}
@@ -0,0 +1,82 @@
1
+ import { z } from 'zod';
2
+ import { ok, err } from '../mcpResult.js';
3
+ import { zRawFilter } from './schemas.js';
4
+ const NOT_CONNECTED = 'Not connected to a product. Use qa_connect({ url, token, projectId }) first — listing defects ' +
5
+ 'needs a live backend connection.';
6
+ function describeError(e) {
7
+ return e instanceof Error ? e.message : String(e);
8
+ }
9
+ function escCell(v) {
10
+ return String(v ?? '').replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
11
+ }
12
+ /** SQA adapter attaches `totalCount` as a side-band prop on the returned array (mapper.withTotal). */
13
+ function totalOf(rows) {
14
+ const t = rows.totalCount;
15
+ return typeof t === 'number' ? t : undefined;
16
+ }
17
+ function countHeader(rows, singular, plural = singular + 's') {
18
+ const shown = rows.length;
19
+ const total = totalOf(rows) ?? shown;
20
+ const word = total === 1 ? singular : plural;
21
+ return total > shown ? `Showing ${shown} of ${total} ${word}` : `${total} ${word}`;
22
+ }
23
+ export function registerDefectTools(server, deps) {
24
+ server.registerTool('defect_list', {
25
+ title: 'List / search defects (bugs)',
26
+ description: 'List defects (bugs) raised in the connected project — id/code, title, state, severity, ' +
27
+ 'priority, assignee(s), and which test case(s) each is linked to. Mirrors the filters on the ' +
28
+ 'product\'s Defect list page: `search` (title keyword), `tcId` (defects against one test case), ' +
29
+ '`storyId` (defects on one user story), `state` (workflow state — use the exact `state` value ' +
30
+ 'from an existing defect_list row, e.g. "new"/"open"/"closed", not the capitalized UI label), ' +
31
+ '`assignedTo` / `createdBy` (numeric userId, or "me" — resolve a name to an id via list_users ' +
32
+ 'first). The Defect list page also lets a user filter by MANY MORE project-configured columns ' +
33
+ '(Module, Release, Feature, Team, Client, Labels, custom fields, ...) that vary per project — ' +
34
+ 'pass those via `filters: [{ column, value }]` (raw column filters, appended as-is; use the ' +
35
+ 'field\'s backend key, e.g. `moduleId`/`releaseId`/`featureId`/`teamId`/`clientId`/`tags`). ' +
36
+ 'Omit everything for the full project list. Requires a live connection (qa_connect). Read-only ' +
37
+ 'and product-neutral.',
38
+ inputSchema: {
39
+ search: z.string().optional().describe('Keyword to find defects by title.'),
40
+ tcId: z.string().optional().describe('Only defects raised against this test case (id or business key).'),
41
+ storyId: z.string().optional().describe('Only defects linked to this user story (id or business key).'),
42
+ state: z.string().optional().describe('Exact workflow state key (e.g. "new", "open", "closed") — from an existing row\'s `state` value, not the capitalized UI label.'),
43
+ assignedTo: z.string().optional().describe('Numeric userId of the assignee. Pass "me" for the current caller. Resolve names via list_users first.'),
44
+ createdBy: z.string().optional().describe('Numeric userId of the creator. Pass "me" for the current caller. Resolve names via list_users first.'),
45
+ filters: z.array(zRawFilter).optional().describe('Extra raw column filters for project-configured columns with no dedicated parameter above (Module/Release/Feature/Team/Client/Labels/custom fields).'),
46
+ limit: z.number().int().positive().optional(),
47
+ offset: z.number().int().nonnegative().optional(),
48
+ },
49
+ annotations: { readOnlyHint: true },
50
+ }, async ({ search, tcId, storyId, state, assignedTo, createdBy, filters, limit, offset }) => {
51
+ const adapter = deps.getAdapter();
52
+ if (!adapter)
53
+ return err(NOT_CONNECTED);
54
+ if (!adapter.listDefects)
55
+ return err('This product does not expose a defect tracker.');
56
+ try {
57
+ const rows = await adapter.listDefects({
58
+ ...(search ? { search } : {}),
59
+ ...(tcId ? { tcId } : {}),
60
+ ...(storyId ? { storyId } : {}),
61
+ ...(state ? { state } : {}),
62
+ ...(assignedTo ? { assignedTo } : {}),
63
+ ...(createdBy ? { createdBy } : {}),
64
+ ...(filters?.length ? { filters } : {}),
65
+ ...(limit != null ? { limit } : {}),
66
+ ...(offset != null ? { offset } : {}),
67
+ });
68
+ if (!rows.length)
69
+ return ok('No defects found.', { defects: [], totalCount: totalOf(rows) ?? 0 });
70
+ const text = `${countHeader(rows, 'defect')}:\n\n` +
71
+ '| id | title | state | severity | priority | assigned to |\n|---|---|---|---|---|---|\n' +
72
+ rows
73
+ .map((d) => `| ${escCell(d.code ?? d.id)} | ${escCell(d.title)} | ${escCell(d.state ?? '-')} | ${escCell(d.severity ?? '-')} | ${escCell(d.priority ?? '-')} | ${escCell(d.assignedTo?.join(', ') ?? '-')} |`)
74
+ .join('\n');
75
+ return ok(text, { defects: rows, totalCount: totalOf(rows) ?? rows.length });
76
+ }
77
+ catch (e) {
78
+ return err(describeError(e));
79
+ }
80
+ });
81
+ }
82
+ //# sourceMappingURL=defects.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defects.tools.js","sourceRoot":"","sources":["../../src/tools/defects.tools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.tools.d.ts","sourceRoot":"","sources":["../../src/tools/discovery.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAK5D;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kFAAkF;IAClF,UAAU,EAAE,MAAM,eAAe,GAAG,IAAI,CAAC;CAC1C,CAAC;AAeF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAygBxF"}
1
+ {"version":3,"file":"discovery.tools.d.ts","sourceRoot":"","sources":["../../src/tools/discovery.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAK5D;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kFAAkF;IAClF,UAAU,EAAE,MAAM,eAAe,GAAG,IAAI,CAAC;CAC1C,CAAC;AA0DF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAk3CxF"}