common-qa-mcp 0.2.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.
- package/README.md +6 -0
- package/dist/adapters/factory.d.ts +17 -7
- package/dist/adapters/factory.d.ts.map +1 -1
- package/dist/adapters/factory.js +44 -7
- package/dist/adapters/factory.js.map +1 -1
- package/dist/adapters/http.d.ts +50 -0
- package/dist/adapters/http.d.ts.map +1 -0
- package/dist/adapters/http.js +108 -0
- package/dist/adapters/http.js.map +1 -0
- package/dist/adapters/remoteMcp/adapter.d.ts +16 -2
- package/dist/adapters/remoteMcp/adapter.d.ts.map +1 -1
- package/dist/adapters/remoteMcp/adapter.js +34 -5
- package/dist/adapters/remoteMcp/adapter.js.map +1 -1
- package/dist/adapters/simplifyqa/adapter.d.ts +437 -0
- package/dist/adapters/simplifyqa/adapter.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/adapter.js +3097 -0
- package/dist/adapters/simplifyqa/adapter.js.map +1 -0
- package/dist/adapters/simplifyqa/mapper.d.ts +95 -0
- package/dist/adapters/simplifyqa/mapper.d.ts.map +1 -0
- package/dist/adapters/simplifyqa/mapper.js +858 -0
- package/dist/adapters/simplifyqa/mapper.js.map +1 -0
- package/dist/adapters/types.d.ts +168 -5
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/walnut/adapter.d.ts +235 -0
- package/dist/adapters/walnut/adapter.d.ts.map +1 -0
- package/dist/adapters/walnut/adapter.js +1114 -0
- package/dist/adapters/walnut/adapter.js.map +1 -0
- package/dist/adapters/walnut/mapper.d.ts +30 -9
- package/dist/adapters/walnut/mapper.d.ts.map +1 -1
- package/dist/adapters/walnut/mapper.js +149 -24
- package/dist/adapters/walnut/mapper.js.map +1 -1
- package/dist/config.d.ts +38 -14
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +73 -19
- package/dist/config.js.map +1 -1
- package/dist/connection.d.ts +3 -2
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +44 -15
- package/dist/connection.js.map +1 -1
- package/dist/domain/types.d.ts +680 -5
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/drafts/store.d.ts +4 -1
- package/dist/drafts/store.d.ts.map +1 -1
- package/dist/drafts/store.js +7 -2
- package/dist/drafts/store.js.map +1 -1
- package/dist/initAgents.d.ts.map +1 -1
- package/dist/initAgents.js +48 -18
- package/dist/initAgents.js.map +1 -1
- package/dist/requestConnection.d.ts +5 -3
- package/dist/requestConnection.d.ts.map +1 -1
- package/dist/requestConnection.js +11 -5
- package/dist/requestConnection.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +47 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/backlog.tools.d.ts +13 -0
- package/dist/tools/backlog.tools.d.ts.map +1 -0
- package/dist/tools/backlog.tools.js +399 -0
- package/dist/tools/backlog.tools.js.map +1 -0
- package/dist/tools/connection.tools.js +5 -5
- package/dist/tools/connection.tools.js.map +1 -1
- package/dist/tools/defects.tools.d.ts +7 -0
- package/dist/tools/defects.tools.d.ts.map +1 -0
- package/dist/tools/defects.tools.js +82 -0
- package/dist/tools/defects.tools.js.map +1 -0
- package/dist/tools/discovery.tools.d.ts.map +1 -1
- package/dist/tools/discovery.tools.js +951 -43
- package/dist/tools/discovery.tools.js.map +1 -1
- package/dist/tools/formulas.tools.d.ts +7 -0
- package/dist/tools/formulas.tools.d.ts.map +1 -0
- package/dist/tools/formulas.tools.js +56 -0
- package/dist/tools/formulas.tools.js.map +1 -0
- package/dist/tools/heal.tools.d.ts +17 -0
- package/dist/tools/heal.tools.d.ts.map +1 -0
- package/dist/tools/heal.tools.js +76 -0
- package/dist/tools/heal.tools.js.map +1 -0
- package/dist/tools/markdown.d.ts +3 -3
- package/dist/tools/markdown.d.ts.map +1 -1
- package/dist/tools/markdown.js +89 -18
- package/dist/tools/markdown.js.map +1 -1
- package/dist/tools/objects.tools.d.ts +7 -0
- package/dist/tools/objects.tools.d.ts.map +1 -0
- package/dist/tools/objects.tools.js +201 -0
- package/dist/tools/objects.tools.js.map +1 -0
- package/dist/tools/recording.tools.d.ts.map +1 -1
- package/dist/tools/recording.tools.js +92 -12
- package/dist/tools/recording.tools.js.map +1 -1
- package/dist/tools/run.tools.d.ts.map +1 -1
- package/dist/tools/run.tools.js +464 -39
- package/dist/tools/run.tools.js.map +1 -1
- package/dist/tools/schemas.d.ts +21 -4
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +14 -1
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/storySync.tools.d.ts +66 -0
- package/dist/tools/storySync.tools.d.ts.map +1 -0
- package/dist/tools/storySync.tools.js +213 -0
- package/dist/tools/storySync.tools.js.map +1 -0
- package/dist/tools/tasks.tools.d.ts +7 -0
- package/dist/tools/tasks.tools.d.ts.map +1 -0
- package/dist/tools/tasks.tools.js +75 -0
- package/dist/tools/tasks.tools.js.map +1 -0
- package/dist/tools/testcase.tools.d.ts.map +1 -1
- package/dist/tools/testcase.tools.js +162 -101
- package/dist/tools/testcase.tools.js.map +1 -1
- package/dist/tools/testdata.tools.d.ts +7 -0
- package/dist/tools/testdata.tools.d.ts.map +1 -0
- package/dist/tools/testdata.tools.js +249 -0
- package/dist/tools/testdata.tools.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ok, err } from '../mcpResult.js';
|
|
3
|
+
function describeError(e) {
|
|
4
|
+
return e instanceof Error ? e.message : String(e);
|
|
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
|
+
}
|
|
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
|
+
});
|
|
57
|
+
server.registerTool('tc_get_testdata', {
|
|
58
|
+
title: 'Read the current testdata template for a test case',
|
|
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.',
|
|
66
|
+
inputSchema: {
|
|
67
|
+
tcId: z.string().describe('Test case id (or business key like TC_123).'),
|
|
68
|
+
environmentType: z.string().optional()
|
|
69
|
+
.describe('Env `key` (from tc_list_environments). REQUIRED — this tool refuses when omitted. Ask the user which env before reading testdata.'),
|
|
70
|
+
},
|
|
71
|
+
annotations: { readOnlyHint: true },
|
|
72
|
+
}, async ({ tcId, environmentType }) => {
|
|
73
|
+
const adapter = deps.getAdapter?.();
|
|
74
|
+
if (!adapter)
|
|
75
|
+
return err('Not connected to a product. Use qa_connect first.');
|
|
76
|
+
if (!adapter.getDefaultIteration) {
|
|
77
|
+
return err('This provider does not expose a testdata store.');
|
|
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);
|
|
88
|
+
try {
|
|
89
|
+
const tpl = await adapter.getDefaultIteration({
|
|
90
|
+
tcId,
|
|
91
|
+
...(environmentType !== undefined ? { environmentType } : {}),
|
|
92
|
+
});
|
|
93
|
+
if (!tpl.parameters?.length) {
|
|
94
|
+
return ok(`Test case "${tcId}" has no parameterized fields in env "${tpl.environmentType}" — nothing to generate.`, { tcId, parameters: [] });
|
|
95
|
+
}
|
|
96
|
+
const text = `Testdata template for ${tcId} · env ${tpl.environmentType} · version ${tpl.versionId}\n` +
|
|
97
|
+
`${tpl.parameters.length} parameter(s):\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');
|
|
103
|
+
return ok(text, {
|
|
104
|
+
tcId,
|
|
105
|
+
versionId: tpl.versionId,
|
|
106
|
+
environmentType: tpl.environmentType,
|
|
107
|
+
parameters: tpl.parameters,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
return err(`Could not read testdata for "${tcId}": ${describeError(e)}`);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
server.registerTool('tc_generate_testdata', {
|
|
115
|
+
title: 'Save generated testdata rows to a test case',
|
|
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' +
|
|
121
|
+
' 1) Model-generated — pass `rows: [{paramName: value}, ...]`. Call tc_get_testdata first ' +
|
|
122
|
+
'for the parameter names + seeds, tc_get for step context, then produce rows that fit the flow.\n' +
|
|
123
|
+
' 2) Formula-driven — pass `formulas: {paramName: {name, args?}}` (names from tc_list_formulas). ' +
|
|
124
|
+
'The adapter evaluates each formula per row via /tm/customFormula and stamps both the value ' +
|
|
125
|
+
'and the source `=NAME(...)` expression. Use `count` to say how many rows, or provide `rows` ' +
|
|
126
|
+
'for constant columns; mixing is fine (formulas win over row values for the same param).\n' +
|
|
127
|
+
'Rows are appended as new iterations; they do not become the default. Hard cap: 20 rows.',
|
|
128
|
+
inputSchema: {
|
|
129
|
+
tcId: z.string().describe('Test case id (or business key like TC_123).'),
|
|
130
|
+
rows: z.array(z.record(z.string(), z.string())).max(20).optional()
|
|
131
|
+
.describe('Rows keyed by param name (from tc_get_testdata). 1..20 rows. Omit when using formulas + count.'),
|
|
132
|
+
count: z.number().int().min(1).max(20).optional()
|
|
133
|
+
.describe('How many rows to generate when using formulas without explicit rows. Ignored if rows is set.'),
|
|
134
|
+
formulas: z.record(z.string(), z.object({
|
|
135
|
+
name: z.string().describe('RAW formula name from tc_list_formulas — the identifier only, no parens, no arg list. Correct: "FIRST_NAME". Wrong: "FIRST_NAME()", "FIRST_NAME(country,sex)".'),
|
|
136
|
+
args: z.record(z.string(), z.string()).optional()
|
|
137
|
+
.describe('Named args. Keys MUST match Formula.parameters[].keyName exactly, no trailing colons or extra whitespace. Correct: {"country name": "United States"}. Wrong: {"country name:": "..."}.'),
|
|
138
|
+
})).optional()
|
|
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.'),
|
|
140
|
+
environmentType: z.string().optional()
|
|
141
|
+
.describe('Env `key` (from tc_list_environments). REQUIRED — this tool refuses when omitted. Ask the user which env before generating.'),
|
|
142
|
+
},
|
|
143
|
+
annotations: { readOnlyHint: false },
|
|
144
|
+
}, async ({ tcId, rows, count, formulas, environmentType }) => {
|
|
145
|
+
const adapter = deps.getAdapter?.();
|
|
146
|
+
if (!adapter)
|
|
147
|
+
return err('Not connected to a product. Use qa_connect first.');
|
|
148
|
+
if (!adapter.getDefaultIteration || !adapter.saveGeneratedIterations) {
|
|
149
|
+
return err('This provider does not expose a testdata store.');
|
|
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);
|
|
159
|
+
const hasFormulas = formulas != null && Object.keys(formulas).length > 0;
|
|
160
|
+
// Reconcile rows vs count. Explicit rows always win; otherwise formulas + count seeds N empty
|
|
161
|
+
// rows that the adapter fills column-by-column via evaluateFormula.
|
|
162
|
+
let baseRows;
|
|
163
|
+
if (rows && rows.length > 0) {
|
|
164
|
+
baseRows = rows;
|
|
165
|
+
}
|
|
166
|
+
else if (hasFormulas && count && count > 0) {
|
|
167
|
+
baseRows = Array.from({ length: count }, () => ({}));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
return err('Provide either `rows` (1..20) or `formulas` together with `count` (1..20).');
|
|
171
|
+
}
|
|
172
|
+
if (baseRows.length > 20)
|
|
173
|
+
return err('Max 20 rows per call.');
|
|
174
|
+
// Resolve version + env by re-reading the template. Server-side env resolution honors project
|
|
175
|
+
// config; passing rows without this echo would risk saving into the wrong env.
|
|
176
|
+
let tpl;
|
|
177
|
+
try {
|
|
178
|
+
tpl = await adapter.getDefaultIteration({
|
|
179
|
+
tcId,
|
|
180
|
+
...(environmentType !== undefined ? { environmentType } : {}),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
return err(`Could not fetch the default iteration for "${tcId}": ${describeError(e)}`);
|
|
185
|
+
}
|
|
186
|
+
if (!tpl.parameters?.length) {
|
|
187
|
+
return err(`Test case "${tcId}" has no parameterized fields — nothing to save.`);
|
|
188
|
+
}
|
|
189
|
+
const known = new Set(tpl.parameters.map((p) => p.name));
|
|
190
|
+
const unknown = new Set();
|
|
191
|
+
for (const r of baseRows)
|
|
192
|
+
for (const k of Object.keys(r))
|
|
193
|
+
if (!known.has(k))
|
|
194
|
+
unknown.add(k);
|
|
195
|
+
if (hasFormulas)
|
|
196
|
+
for (const k of Object.keys(formulas))
|
|
197
|
+
if (!known.has(k))
|
|
198
|
+
unknown.add(k);
|
|
199
|
+
let result;
|
|
200
|
+
try {
|
|
201
|
+
result = await adapter.saveGeneratedIterations({
|
|
202
|
+
tcId,
|
|
203
|
+
versionId: tpl.versionId,
|
|
204
|
+
environmentType: tpl.environmentType,
|
|
205
|
+
rows: baseRows,
|
|
206
|
+
parameters: tpl.parameters, // reuse the just-fetched template; adapter skips its own re-fetch
|
|
207
|
+
...(hasFormulas ? { formulas: formulas } : {}),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
return err(`Save failed: ${describeError(e)}`);
|
|
212
|
+
}
|
|
213
|
+
const paramNames = tpl.parameters.map((p) => p.name);
|
|
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
|
+
});
|
|
223
|
+
const formulaNote = hasFormulas
|
|
224
|
+
? `\nFormula columns: ${Object.keys(formulas).join(', ')} (evaluated per row).`
|
|
225
|
+
: '';
|
|
226
|
+
const warn = unknown.size
|
|
227
|
+
? `\n(Ignored unknown param name(s): ${[...unknown].join(', ')} — not in the template.)`
|
|
228
|
+
: '';
|
|
229
|
+
const protectedNote = protectedNames.size
|
|
230
|
+
? `\nProtected column(s) [${[...protectedNames].join(', ')}] are masked below — their values are never echoed by this tool.`
|
|
231
|
+
: '';
|
|
232
|
+
const link = result.datasetUrl ? `\n${result.datasetUrl}` : '';
|
|
233
|
+
const text = `Saved ${result.inserted} testdata row(s) for ${tcId} · env ${tpl.environmentType}.${link}${formulaNote}${warn}${protectedNote}\n\n` +
|
|
234
|
+
`Preview (first ${preview.length}, formula values shown as their param name):\n` +
|
|
235
|
+
preview
|
|
236
|
+
.map((r, i) => `${i + 1}. ${paramNames.map((n) => `${n}=${r[n] ?? (hasFormulas && (n in formulas) ? `<${formulas[n].name}()>` : '')}`).join(' | ')}`)
|
|
237
|
+
.join('\n');
|
|
238
|
+
return ok(text, {
|
|
239
|
+
tcId,
|
|
240
|
+
generated: result.inserted,
|
|
241
|
+
params: paramNames,
|
|
242
|
+
preview,
|
|
243
|
+
...(hasFormulas ? { formulasUsed: Object.keys(formulas) } : {}),
|
|
244
|
+
...(result.datasetUrl ? { datasetUrl: result.datasetUrl } : {}),
|
|
245
|
+
...(result.iterationIds ? { iterationIds: result.iterationIds } : {}),
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=testdata.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testdata.tools.js","sourceRoot":"","sources":["../../src/tools/testdata.tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "common-qa-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Common QA MCP — one product-neutral MCP that routes test-case lifecycle requests to Walnut or SimplifyQA for any AI client. Launch over stdio via npx; install the Walnut QA agent with `init-agents`.",
|
|
6
6
|
"bin": {
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "tsc",
|
|
36
36
|
"start": "node dist/cli.js",
|
|
37
|
-
"start:http": "node dist/httpMain.js",
|
|
38
37
|
"dev": "tsx src/cli.ts",
|
|
39
38
|
"dev:http": "tsx watch src/httpMain.ts",
|
|
40
39
|
"test": "jest",
|
|
41
|
-
"prepublishOnly": "npm run build"
|
|
40
|
+
"prepublishOnly": "npm run build",
|
|
41
|
+
"start:http": "node dist/httpMain.js"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.22.0",
|