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
@@ -109,25 +109,62 @@ export function registerTestcaseTools(server, deps) {
109
109
  return err(describeError(e));
110
110
  }
111
111
  });
112
+ server.registerTool('tc_draft_from_tc', {
113
+ title: 'Load an existing test case as a draft for in-place editing',
114
+ description: 'Fetch a REAL test case from the connected product and hydrate it into a draft, carrying the ' +
115
+ "original tcId. Because the draft carries the id, a later `tc_save({ draftId })` UPDATES that " +
116
+ 'SAME test case (preserving id, run history, parameters, testdata bindings, and suite ' +
117
+ 'membership) instead of creating a sibling.\n\n' +
118
+ 'Use this to apply a `story_sync_testcases` drift report:\n' +
119
+ ' 1. tc_draft_from_tc({ tcId })\n' +
120
+ ' 2. tc_draft_update({ draftId, ops: <filtered proposedOps> })\n' +
121
+ ' 3. tc_save({ draftId })\n' +
122
+ 'Requires a live connection (qa_connect).',
123
+ inputSchema: {
124
+ tcId: z.string().describe('The existing test-case id to load as a draft.'),
125
+ },
126
+ }, async ({ tcId }) => {
127
+ const adapter = deps.getAdapter?.();
128
+ if (!adapter) {
129
+ return err('Not connected to a product. Use qa_connect first — loading a real TC needs a live backend.');
130
+ }
131
+ try {
132
+ const tc = await adapter.getTestCase(tcId);
133
+ if (!tc.id)
134
+ tc.id = tcId; // adapter contract guarantees id, but belt-and-braces for the update path
135
+ const draftId = deps.drafts.create(tc);
136
+ return draftResult(deps.drafts.get(draftId));
137
+ }
138
+ catch (e) {
139
+ return err(describeError(e));
140
+ }
141
+ });
112
142
  server.registerTool('tc_draft_create', {
113
143
  title: 'Create a test-case draft',
114
- description: 'Create a new in-memory test-case draft from steps you author yourself. Nothing is persisted -- no disk, ' +
144
+ description: 'MANUAL-ONLY authoring. Call this when the user asked for a MANUAL test case: they said "manual", ' +
145
+ '"draft only", "plain prose", "no automation", or asked to cover a user story\'s acceptance criteria ' +
146
+ 'as manual cases. For those, this IS the right tool — call it.\n\n' +
147
+ 'Do NOT use for automated tests. "create a test case", "record this flow", "add a test for X" (with no ' +
148
+ '"manual" qualifier) mean AUTOMATED — route to the `web` / `mainframe` sub-agent to RECORD with real ' +
149
+ 'locators instead.\n\n' +
150
+ 'Create a new in-memory test-case draft from steps you author yourself. Nothing is persisted -- no disk, ' +
115
151
  'no backend, no network. Use tc_draft_open to hand it to the test-case editor for viewing.\n\n' +
116
152
  'DO NOT USE THIS FOR A REAL WEB APPLICATION. Steps written here have no locators, so the test case cannot ' +
117
153
  'execute -- it only reads plausibly. Whenever there is an app you can reach (the user gives a URL, names an ' +
118
- 'environment, or asks for a test of a real flow), call `recording_start` instead and drive the app with ' +
119
- '`browser_*`: that captures real locators, real element names and real parameters, and is the DEFAULT way ' +
120
- 'to create a web test case. You do not need the user to say "record" -- if a test case for a real app is ' +
121
- 'wanted, recording is how it is made.\n\n' +
122
- 'Legitimate uses: a manual test case (no automation), API/database steps that need no element binding, ' +
123
- 'restructuring or drafting steps the user supplied verbatim, or sketching a plan when no app is reachable ' +
124
- '-- and say plainly that the result is not executable until recorded.\n\n' +
125
- 'INPUT VALUES MUST BE PARAMETERIZED. When a step has a value (text to type, a URL to open, an expected ' +
126
- 'string), put a `${param}` token in its description AND set the step `value` -- e.g. description ' +
127
- '"Enter ${username} in the Username field", value "standard_user". On save these bind into the test ' +
128
- "case's default test-data row (the dataset the product auto-creates), so it can run with data. A value with " +
129
- 'no `${param}` in the same description has nowhere to bind and is dropped -- this is how the product stores ' +
130
- 'web values (never inline on the step).',
154
+ 'environment, or asks for a test of a real flow), call the `web` sub-agent instead: that captures real ' +
155
+ 'locators, real element names and real parameters, and is the DEFAULT way to create a web test case. You ' +
156
+ 'do not need the user to say "record" -- if a test case for a real app is wanted, recording is how it is made.\n\n' +
157
+ 'Legitimate uses: a MANUAL test case the user explicitly asked for (no automation), API/database steps that ' +
158
+ 'need no element binding, restructuring or drafting steps the user supplied verbatim, or sketching a plan ' +
159
+ 'when no app is reachable -- and say plainly that the result is not executable until recorded.\n\n' +
160
+ 'PARAMETERISE EVERY DYNAMIC VALUE — this is mandatory for manual test cases whenever the step ' +
161
+ 'names a URL, credential, product name, form value, expected string, or anything the tester will ' +
162
+ 'type / compare. Instead of hard-coding "Enter admin in the Username field", write "Enter ${username} ' +
163
+ 'in the Username field" and pass `data: { username: "admin" }` at the TC level. Every `${name}` token ' +
164
+ 'becomes a Local parameter in the product and the value from `data` populates the test case\'s ' +
165
+ 'default test-data row (ITR-1) automatically. Steps with no `${...}` tokens create no parameters — ' +
166
+ 'that is only correct for pure checklist verifications ("verify heading is visible"). If a step ' +
167
+ 'references a real value, tokenise it.',
131
168
  inputSchema: {
132
169
  title: z.string().min(1),
133
170
  priority: zPriority.optional(),
@@ -139,8 +176,11 @@ export function registerTestcaseTools(server, deps) {
139
176
  'list_modules). ASK the user which module before drafting; SimplifyQA files test cases in ' +
140
177
  'a module tree. Walnut ignores this.'),
141
178
  steps: z.array(zNewStep).optional(),
179
+ data: z.record(z.string(), z.string()).optional().describe('Default values for the `${name}` tokens in step descriptions — one entry per token. ' +
180
+ 'Populates the auto-created default test-data row (ITR-1) on save. Example: ' +
181
+ '`{ username: "admin", password: "admin123", url: "https://saucedemo.com" }`.'),
142
182
  },
143
- }, async ({ title, priority, category, description, storyRef, folderOrModule, steps }) => {
183
+ }, async ({ title, priority, category, description, storyRef, folderOrModule, steps, data }) => {
144
184
  try {
145
185
  const tc = {
146
186
  title,
@@ -149,6 +189,7 @@ export function registerTestcaseTools(server, deps) {
149
189
  ...(description ? { description } : {}),
150
190
  ...(storyRef ? { storyRef } : {}),
151
191
  ...(folderOrModule ? { folderOrModule } : {}),
192
+ ...(data ? { data } : {}),
152
193
  // zod (zNewStep) is the runtime gate on shape; DraftStore.create
153
194
  // assigns real step numbers regardless of what's passed here.
154
195
  steps: (steps ?? []),
@@ -162,7 +203,10 @@ export function registerTestcaseTools(server, deps) {
162
203
  });
163
204
  server.registerTool('tc_draft_update', {
164
205
  title: 'Update a test-case draft',
165
- description: 'Apply one or more ops (set_meta | add_step | update_step | remove_step | move_step) to a draft. Steps renumber contiguously from 1 after every op.',
206
+ description: 'Apply one or more ops (set_meta | add_step | update_step | remove_step | move_step) to a draft. Steps renumber contiguously from 1 after every op.\n\n' +
207
+ 'STEP TYPE — for add_step / update_step on a MANUAL test case (tc.category === "manual", or every existing step arrived with stepType "manual"), pass `stepType: "manual"`. ' +
208
+ 'For an AUTOMATED test case pick the execution technology ("web", "api", "android", …). ' +
209
+ 'Getting this wrong routes the row to the wrong UI card and it renders blank in the desktop viewer.',
166
210
  inputSchema: { draftId: z.string(), ops: z.array(zDraftOp).min(1) },
167
211
  }, async ({ draftId, ops }) => {
168
212
  try {
@@ -261,6 +305,30 @@ export function registerTestcaseTools(server, deps) {
261
305
  const detail = issues.map((i) => `- step ${i.step ?? '-'}${i.field ? ` (${i.field})` : ''}: ${i.msg}`).join('\n');
262
306
  return err(`Cannot save "${draft.tc.title}" — ${issues.length} validation issue(s):\n${detail}`);
263
307
  }
308
+ const isCreate = !draft.tc.id;
309
+ if (isCreate && adapter.listModules && !draft.tc.folderOrModule) {
310
+ return err(`Cannot save "${draft.tc.title}" — SimplifyQA files every test case under a module. ` +
311
+ 'Call list_modules, ASK the user which module to file this test case under, then ' +
312
+ `tc_draft_update({ draftId: "${draftId}", ops: [{ op: "set_meta", patch: { folderOrModule: "<module id>" } }] }) ` +
313
+ 'before retrying tc_save.');
314
+ }
315
+ if (draft.tc.category === 'manual') {
316
+ const tokens = new Set();
317
+ for (const s of draft.tc.steps ?? []) {
318
+ for (const m of (s.description ?? '').matchAll(/\$\{([A-Za-z0-9_]+)\}/g)) {
319
+ tokens.add(m[1]);
320
+ }
321
+ }
322
+ const data = draft.tc.data ?? {};
323
+ const missing = [...tokens].filter((n) => !Object.prototype.hasOwnProperty.call(data, n) || data[n] === '');
324
+ if (missing.length) {
325
+ return err(`Cannot save "${draft.tc.title}" — these step tokens have no value in \`data\`: ${missing.map((n) => '${' + n + '}').join(', ')}. ` +
326
+ 'Every \`${name}\` token in a manual step description MUST have a default value in the TC\'s \`data\` map, ' +
327
+ 'or the auto-created test-data row (ITR-1) lands with empty cells. Update the draft: ' +
328
+ `tc_draft_update({ draftId: "${draftId}", ops: [{ op: "set_meta", patch: { data: { ${missing.map((n) => `${n}: "<value>"`).join(', ')} } } }] }) ` +
329
+ 'then retry tc_save.');
330
+ }
331
+ }
264
332
  try {
265
333
  const isUpdate = !!draft.tc.id;
266
334
  const saved = isUpdate
@@ -290,27 +358,25 @@ export function registerTestcaseTools(server, deps) {
290
358
  }
291
359
  });
292
360
  server.registerTool('tc_automate', {
293
- title: 'Convert a manual test case to automated (record in place)',
294
- description: 'Promote an existing MANUAL test case to AUTOMATED, IN PLACE. Reads the test case, uses its steps ' +
295
- 'as the guide to drive a REAL browser recording (the web sub-agent, with real locators), then ' +
296
- 'REPLACES the same test case\'s steps with the recorded ones and flips its category to ' +
297
- '"automated" — keeping its story link. The manual steps are superseded (this is the promote-in-' +
298
- 'place the user chose). Pass `url` (the app entry point) unless the manual steps already contain ' +
299
- 'one, and `extra` for credentials / data / what to assert; `profile` reuses a signed-in browser ' +
300
- 'profile. Requires a live connection + the web recording agent.',
361
+ title: 'Turn a manual test case into a recording guide (creates a NEW automated TC)',
362
+ description: 'Read an EXISTING MANUAL test case and return a recording guide the model uses to drive a live ' +
363
+ "recording via the connected agent's granular tools (web_launch_application, web_snapshot, " +
364
+ 'web_click, web_enter_text, …, core_close_session). The Electron recorder window opens ' +
365
+ 'automatically on web_launch_application; each captured step streams into it. The user reviews ' +
366
+ 'and clicks Save in the recorder — that CREATES A NEW automated test case (via POST /tm/testcase); ' +
367
+ 'the source manual TC is left untouched. Pass `url` unless the manual steps already contain one, ' +
368
+ 'and `extra` for credentials / data / what to assert. Read-only from MCP: this tool composes text, ' +
369
+ 'it never writes. Requires a live connection.',
301
370
  inputSchema: {
302
371
  tcId: z.string().describe('The manual test case id (or business key TC_123) to automate.'),
303
372
  url: z.string().optional().describe('Starting URL for the recording (the app under test).'),
304
- profile: z.string().optional().describe('Reuse a signed-in browser profile (else a fresh one).'),
305
- extra: z.string().optional().describe('Extra guidance for the recorder: credentials, data, assertions.'),
373
+ extra: z.string().optional().describe('Extra guidance for the recording: credentials, data, assertions.'),
306
374
  },
307
- annotations: { readOnlyHint: false },
308
- }, async ({ tcId, url, profile, extra }) => {
375
+ annotations: { readOnlyHint: true },
376
+ }, async ({ tcId, url, extra }) => {
309
377
  const adapter = deps.getAdapter?.();
310
378
  if (!adapter)
311
379
  return err('Not connected to a product. Use qa_connect first.');
312
- if (!adapter.callRaw)
313
- return err('This product agent does not expose recording — cannot automate here.');
314
380
  let source;
315
381
  try {
316
382
  source = await adapter.getTestCase(tcId);
@@ -318,82 +384,62 @@ export function registerTestcaseTools(server, deps) {
318
384
  catch (e) {
319
385
  return err(`Could not read test case "${tcId}": ${describeError(e)}`);
320
386
  }
321
- // Compose a recording task from the (manual) steps — the guide the web loop follows.
387
+ if (source.category !== 'manual') {
388
+ return err(`"${source.title}" (${tcId}) is not manual (category: ${source.category}). ` +
389
+ 'tc_automate promotes MANUAL → automated. To re-record an automated TC, record + tc_save with a fresh title.');
390
+ }
391
+ // "US_7" → 7, "7" → 7, "MOD_12" → 12. Absent → undefined (don't invent).
392
+ const numericSuffix = (s) => {
393
+ if (!s)
394
+ return undefined;
395
+ const m = s.match(/(\d+)$/);
396
+ return m ? parseInt(m[1], 10) : undefined;
397
+ };
398
+ const userstoryId = numericSuffix(source.storyRef);
399
+ const moduleId = numericSuffix(source.folderOrModule);
322
400
  const stepLines = source.steps
323
401
  .map((s, i) => `${i + 1}. ${s.description}${s.expectedResult ? ` (expect: ${s.expectedResult})` : ''}`)
324
402
  .join('\n');
325
- const task = 'Automate this test case by performing it in a real browser and asserting the expected results.\n\n' +
326
- `Test case: ${source.title}\n` +
327
- (source.preconditions ? `Preconditions: ${source.preconditions}\n` : '') +
328
- (url ? `Start URL: ${url}\n` : '') +
329
- (extra ? `${extra}\n` : '') +
330
- `\nSteps:\n${stepLines}`;
331
- if (!url && !/https?:\/\//.test(task)) {
403
+ if (!url && !/https?:\/\//.test(`${extra ?? ''}\n${stepLines}`)) {
332
404
  return err(`To automate "${source.title}" I need the app URL — the manual steps don't contain one. ` +
333
405
  'Call again with `url` (and any credentials/data via `extra`).');
334
406
  }
335
- // Recording is NON-BLOCKING on the agent: web() starts it + returns a sessionId; the result comes
336
- // via web_status. tc_automate does that start→poll internally, then promotes in place. The agent's
337
- // one-recording-in-flight guard means even if this call is retried it can't spawn a second browser.
338
- let sessionId;
339
- try {
340
- const startRes = (await adapter.callRaw('web', {
341
- task,
342
- ...(url ? { url } : {}),
343
- ...(profile ? { profile } : {}),
344
- }));
345
- if (startRes.isError)
346
- return startRes;
347
- sessionId = startRes.structuredContent?.sessionId;
348
- }
349
- catch (e) {
350
- return err(`Recording failed to start: ${describeError(e)}`);
351
- }
352
- if (!sessionId)
353
- return err('Recording did not start (no sessionId returned).');
354
- let recorded;
355
- const deadline = Date.now() + 6 * 60000; // internal cap; recording continues server-side regardless
356
- while (Date.now() < deadline) {
357
- await new Promise((r) => setTimeout(r, 6000));
358
- let st;
359
- try {
360
- st = (await adapter.callRaw('web_status', { sessionId }));
361
- }
362
- catch (e) {
363
- return err(`Recording status check failed: ${describeError(e)}`);
364
- }
365
- if (st.isError)
366
- return st; // recording error — forward verbatim
367
- const sc = st.structuredContent;
368
- if (sc?.status === 'done' && sc.tc) {
369
- recorded = sc.tc;
370
- break;
371
- }
372
- // else still 'recording' → keep polling
373
- }
374
- if (!recorded || !recorded.steps?.length) {
375
- return err(`The recording for "${source.title}" is still running (session ${sessionId}) or produced no steps. ` +
376
- `Poll web_status({ sessionId: "${sessionId}" }); once it's done, retry tc_automate.`);
377
- }
378
- // Promote IN PLACE: same id, recorded steps, category automated, story link + metadata kept.
379
- const promoted = {
380
- ...recorded,
381
- id: tcId,
382
- title: source.title,
383
- priority: source.priority,
384
- category: 'automated',
385
- ...(source.description ? { description: source.description } : {}),
386
- ...(source.storyRef ? { storyRef: source.storyRef } : {}),
387
- };
388
- try {
389
- const saved = await adapter.updateTestCase(tcId, promoted);
390
- const link = saved.productUrl ? `\n${saved.productUrl}` : '';
391
- return ok(`Automated "${source.title}" (${tcId}) — recorded ${recorded.steps.length} step(s) and saved it ` +
392
- `as AUTOMATED in place${source.storyRef ? ', keeping the story link' : ''}.${link}`, { saved, recordedStepCount: recorded.steps.length });
393
- }
394
- catch (e) {
395
- return err(`Recorded the flow but saving the automated version failed: ${describeError(e)}`);
396
- }
407
+ const storyLine = userstoryId !== undefined
408
+ ? `userstoryId:${userstoryId} — is already selected in the recorder's story picker.`
409
+ : 'no story on source — will need to be picked at Save in the recorder if the user wants a link.';
410
+ const moduleLine = moduleId !== undefined
411
+ ? `moduleId:${moduleId} — is already selected in the recorder's module bar.`
412
+ : 'no module on source — the user picks one in the recorder before Save.';
413
+ const guide = 'Automate this manual test case by recording it end-to-end.\n\n' +
414
+ `testcaseName:"${source.title}"\n` +
415
+ `Story: ${storyLine}\n` +
416
+ `Module: ${moduleLine}\n` +
417
+ (source.preconditions ? `Preconditions: ${source.preconditions}\n` : '') +
418
+ (url ? `Start URL: ${url}\n` : '') +
419
+ (extra ? `${extra}\n` : '') +
420
+ `\nManual steps (guide only — do not paste verbatim; each granular action captures a real step):\n${stepLines}\n\n` +
421
+ '── Recording tools (call on the connected agent) ──\n' +
422
+ '1. core_activate_technology({ technology: "WEB", testcaseName, userstoryId?, moduleId? }) — session context.\n' +
423
+ `2. web_launch_application(${url ? `"${url}"` : '{ url }'}) — must be FIRST browser call; opens the Electron recorder window.\n` +
424
+ '3. web_snapshot() — call BEFORE every action to get fresh element refs.\n' +
425
+ '4. web_click({ ref }) / web_enter_text({ ref, value }) / web_select_item_from_dropdown({ ref, item })\n' +
426
+ ' web_check_if_not_checked({ ref }) / web_un_check_if_checked({ ref })\n' +
427
+ ' web_validate_text({ ref, expected }) / web_validate_partial_text({ ref, expected })\n' +
428
+ ' web_keyboard_action({ keys, ref? }) / web_wait_until_element_present({ ref, timeout? })\n' +
429
+ ' Tab / iframe: web_switch_to_tab, web_switch_to_parent_tab, web_close_tab,\n' +
430
+ ' web_switch_to_iframe, web_switch_to_parent_iframe, web_switch_to_default_content.\n' +
431
+ '5. core_close_session() — when the flow is done.\n\n' +
432
+ '── Save ──\n' +
433
+ 'The recorder window streams each step as it is captured. When done, STOP and ask the user to ' +
434
+ 'review the step cards and click Save Testcase in the recorder. That save CREATES A NEW ' +
435
+ `automated test case; the source manual TC ${tcId} stays as-is.\n\n` +
436
+ 'Do NOT call tc_save / update_testcase / journal_modify from MCP in this flow — the recorder UI is the persist step.';
437
+ return ok(guide, {
438
+ sourceTcId: tcId,
439
+ sourceTitle: source.title,
440
+ ...(userstoryId !== undefined ? { userstoryId } : {}),
441
+ ...(moduleId !== undefined ? { moduleId } : {}),
442
+ });
397
443
  });
398
444
  }
399
445
  //# sourceMappingURL=testcase.tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testcase.tools.js","sourceRoot":"","sources":["../../src/tools/testcase.tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testcase.tools.js","sourceRoot":"","sources":["../../src/tools/testcase.tools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"testdata.tools.d.ts","sourceRoot":"","sources":["../../src/tools/testdata.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,CAAC,EAAE,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACzD,CAAC;AAMF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CA+JtF"}
1
+ {"version":3,"file":"testdata.tools.d.ts","sourceRoot":"","sources":["../../src/tools/testdata.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,CAAC,EAAE,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CACzD,CAAC;AA2BF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI,CA0OtF"}
@@ -3,18 +3,70 @@ import { ok, err } from '../mcpResult.js';
3
3
  function describeError(e) {
4
4
  return e instanceof Error ? e.message : String(e);
5
5
  }
6
+ /** Reject an `environmentType` that doesn't match a real configured env. Null means accepted
7
+ * (a match, or listing wasn't possible — the adapter's own call is then the judge). */
8
+ async function rejectUnlistedEnv(adapter, environmentType) {
9
+ let envs;
10
+ try {
11
+ envs = await adapter.listEnvironments();
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ if (!envs.length)
17
+ return null;
18
+ const wanted = environmentType.trim().toLowerCase();
19
+ const match = envs.some((e) => (e.key ?? e.id)?.toLowerCase() === wanted);
20
+ if (match)
21
+ return null;
22
+ const options = envs.map((e) => `${e.name} · key: ${e.key ?? e.id}`).join(', ');
23
+ return (`"${environmentType}" is not a configured environment for this project — configured options are: ` +
24
+ `${options}. Call tc_list_environments, show these to the user, ask which one, and retry with the ` +
25
+ 'real `key` value (don\'t guess or reuse a value from a different project).');
26
+ }
6
27
  export function registerTestdataTools(server, deps) {
28
+ server.registerTool('tc_list_environments', {
29
+ title: 'List environments configured for the connected project',
30
+ description: 'List every environment configured for the currently connected project (e.g. general, staging, ' +
31
+ 'production). Testdata is stored PER ENVIRONMENT — each env has its own iteration rows. ALWAYS ' +
32
+ 'call this before tc_get_testdata / tc_generate_testdata, show the user the options, and ASK which ' +
33
+ 'env they want to generate testdata for. Never assume. The value to pass onward as ' +
34
+ '`environmentType` is the `key` field on each returned env.',
35
+ inputSchema: {},
36
+ annotations: { readOnlyHint: true },
37
+ }, async () => {
38
+ const adapter = deps.getAdapter?.();
39
+ if (!adapter)
40
+ return err('Not connected to a product. Use qa_connect first.');
41
+ try {
42
+ const envs = await adapter.listEnvironments();
43
+ if (!envs.length) {
44
+ return ok('This project reports zero configured environments. Do NOT assume "general" — confirm ' +
45
+ 'with the user before calling tc_get_testdata / tc_generate_testdata, since environments ' +
46
+ 'may exist under a different key than expected.', { environments: [] });
47
+ }
48
+ const text = `${envs.length} environment${envs.length === 1 ? '' : 's'} configured — ask the user which ` +
49
+ `one, even if there is only one option, since "general" is not guaranteed to be among them:\n\n` +
50
+ envs.map((e) => `- ${e.name}${e.isDefault ? ' (default)' : ''} · key: ${e.key ?? e.id}`).join('\n');
51
+ return ok(text, { environments: envs });
52
+ }
53
+ catch (e) {
54
+ return err(`Could not list environments: ${describeError(e)}`);
55
+ }
56
+ });
7
57
  server.registerTool('tc_get_testdata', {
8
58
  title: 'Read the current testdata template for a test case',
9
- description: 'Fetch the default iteration (template row) for TC `tcId` — the parameter list plus the ' +
10
- 'CURRENT seed values. Call this FIRST when you plan to generate testdata: use the seeds + ' +
11
- 'the test case\'s steps (from tc_get) to reason about what realistic values look like for ' +
12
- 'THIS flow, then pass those values to tc_generate_testdata. Example: for a SauceDemo login ' +
13
- 'flow, seeds tell you the valid usernames and the constant password/product/prices.',
59
+ description: 'Fetch the default iteration (template row) for TC `tcId` in a specific environment — the ' +
60
+ 'parameter list plus the CURRENT seed values. Testdata is per-env: seeds may differ across ' +
61
+ 'envs. `environmentType` is REQUIRED — this tool refuses when it is omitted, since silently ' +
62
+ 'guessing an env previously caused false "testdata not found" results. FIRST call ' +
63
+ 'tc_list_environments and ask the user which env they want. Then read the template here, and ' +
64
+ 'use the seeds + the test case\'s steps (from tc_get) to reason about realistic values before ' +
65
+ 'calling tc_generate_testdata.',
14
66
  inputSchema: {
15
67
  tcId: z.string().describe('Test case id (or business key like TC_123).'),
16
68
  environmentType: z.string().optional()
17
- .describe('Env key; defaults to the first configured env for the project (falls back to "general").'),
69
+ .describe('Env `key` (from tc_list_environments). REQUIRED — this tool refuses when omitted. Ask the user which env before reading testdata.'),
18
70
  },
19
71
  annotations: { readOnlyHint: true },
20
72
  }, async ({ tcId, environmentType }) => {
@@ -24,6 +76,15 @@ export function registerTestdataTools(server, deps) {
24
76
  if (!adapter.getDefaultIteration) {
25
77
  return err('This provider does not expose a testdata store.');
26
78
  }
79
+ if (!environmentType || !environmentType.trim()) {
80
+ return err('environmentType is required — testdata is stored per environment and this tool refuses to ' +
81
+ 'guess (a silent guess previously produced false "testdata not found" results). Call ' +
82
+ 'tc_list_environments, show the user the options, ask which env, then call tc_get_testdata ' +
83
+ 'again with that env `key` as `environmentType`.');
84
+ }
85
+ const envError = await rejectUnlistedEnv(adapter, environmentType);
86
+ if (envError)
87
+ return err(envError);
27
88
  try {
28
89
  const tpl = await adapter.getDefaultIteration({
29
90
  tcId,
@@ -34,7 +95,11 @@ export function registerTestdataTools(server, deps) {
34
95
  }
35
96
  const text = `Testdata template for ${tcId} · env ${tpl.environmentType} · version ${tpl.versionId}\n` +
36
97
  `${tpl.parameters.length} parameter(s):\n` +
37
- tpl.parameters.map((p) => `- ${p.name} = "${p.seed}"`).join('\n');
98
+ tpl.parameters
99
+ .map((p) => p.protected
100
+ ? `- ${p.name} = ${p.seed} [PROTECTED — value hidden, not exposed by this tool]`
101
+ : `- ${p.name} = "${p.seed}"`)
102
+ .join('\n');
38
103
  return ok(text, {
39
104
  tcId,
40
105
  versionId: tpl.versionId,
@@ -48,7 +113,11 @@ export function registerTestdataTools(server, deps) {
48
113
  });
49
114
  server.registerTool('tc_generate_testdata', {
50
115
  title: 'Save generated testdata rows to a test case',
51
- description: 'Persist up to 20 testdata rows for TC `tcId`. Two ways to feed values:\n' +
116
+ description: 'Persist up to 20 testdata rows for TC `tcId` into a SPECIFIC environment. Testdata is stored ' +
117
+ 'per environment — rows saved here only affect the env you pass. WORKFLOW: (1) call ' +
118
+ 'tc_list_environments and ASK the user which env; (2) call tc_get_testdata with that env to ' +
119
+ 'read seeds; (3) call this tool with the SAME `environmentType`. `environmentType` is REQUIRED ' +
120
+ 'here — this tool refuses when it is omitted. Two ways to feed values:\n' +
52
121
  ' 1) Model-generated — pass `rows: [{paramName: value}, ...]`. Call tc_get_testdata first ' +
53
122
  'for the parameter names + seeds, tc_get for step context, then produce rows that fit the flow.\n' +
54
123
  ' 2) Formula-driven — pass `formulas: {paramName: {name, args?}}` (names from tc_list_formulas). ' +
@@ -69,7 +138,7 @@ export function registerTestdataTools(server, deps) {
69
138
  })).optional()
70
139
  .describe('Per-column formula assignments applied to every row. Outer keys are param names from tc_get_testdata. Wins over rows[i] for the same key.'),
71
140
  environmentType: z.string().optional()
72
- .describe('Env key; defaults to whatever tc_get_testdata resolved.'),
141
+ .describe('Env `key` (from tc_list_environments). REQUIRED — this tool refuses when omitted. Ask the user which env before generating.'),
73
142
  },
74
143
  annotations: { readOnlyHint: false },
75
144
  }, async ({ tcId, rows, count, formulas, environmentType }) => {
@@ -79,6 +148,14 @@ export function registerTestdataTools(server, deps) {
79
148
  if (!adapter.getDefaultIteration || !adapter.saveGeneratedIterations) {
80
149
  return err('This provider does not expose a testdata store.');
81
150
  }
151
+ if (!environmentType || !environmentType.trim()) {
152
+ return err('environmentType is required — testdata is stored per environment and this tool refuses to ' +
153
+ 'guess. Call tc_list_environments, show the user the options, ask which env, then call ' +
154
+ 'tc_generate_testdata again with that env `key` as `environmentType`.');
155
+ }
156
+ const envError = await rejectUnlistedEnv(adapter, environmentType);
157
+ if (envError)
158
+ return err(envError);
82
159
  const hasFormulas = formulas != null && Object.keys(formulas).length > 0;
83
160
  // Reconcile rows vs count. Explicit rows always win; otherwise formulas + count seeds N empty
84
161
  // rows that the adapter fills column-by-column via evaluateFormula.
@@ -134,15 +211,26 @@ export function registerTestdataTools(server, deps) {
134
211
  return err(`Save failed: ${describeError(e)}`);
135
212
  }
136
213
  const paramNames = tpl.parameters.map((p) => p.name);
137
- const preview = baseRows.slice(0, 3);
214
+ const protectedNames = new Set(tpl.parameters.filter((p) => p.protected).map((p) => p.name));
215
+ // Mask protected columns before they reach the text or structuredContent.
216
+ const preview = baseRows.slice(0, 3).map((r) => {
217
+ const masked = { ...r };
218
+ for (const n of protectedNames)
219
+ if (n in masked)
220
+ masked[n] = masked[n] ? '*****' : '(empty)';
221
+ return masked;
222
+ });
138
223
  const formulaNote = hasFormulas
139
224
  ? `\nFormula columns: ${Object.keys(formulas).join(', ')} (evaluated per row).`
140
225
  : '';
141
226
  const warn = unknown.size
142
227
  ? `\n(Ignored unknown param name(s): ${[...unknown].join(', ')} — not in the template.)`
143
228
  : '';
229
+ const protectedNote = protectedNames.size
230
+ ? `\nProtected column(s) [${[...protectedNames].join(', ')}] are masked below — their values are never echoed by this tool.`
231
+ : '';
144
232
  const link = result.datasetUrl ? `\n${result.datasetUrl}` : '';
145
- const text = `Saved ${result.inserted} testdata row(s) for ${tcId} · env ${tpl.environmentType}.${link}${formulaNote}${warn}\n\n` +
233
+ const text = `Saved ${result.inserted} testdata row(s) for ${tcId} · env ${tpl.environmentType}.${link}${formulaNote}${warn}${protectedNote}\n\n` +
146
234
  `Preview (first ${preview.length}, formula values shown as their param name):\n` +
147
235
  preview
148
236
  .map((r, i) => `${i + 1}. ${paramNames.map((n) => `${n}=${r[n] ?? (hasFormulas && (n in formulas) ? `<${formulas[n].name}()>` : '')}`).join(' | ')}`)