common-qa-mcp 0.1.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/LICENSE +21 -0
- package/README.md +96 -0
- package/dist/adapters/factory.d.ts +15 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +18 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/remoteMcp/adapter.d.ts +92 -0
- package/dist/adapters/remoteMcp/adapter.d.ts.map +1 -0
- package/dist/adapters/remoteMcp/adapter.js +219 -0
- package/dist/adapters/remoteMcp/adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +77 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/walnut/actionTypes.d.ts +16 -0
- package/dist/adapters/walnut/actionTypes.d.ts.map +1 -0
- package/dist/adapters/walnut/actionTypes.js +141 -0
- package/dist/adapters/walnut/actionTypes.js.map +1 -0
- package/dist/adapters/walnut/mapper.d.ts +34 -0
- package/dist/adapters/walnut/mapper.d.ts.map +1 -0
- package/dist/adapters/walnut/mapper.js +228 -0
- package/dist/adapters/walnut/mapper.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +36 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +81 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +211 -0
- package/dist/config.js.map +1 -0
- package/dist/connection.d.ts +101 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +190 -0
- package/dist/connection.js.map +1 -0
- package/dist/domain/types.d.ts +279 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +2 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/domain/validate.d.ts +3 -0
- package/dist/domain/validate.d.ts.map +1 -0
- package/dist/domain/validate.js +29 -0
- package/dist/domain/validate.js.map +1 -0
- package/dist/drafts/store.d.ts +62 -0
- package/dist/drafts/store.d.ts.map +1 -0
- package/dist/drafts/store.js +119 -0
- package/dist/drafts/store.js.map +1 -0
- package/dist/httpMain.d.ts +3 -0
- package/dist/httpMain.d.ts.map +1 -0
- package/dist/httpMain.js +22 -0
- package/dist/httpMain.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/initAgents.d.ts +2 -0
- package/dist/initAgents.d.ts.map +1 -0
- package/dist/initAgents.js +178 -0
- package/dist/initAgents.js.map +1 -0
- package/dist/log.d.ts +14 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +14 -0
- package/dist/log.js.map +1 -0
- package/dist/mcpResult.d.ts +20 -0
- package/dist/mcpResult.d.ts.map +1 -0
- package/dist/mcpResult.js +8 -0
- package/dist/mcpResult.js.map +1 -0
- package/dist/mount.d.ts +12 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +126 -0
- package/dist/mount.js.map +1 -0
- package/dist/projectStore.d.ts +5 -0
- package/dist/projectStore.d.ts.map +1 -0
- package/dist/projectStore.js +60 -0
- package/dist/projectStore.js.map +1 -0
- package/dist/requestConnection.d.ts +20 -0
- package/dist/requestConnection.d.ts.map +1 -0
- package/dist/requestConnection.js +44 -0
- package/dist/requestConnection.js.map +1 -0
- package/dist/serve.d.ts +10 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +37 -0
- package/dist/serve.js.map +1 -0
- package/dist/server.d.ts +29 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +76 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/connection.tools.d.ts +16 -0
- package/dist/tools/connection.tools.d.ts.map +1 -0
- package/dist/tools/connection.tools.js +106 -0
- package/dist/tools/connection.tools.js.map +1 -0
- package/dist/tools/discovery.tools.d.ts +16 -0
- package/dist/tools/discovery.tools.d.ts.map +1 -0
- package/dist/tools/discovery.tools.js +369 -0
- package/dist/tools/discovery.tools.js.map +1 -0
- package/dist/tools/markdown.d.ts +13 -0
- package/dist/tools/markdown.d.ts.map +1 -0
- package/dist/tools/markdown.js +65 -0
- package/dist/tools/markdown.js.map +1 -0
- package/dist/tools/recording.tools.d.ts +16 -0
- package/dist/tools/recording.tools.d.ts.map +1 -0
- package/dist/tools/recording.tools.js +378 -0
- package/dist/tools/recording.tools.js.map +1 -0
- package/dist/tools/run.tools.d.ts +13 -0
- package/dist/tools/run.tools.d.ts.map +1 -0
- package/dist/tools/run.tools.js +230 -0
- package/dist/tools/run.tools.js.map +1 -0
- package/dist/tools/schemas.d.ts +560 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +112 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/testcase.tools.d.ts +50 -0
- package/dist/tools/testcase.tools.d.ts.map +1 -0
- package/dist/tools/testcase.tools.js +384 -0
- package/dist/tools/testcase.tools.js.map +1 -0
- package/dist/vendor/actionSignatures.d.ts +117 -0
- package/dist/vendor/actionSignatures.d.ts.map +1 -0
- package/dist/vendor/actionSignatures.js +420 -0
- package/dist/vendor/actionSignatures.js.map +1 -0
- package/dist/vendor/logger.d.ts +38 -0
- package/dist/vendor/logger.d.ts.map +1 -0
- package/dist/vendor/logger.js +174 -0
- package/dist/vendor/logger.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ok, err } from '../mcpResult.js';
|
|
3
|
+
import { zJournalOp } from './schemas.js';
|
|
4
|
+
import { stepsMarkdown } from './markdown.js';
|
|
5
|
+
const NOT_CONNECTED = 'Not connected to a product. Use qa_connect({ url, token, projectId }) first — listing and ' +
|
|
6
|
+
'reading existing test cases needs a live backend connection (the offline path only authors drafts).';
|
|
7
|
+
function describeError(e) {
|
|
8
|
+
return e instanceof Error ? e.message : String(e);
|
|
9
|
+
}
|
|
10
|
+
/** Markdown table cells: escape pipes and flatten newlines (mirrors markdown.ts). */
|
|
11
|
+
function escCell(v) {
|
|
12
|
+
return String(v ?? '').replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
|
|
13
|
+
}
|
|
14
|
+
export function registerDiscoveryTools(server, deps) {
|
|
15
|
+
server.registerTool('list_projects', {
|
|
16
|
+
title: 'List projects (resolve a project name to its id)',
|
|
17
|
+
description: 'List the projects visible to the current connection — id, name and counts. Use this to ' +
|
|
18
|
+
'resolve a project NAME to its id (e.g. before qa_switch_project when the user names a ' +
|
|
19
|
+
'project). Requires a live connection.',
|
|
20
|
+
inputSchema: {},
|
|
21
|
+
annotations: { readOnlyHint: true },
|
|
22
|
+
}, async () => {
|
|
23
|
+
const adapter = deps.getAdapter();
|
|
24
|
+
if (!adapter)
|
|
25
|
+
return err(NOT_CONNECTED);
|
|
26
|
+
try {
|
|
27
|
+
const rows = await adapter.listProjects();
|
|
28
|
+
if (!rows.length)
|
|
29
|
+
return ok('No projects found.', { projects: [] });
|
|
30
|
+
const text = `${rows.length} project${rows.length === 1 ? '' : 's'}:\n\n` +
|
|
31
|
+
'| id | name | test cases |\n|---|---|---|\n' +
|
|
32
|
+
rows.map((p) => `| ${escCell(p.id)} | ${escCell(p.name)} | ${p.counts?.['testCases'] ?? '-'} |`).join('\n');
|
|
33
|
+
return ok(text, { projects: rows });
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
return err(describeError(e));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.registerTool('tc_list', {
|
|
40
|
+
title: 'List / search existing test cases',
|
|
41
|
+
description: 'List or search EXISTING test cases in the connected product. Requires a live connection ' +
|
|
42
|
+
'(qa_connect). Returns a summary list — id, title, priority, status, step count. Use tc_get ' +
|
|
43
|
+
'to read one in full. This is a read-only, product-neutral tool: it works identically ' +
|
|
44
|
+
'whichever product the session is connected to.',
|
|
45
|
+
inputSchema: {
|
|
46
|
+
search: z.string().optional().describe('Free-text search over title / id.'),
|
|
47
|
+
status: z.string().optional().describe('Filter by status.'),
|
|
48
|
+
limit: z.number().int().positive().optional().describe('Max results (paging).'),
|
|
49
|
+
offset: z.number().int().nonnegative().optional().describe('Result offset (paging).'),
|
|
50
|
+
},
|
|
51
|
+
annotations: { readOnlyHint: true },
|
|
52
|
+
}, async ({ search, status, limit, offset }) => {
|
|
53
|
+
const adapter = deps.getAdapter();
|
|
54
|
+
if (!adapter)
|
|
55
|
+
return err(NOT_CONNECTED);
|
|
56
|
+
try {
|
|
57
|
+
const q = {
|
|
58
|
+
...(search !== undefined ? { search } : {}),
|
|
59
|
+
...(status !== undefined ? { status } : {}),
|
|
60
|
+
...(limit !== undefined ? { limit } : {}),
|
|
61
|
+
...(offset !== undefined ? { offset } : {}),
|
|
62
|
+
};
|
|
63
|
+
const rows = await adapter.listTestCases(q);
|
|
64
|
+
if (!rows.length)
|
|
65
|
+
return ok('No test cases found.', { testCases: [] });
|
|
66
|
+
const text = `${rows.length} test case${rows.length === 1 ? '' : 's'}:\n\n` +
|
|
67
|
+
'| id | title | priority | status | steps |\n|---|---|---|---|---|\n' +
|
|
68
|
+
rows
|
|
69
|
+
.map((r) => `| ${escCell(r.id)} | ${escCell(r.title)} | ${r.priority} | ${r.status ?? '-'} | ${r.stepCount ?? '-'} |`)
|
|
70
|
+
.join('\n');
|
|
71
|
+
return ok(text, { testCases: rows });
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return err(describeError(e));
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
server.registerTool('tc_get', {
|
|
78
|
+
title: 'Read one test case (with steps)',
|
|
79
|
+
description: 'Read a single EXISTING test case in full — metadata plus its steps as a readable table — ' +
|
|
80
|
+
'from the connected product. Requires a live connection (qa_connect). `id` accepts the ' +
|
|
81
|
+
"product's id or business key. Product-neutral: same shape on any connected product.",
|
|
82
|
+
inputSchema: {
|
|
83
|
+
id: z.string().describe('The test case id (or business key) to read.'),
|
|
84
|
+
},
|
|
85
|
+
annotations: { readOnlyHint: true },
|
|
86
|
+
}, async ({ id }) => {
|
|
87
|
+
const adapter = deps.getAdapter();
|
|
88
|
+
if (!adapter)
|
|
89
|
+
return err(NOT_CONNECTED);
|
|
90
|
+
try {
|
|
91
|
+
const tc = await adapter.getTestCase(id);
|
|
92
|
+
const steps = tc.steps.length;
|
|
93
|
+
const header = `**${tc.title}**${tc.id ? ` · ${tc.id}` : ''}\n` +
|
|
94
|
+
`priority: ${tc.priority} · category: ${tc.category}` +
|
|
95
|
+
`${tc.status ? ` · status: ${tc.status}` : ''} · ${steps} step${steps === 1 ? '' : 's'}`;
|
|
96
|
+
return ok(`${header}\n\n${stepsMarkdown(tc)}`, { tc });
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
return err(describeError(e));
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
server.registerTool('tc_delete', {
|
|
103
|
+
title: 'Delete a test case',
|
|
104
|
+
description: 'Delete an existing test case in the connected product. It is RECOVERABLE from the product ' +
|
|
105
|
+
'recycle bin, not a hard delete. Requires a live connection (qa_connect). `tcId` accepts the ' +
|
|
106
|
+
"product's id or business key. Product-neutral.",
|
|
107
|
+
inputSchema: { tcId: z.string().describe('The test case id (or business key) to delete.') },
|
|
108
|
+
annotations: { readOnlyHint: false },
|
|
109
|
+
}, async ({ tcId }) => {
|
|
110
|
+
const adapter = deps.getAdapter();
|
|
111
|
+
if (!adapter)
|
|
112
|
+
return err(NOT_CONNECTED);
|
|
113
|
+
try {
|
|
114
|
+
await adapter.deleteTestCase(tcId);
|
|
115
|
+
return ok(`Deleted ${tcId} — recoverable from the product's recycle bin.`);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
return err(describeError(e));
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
server.registerTool('story_list', {
|
|
122
|
+
title: 'List / search user stories',
|
|
123
|
+
description: 'Pull up USER STORIES in the connected project — id, key (US_…), title, status. Give `search` to ' +
|
|
124
|
+
'find stories by keyword (matches key / title / description / acceptance criteria). Use story_get ' +
|
|
125
|
+
'to read one with its acceptance criteria, then draft manual test cases for it. Requires a live ' +
|
|
126
|
+
'connection (qa_connect). Read-only and product-neutral.',
|
|
127
|
+
inputSchema: {
|
|
128
|
+
search: z.string().optional().describe('Keyword to find stories (key / title / description / AC).'),
|
|
129
|
+
status: z.string().optional(),
|
|
130
|
+
limit: z.number().int().positive().optional(),
|
|
131
|
+
offset: z.number().int().nonnegative().optional(),
|
|
132
|
+
},
|
|
133
|
+
annotations: { readOnlyHint: true },
|
|
134
|
+
}, async ({ search, status, limit, offset }) => {
|
|
135
|
+
const adapter = deps.getAdapter();
|
|
136
|
+
if (!adapter)
|
|
137
|
+
return err(NOT_CONNECTED);
|
|
138
|
+
if (!adapter.listStories)
|
|
139
|
+
return err('This product does not expose a user-story backlog.');
|
|
140
|
+
try {
|
|
141
|
+
const rows = await adapter.listStories({
|
|
142
|
+
...(search ? { search } : {}),
|
|
143
|
+
...(status ? { status } : {}),
|
|
144
|
+
...(limit != null ? { limit } : {}),
|
|
145
|
+
...(offset != null ? { offset } : {}),
|
|
146
|
+
});
|
|
147
|
+
if (!rows.length)
|
|
148
|
+
return ok('No user stories found.', { stories: [] });
|
|
149
|
+
const text = `${rows.length} stor${rows.length === 1 ? 'y' : 'ies'}:\n\n` +
|
|
150
|
+
'| key | title | status |\n|---|---|---|\n' +
|
|
151
|
+
rows.map((s) => `| ${escCell(s.key ?? s.id)} | ${escCell(s.title)} | ${escCell(s.status ?? '-')} |`).join('\n');
|
|
152
|
+
return ok(text, { stories: rows });
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
return err(describeError(e));
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
server.registerTool('story_get', {
|
|
159
|
+
title: 'Read one user story (with acceptance criteria)',
|
|
160
|
+
description: 'Read a single user story — title, description, and ACCEPTANCE CRITERIA — from the connected ' +
|
|
161
|
+
'product. `id` accepts the story id or its business key (US_123). Read this before drafting manual ' +
|
|
162
|
+
'test cases so they cover the acceptance criteria. Requires a live connection.',
|
|
163
|
+
inputSchema: { id: z.string().describe('Story id or business key (US_123).') },
|
|
164
|
+
annotations: { readOnlyHint: true },
|
|
165
|
+
}, async ({ id }) => {
|
|
166
|
+
const adapter = deps.getAdapter();
|
|
167
|
+
if (!adapter)
|
|
168
|
+
return err(NOT_CONNECTED);
|
|
169
|
+
if (!adapter.getStory)
|
|
170
|
+
return err('This product does not expose a user-story backlog.');
|
|
171
|
+
try {
|
|
172
|
+
const story = await adapter.getStory(id);
|
|
173
|
+
const ac = story.acceptanceCriteria ?? [];
|
|
174
|
+
const header = `**${story.title}**${story.key ? ` · ${story.key}` : ''}${story.status ? ` · ${story.status}` : ''}`;
|
|
175
|
+
const desc = story.description ? `\n\n${story.description}` : '';
|
|
176
|
+
const acBlock = ac.length
|
|
177
|
+
? `\n\n**Acceptance criteria (${ac.length}):**\n` + ac.map((c, i) => `${i + 1}. ${c}`).join('\n')
|
|
178
|
+
: '\n\n_No acceptance criteria on this story._';
|
|
179
|
+
return ok(`${header}${desc}${acBlock}`, { story });
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
return err(describeError(e));
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
server.registerTool('suite_list', {
|
|
186
|
+
title: 'List test suites',
|
|
187
|
+
description: 'List the test suites in the connected product — id, name, and member (test-case) count. Use ' +
|
|
188
|
+
'suite_get to read one with its ordered members, or suite_run to execute one. Requires a live ' +
|
|
189
|
+
'connection (qa_connect). Read-only and product-neutral.',
|
|
190
|
+
inputSchema: {},
|
|
191
|
+
annotations: { readOnlyHint: true },
|
|
192
|
+
}, async () => {
|
|
193
|
+
const adapter = deps.getAdapter();
|
|
194
|
+
if (!adapter)
|
|
195
|
+
return err(NOT_CONNECTED);
|
|
196
|
+
try {
|
|
197
|
+
const rows = await adapter.listSuites();
|
|
198
|
+
if (!rows.length)
|
|
199
|
+
return ok('No test suites found.', { suites: [] });
|
|
200
|
+
const text = `${rows.length} suite${rows.length === 1 ? '' : 's'}:\n\n` +
|
|
201
|
+
'| id | name | test cases |\n|---|---|---|\n' +
|
|
202
|
+
rows.map((s) => `| ${escCell(s.id)} | ${escCell(s.name)} | ${s.memberCount ?? '-'} |`).join('\n');
|
|
203
|
+
return ok(text, { suites: rows });
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
return err(describeError(e));
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
server.registerTool('suite_get', {
|
|
210
|
+
title: 'Read one test suite (with members)',
|
|
211
|
+
description: 'Read a single test suite — its name, description, and ORDERED member test cases — from the ' +
|
|
212
|
+
'connected product. Requires a live connection (qa_connect). `id` is the suite id. ' +
|
|
213
|
+
'Product-neutral: same shape on any connected product.',
|
|
214
|
+
inputSchema: {
|
|
215
|
+
id: z.string().describe('The suite id to read.'),
|
|
216
|
+
},
|
|
217
|
+
annotations: { readOnlyHint: true },
|
|
218
|
+
}, async ({ id }) => {
|
|
219
|
+
const adapter = deps.getAdapter();
|
|
220
|
+
if (!adapter)
|
|
221
|
+
return err(NOT_CONNECTED);
|
|
222
|
+
try {
|
|
223
|
+
const suite = await adapter.getSuite(id);
|
|
224
|
+
const n = suite.members.length;
|
|
225
|
+
const header = `**${suite.name}**${suite.id ? ` · ${suite.id}` : ''}` +
|
|
226
|
+
`${suite.description ? `\n${suite.description}` : ''}\n${n} test case${n === 1 ? '' : 's'}`;
|
|
227
|
+
const body = n
|
|
228
|
+
? '\n\n| order | test case |\n|---|---|\n' +
|
|
229
|
+
suite.members.map((m) => `| ${m.order} | ${escCell(m.tcId)} |`).join('\n')
|
|
230
|
+
: '';
|
|
231
|
+
return ok(`${header}${body}`, { suite });
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
return err(describeError(e));
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
// --- Suite membership edits (writes) --------------------------------------
|
|
238
|
+
// Kept beside suite_list/suite_get so all suite tools live together; they mutate
|
|
239
|
+
// via the adapter's updateSuiteMembers (→ update_suite_members provider-op).
|
|
240
|
+
const membersTable = (suite) => suite.members.length
|
|
241
|
+
? '\n\n| order | test case |\n|---|---|\n' +
|
|
242
|
+
suite.members.map((m) => `| ${m.order} | ${escCell(m.tcId)} |`).join('\n')
|
|
243
|
+
: '';
|
|
244
|
+
server.registerTool('suite_add_testcases', {
|
|
245
|
+
title: 'Add test cases to a suite',
|
|
246
|
+
description: 'Add one or more EXISTING test cases to a suite (appended in order). `tcIds` accepts ids or ' +
|
|
247
|
+
'business keys (e.g. TC_123) — use suite_list / tc_list to find them. NOTE: a suite can only ' +
|
|
248
|
+
'hold test cases of ONE category (all manual OR all automated) — the product rejects a mix. ' +
|
|
249
|
+
'Requires a live connection. Returns the updated suite with its members.',
|
|
250
|
+
inputSchema: {
|
|
251
|
+
suiteId: z.string().describe('The suite id to add to (from suite_list).'),
|
|
252
|
+
tcIds: z.array(z.string()).min(1).describe('Test case ids / business keys to add.'),
|
|
253
|
+
},
|
|
254
|
+
annotations: { readOnlyHint: false },
|
|
255
|
+
}, async ({ suiteId, tcIds }) => {
|
|
256
|
+
const adapter = deps.getAdapter();
|
|
257
|
+
if (!adapter)
|
|
258
|
+
return err(NOT_CONNECTED);
|
|
259
|
+
try {
|
|
260
|
+
const ops = tcIds.map((tcId) => ({ op: 'add', tcId }));
|
|
261
|
+
const suite = await adapter.updateSuiteMembers(suiteId, ops);
|
|
262
|
+
const n = suite.members.length;
|
|
263
|
+
return ok(`Added ${tcIds.length} test case${tcIds.length === 1 ? '' : 's'} to **${suite.name}** — now ${n} member${n === 1 ? '' : 's'}.` +
|
|
264
|
+
membersTable(suite), { suite });
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
return err(describeError(e));
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
server.registerTool('suite_remove_testcases', {
|
|
271
|
+
title: 'Remove test cases from a suite',
|
|
272
|
+
description: 'Remove one or more test cases from a suite. `tcIds` accepts ids or business keys; every ' +
|
|
273
|
+
'occurrence of each is removed and the remaining members are reordered. Requires a live ' +
|
|
274
|
+
'connection. Returns the updated suite with its members.',
|
|
275
|
+
inputSchema: {
|
|
276
|
+
suiteId: z.string().describe('The suite id to remove from.'),
|
|
277
|
+
tcIds: z.array(z.string()).min(1).describe('Test case ids / business keys to remove.'),
|
|
278
|
+
},
|
|
279
|
+
annotations: { readOnlyHint: false },
|
|
280
|
+
}, async ({ suiteId, tcIds }) => {
|
|
281
|
+
const adapter = deps.getAdapter();
|
|
282
|
+
if (!adapter)
|
|
283
|
+
return err(NOT_CONNECTED);
|
|
284
|
+
try {
|
|
285
|
+
const ops = tcIds.map((tcId) => ({ op: 'remove', tcId }));
|
|
286
|
+
const suite = await adapter.updateSuiteMembers(suiteId, ops);
|
|
287
|
+
const n = suite.members.length;
|
|
288
|
+
return ok(`Removed ${tcIds.length} test case${tcIds.length === 1 ? '' : 's'} from **${suite.name}** — now ${n} member${n === 1 ? '' : 's'}.` +
|
|
289
|
+
membersTable(suite), { suite });
|
|
290
|
+
}
|
|
291
|
+
catch (e) {
|
|
292
|
+
return err(describeError(e));
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
// --- Journal-first editing: READ side (journal_grep) ----------------------
|
|
296
|
+
// The write side (journal_modify) forwards to the agent's edit_journal op.
|
|
297
|
+
server.registerTool('journal_grep', {
|
|
298
|
+
title: 'Read a test case for editing (journal view)',
|
|
299
|
+
description: 'Load a test case as NUMBERED steps to edit — from its recording JOURNAL when one exists (so a ' +
|
|
300
|
+
'later journal_modify stays healer/re-record consistent), else from its persisted steps (the ' +
|
|
301
|
+
'`source` is reported). Optional `pattern` filters shown rows (case-insensitive substring over ' +
|
|
302
|
+
'the step description) to help locate a range for journal_modify. Requires a live connection.',
|
|
303
|
+
inputSchema: {
|
|
304
|
+
tcId: z.string().describe('Test case id or business key.'),
|
|
305
|
+
pattern: z.string().optional().describe('Case-insensitive substring filter over step descriptions.'),
|
|
306
|
+
},
|
|
307
|
+
annotations: { readOnlyHint: true },
|
|
308
|
+
}, async ({ tcId, pattern }) => {
|
|
309
|
+
const adapter = deps.getAdapter();
|
|
310
|
+
if (!adapter)
|
|
311
|
+
return err(NOT_CONNECTED);
|
|
312
|
+
if (!adapter.readJournal)
|
|
313
|
+
return err('This product has no recording journal.');
|
|
314
|
+
try {
|
|
315
|
+
const view = await adapter.readJournal(tcId);
|
|
316
|
+
const p = pattern?.toLowerCase();
|
|
317
|
+
const rows = view.steps
|
|
318
|
+
.filter((s) => !p || (s.description ?? '').toLowerCase().includes(p))
|
|
319
|
+
.map((s) => `| ${s.n} | ${escCell(s.stepType)}${s.controlFlow ? `/${s.controlFlow.kind}` : ''} | ${escCell(s.description)} |`);
|
|
320
|
+
const staleness = view.source === 'journal'
|
|
321
|
+
? ` · journal seed${view.ageDays != null ? ` (${view.ageDays}d old)` : ''}`
|
|
322
|
+
: ' · NO journal seed — showing persisted steps (a new-interaction add would be steps-only)';
|
|
323
|
+
const header = `**${tcId}** — ${view.steps.length} step${view.steps.length === 1 ? '' : 's'} · source: ${view.source}${staleness}`;
|
|
324
|
+
const body = rows.length
|
|
325
|
+
? '\n\n| n | type | description |\n|---|---|---|\n' + rows.join('\n')
|
|
326
|
+
: `\n\n(no steps${pattern ? ' match the filter' : ''})`;
|
|
327
|
+
return ok(`${header}${body}`, { view });
|
|
328
|
+
}
|
|
329
|
+
catch (e) {
|
|
330
|
+
return err(describeError(e));
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
server.registerTool('journal_modify', {
|
|
334
|
+
title: 'Modify a test case (steps, loops, if-else, nested)',
|
|
335
|
+
description: 'Apply granular edits to an EXISTING test case and persist them, opening the result in the ' +
|
|
336
|
+
'Walnut editor. Use journal_grep first to see the numbered steps, then pass ops (numbers are ' +
|
|
337
|
+
'from that view, 1-based):\n' +
|
|
338
|
+
' • add_step / update_step / remove_step / move_step — edit individual steps\n' +
|
|
339
|
+
' • wrap_in_loop { from, to, condition?, maxIterations? } — wrap steps from..to in a while loop\n' +
|
|
340
|
+
' • wrap_in_if { from, to, condition? } — wrap steps from..to in an if block\n' +
|
|
341
|
+
' • insert_nested { at?, tcId, name? } — insert an existing test case as a nested step (reuse)\n' +
|
|
342
|
+
'For a test case backed by a recording journal the journal is kept in sync (so healer / ' +
|
|
343
|
+
're-record stay consistent); others edit the persisted steps. NOTE: adding a brand-new ' +
|
|
344
|
+
'INTERACTION step (click/type on a new element) via add_step has no captured locator, so it is ' +
|
|
345
|
+
'a manual/non-executable step — capture new interactions by recording instead. Requires a live connection.',
|
|
346
|
+
inputSchema: {
|
|
347
|
+
tcId: z.string().describe('Test case id or business key.'),
|
|
348
|
+
ops: z.array(zJournalOp).min(1).describe('Ops to apply, in order.'),
|
|
349
|
+
},
|
|
350
|
+
annotations: { readOnlyHint: false },
|
|
351
|
+
}, async ({ tcId, ops }) => {
|
|
352
|
+
const adapter = deps.getAdapter();
|
|
353
|
+
if (!adapter)
|
|
354
|
+
return err(NOT_CONNECTED);
|
|
355
|
+
if (!adapter.editJournal)
|
|
356
|
+
return err('This product has no editable recording journal.');
|
|
357
|
+
try {
|
|
358
|
+
const view = await adapter.editJournal(tcId, ops);
|
|
359
|
+
const rows = view.steps.map((s) => `| ${s.n} | ${escCell(s.stepType)}${s.controlFlow ? `/${s.controlFlow.kind}` : ''} | ${escCell(s.description)} |`);
|
|
360
|
+
return ok(`Updated **${tcId}** — ${view.steps.length} step${view.steps.length === 1 ? '' : 's'} (opened in the editor).` +
|
|
361
|
+
'\n\n| n | type | description |\n|---|---|---|\n' +
|
|
362
|
+
rows.join('\n'), { view });
|
|
363
|
+
}
|
|
364
|
+
catch (e) {
|
|
365
|
+
return err(describeError(e));
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=discovery.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.tools.js","sourceRoot":"","sources":["../../src/tools/discovery.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TestCase, ValidationIssue } from '../domain/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Readable markdown steps table shared by every draft-returning tool (spec:
|
|
4
|
+
* "one shared helper, not duplicated per tool"). Depth tracking mirrors
|
|
5
|
+
* src/ui/editor.ts's own JS renderer: a CF_CLOSE row dedents to its opening
|
|
6
|
+
* row's level BEFORE rendering (so `IF_END` lines up with its `IF`), and a
|
|
7
|
+
* CF_OPEN row indents everything AFTER it.
|
|
8
|
+
*/
|
|
9
|
+
export declare function stepsMarkdown(tc: TestCase): string;
|
|
10
|
+
/** The one-line validation summary every draft-returning tool includes
|
|
11
|
+
* alongside its steps table and draftId, e.g. "10 steps · validation ✓". */
|
|
12
|
+
export declare function validationSummaryLine(tc: TestCase, issues: ValidationIssue[]): string;
|
|
13
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/tools/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAgC/E;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAsBlD;AAED;4EAC4E;AAC5E,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAMrF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const CF_LABEL = {
|
|
2
|
+
if: 'IF',
|
|
3
|
+
else: 'ELSE',
|
|
4
|
+
if_end: 'IF_END',
|
|
5
|
+
while: 'WHILE',
|
|
6
|
+
while_end: 'WHILE_END',
|
|
7
|
+
};
|
|
8
|
+
const CF_OPEN = new Set(['if', 'while']);
|
|
9
|
+
const CF_CLOSE = new Set(['if_end', 'while_end']);
|
|
10
|
+
// Markdown table cells collapse leading plain spaces, so a nested step's indent
|
|
11
|
+
// would otherwise be invisible in most renderers (and in a raw-text CLI, plain
|
|
12
|
+
// spaces at a cell boundary are easy to miss entirely). survives both.
|
|
13
|
+
const INDENT_UNIT = ' ';
|
|
14
|
+
function escCell(v) {
|
|
15
|
+
return String(v ?? '').replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
|
|
16
|
+
}
|
|
17
|
+
function conditionText(c, maxIterations) {
|
|
18
|
+
if (!c)
|
|
19
|
+
return maxIterations ? `max ${maxIterations} iterations` : '';
|
|
20
|
+
const bits = [
|
|
21
|
+
c.type,
|
|
22
|
+
c.selector,
|
|
23
|
+
c.text != null ? JSON.stringify(c.text) : undefined,
|
|
24
|
+
c.variableName ? `${c.variableName}${c.variableValue != null ? ` = ${c.variableValue}` : ''}` : undefined,
|
|
25
|
+
].filter((b) => !!b);
|
|
26
|
+
return bits.join(' · ');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Readable markdown steps table shared by every draft-returning tool (spec:
|
|
30
|
+
* "one shared helper, not duplicated per tool"). Depth tracking mirrors
|
|
31
|
+
* src/ui/editor.ts's own JS renderer: a CF_CLOSE row dedents to its opening
|
|
32
|
+
* row's level BEFORE rendering (so `IF_END` lines up with its `IF`), and a
|
|
33
|
+
* CF_OPEN row indents everything AFTER it.
|
|
34
|
+
*/
|
|
35
|
+
export function stepsMarkdown(tc) {
|
|
36
|
+
if (!tc.steps.length)
|
|
37
|
+
return '_(no steps yet)_';
|
|
38
|
+
const rows = ['| # | action | description | value | expected |', '|---|---|---|---|---|'];
|
|
39
|
+
let depth = 0;
|
|
40
|
+
for (const s of tc.steps) {
|
|
41
|
+
const kind = s.controlFlow?.kind;
|
|
42
|
+
if (kind && CF_CLOSE.has(kind))
|
|
43
|
+
depth = Math.max(0, depth - 1);
|
|
44
|
+
const indent = INDENT_UNIT.repeat(depth);
|
|
45
|
+
const action = kind ? `**${CF_LABEL[kind] ?? kind}**` : `\`${s.actionType}\``;
|
|
46
|
+
const description = `${indent}${escCell(s.description)}`;
|
|
47
|
+
const value = kind ? escCell(conditionText(s.controlFlow?.condition, s.controlFlow?.maxIterations)) : escCell(s.value);
|
|
48
|
+
const expected = escCell(s.expectedResult);
|
|
49
|
+
rows.push(`| ${s.n} | ${action} | ${description} | ${value} | ${expected} |`);
|
|
50
|
+
if (kind && CF_OPEN.has(kind))
|
|
51
|
+
depth++;
|
|
52
|
+
}
|
|
53
|
+
return rows.join('\n');
|
|
54
|
+
}
|
|
55
|
+
/** The one-line validation summary every draft-returning tool includes
|
|
56
|
+
* alongside its steps table and draftId, e.g. "10 steps · validation ✓". */
|
|
57
|
+
export function validationSummaryLine(tc, issues) {
|
|
58
|
+
const n = tc.steps.length;
|
|
59
|
+
const noun = `${n} step${n === 1 ? '' : 's'}`;
|
|
60
|
+
if (!issues.length)
|
|
61
|
+
return `${noun} · validation ✓`;
|
|
62
|
+
const detail = issues.map((i) => `step ${i.step ?? '-'}${i.field ? ` (${i.field})` : ''}: ${i.msg}`).join('; ');
|
|
63
|
+
return `${noun} · validation ✗ -- ${detail}`;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/tools/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ProviderAdapter } from '../adapters/types.js';
|
|
3
|
+
import type { DraftStore } from '../drafts/store.js';
|
|
4
|
+
export type RecordingToolsDeps = {
|
|
5
|
+
getAdapter: () => ProviderAdapter | null;
|
|
6
|
+
isConnected: () => boolean;
|
|
7
|
+
/** True only when the live connection is SimplifyQA. The granular-verb proxying + real-schema
|
|
8
|
+
* preservation below are SimplifyQA-only; Walnut keeps its exact prior surface (its `web`/android/
|
|
9
|
+
* mainframe/db sub-agents + permissive schemas), so this change cannot affect Walnut. */
|
|
10
|
+
isSimplifyqa: () => boolean;
|
|
11
|
+
/** Common's DraftStore — the draft bridge re-registers the agent's assembled recording here so
|
|
12
|
+
* tc_save (which reads THIS store) can persist it. */
|
|
13
|
+
drafts: DraftStore;
|
|
14
|
+
};
|
|
15
|
+
export declare function registerRecordingPassthrough(server: McpServer, deps: RecordingToolsDeps): void;
|
|
16
|
+
//# sourceMappingURL=recording.tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.tools.d.ts","sourceRoot":"","sources":["../../src/tools/recording.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAgJrD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,eAAe,GAAG,IAAI,CAAC;IACzC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B;;8FAE0F;IAC1F,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B;2DACuD;IACvD,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CA8F9F"}
|