@provartesting/provardx-cli 1.4.6 → 1.5.0-dev

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 (122) hide show
  1. package/README.md +292 -8
  2. package/lib/commands/provar/automation/config/validate.js.map +1 -1
  3. package/lib/commands/provar/automation/project/validate.d.ts +14 -0
  4. package/lib/commands/provar/automation/project/validate.js +69 -0
  5. package/lib/commands/provar/automation/project/validate.js.map +1 -0
  6. package/lib/commands/provar/mcp/start.d.ts +16 -0
  7. package/lib/commands/provar/mcp/start.js +62 -0
  8. package/lib/commands/provar/mcp/start.js.map +1 -0
  9. package/lib/commands/provar/quality-hub/connect.d.ts +5 -0
  10. package/lib/commands/provar/quality-hub/connect.js +12 -0
  11. package/lib/commands/provar/quality-hub/connect.js.map +1 -0
  12. package/lib/commands/provar/quality-hub/display.d.ts +5 -0
  13. package/lib/commands/provar/quality-hub/display.js +12 -0
  14. package/lib/commands/provar/quality-hub/display.js.map +1 -0
  15. package/lib/commands/provar/quality-hub/open.d.ts +5 -0
  16. package/lib/commands/provar/quality-hub/open.js +12 -0
  17. package/lib/commands/provar/quality-hub/open.js.map +1 -0
  18. package/lib/commands/provar/quality-hub/test/run/abort.d.ts +5 -0
  19. package/lib/commands/provar/quality-hub/test/run/abort.js +12 -0
  20. package/lib/commands/provar/quality-hub/test/run/abort.js.map +1 -0
  21. package/lib/commands/provar/quality-hub/test/run/report.d.ts +5 -0
  22. package/lib/commands/provar/quality-hub/test/run/report.js +12 -0
  23. package/lib/commands/provar/quality-hub/test/run/report.js.map +1 -0
  24. package/lib/commands/provar/quality-hub/test/run.d.ts +5 -0
  25. package/lib/commands/provar/quality-hub/test/run.js +12 -0
  26. package/lib/commands/provar/quality-hub/test/run.js.map +1 -0
  27. package/lib/commands/provar/quality-hub/testcase/retrieve.d.ts +5 -0
  28. package/lib/commands/provar/quality-hub/testcase/retrieve.js +12 -0
  29. package/lib/commands/provar/quality-hub/testcase/retrieve.js.map +1 -0
  30. package/lib/mcp/licensing/algasClient.d.ts +19 -0
  31. package/lib/mcp/licensing/algasClient.js +144 -0
  32. package/lib/mcp/licensing/algasClient.js.map +1 -0
  33. package/lib/mcp/licensing/ideDetection.d.ts +34 -0
  34. package/lib/mcp/licensing/ideDetection.js +179 -0
  35. package/lib/mcp/licensing/ideDetection.js.map +1 -0
  36. package/lib/mcp/licensing/index.d.ts +5 -0
  37. package/lib/mcp/licensing/index.js +10 -0
  38. package/lib/mcp/licensing/index.js.map +1 -0
  39. package/lib/mcp/licensing/licenseCache.d.ts +20 -0
  40. package/lib/mcp/licensing/licenseCache.js +79 -0
  41. package/lib/mcp/licensing/licenseCache.js.map +1 -0
  42. package/lib/mcp/licensing/licenseError.d.ts +4 -0
  43. package/lib/mcp/licensing/licenseError.js +15 -0
  44. package/lib/mcp/licensing/licenseError.js.map +1 -0
  45. package/lib/mcp/licensing/licenseValidator.d.ts +33 -0
  46. package/lib/mcp/licensing/licenseValidator.js +103 -0
  47. package/lib/mcp/licensing/licenseValidator.js.map +1 -0
  48. package/lib/mcp/logging/logger.d.ts +7 -0
  49. package/lib/mcp/logging/logger.js +22 -0
  50. package/lib/mcp/logging/logger.js.map +1 -0
  51. package/lib/mcp/rules/page_object_validation_rules.json +344 -0
  52. package/lib/mcp/rules/provar_best_practices_rules.json +3192 -0
  53. package/lib/mcp/schemas/common.d.ts +20 -0
  54. package/lib/mcp/schemas/common.js +16 -0
  55. package/lib/mcp/schemas/common.js.map +1 -0
  56. package/lib/mcp/security/pathPolicy.d.ts +14 -0
  57. package/lib/mcp/security/pathPolicy.js +38 -0
  58. package/lib/mcp/security/pathPolicy.js.map +1 -0
  59. package/lib/mcp/server.d.ts +5 -0
  60. package/lib/mcp/server.js +59 -0
  61. package/lib/mcp/server.js.map +1 -0
  62. package/lib/mcp/tools/antTools.d.ts +21 -0
  63. package/lib/mcp/tools/antTools.js +602 -0
  64. package/lib/mcp/tools/antTools.js.map +1 -0
  65. package/lib/mcp/tools/automationTools.d.ts +14 -0
  66. package/lib/mcp/tools/automationTools.js +386 -0
  67. package/lib/mcp/tools/automationTools.js.map +1 -0
  68. package/lib/mcp/tools/bestPracticesEngine.d.ts +30 -0
  69. package/lib/mcp/tools/bestPracticesEngine.js +632 -0
  70. package/lib/mcp/tools/bestPracticesEngine.js.map +1 -0
  71. package/lib/mcp/tools/defectTools.d.ts +15 -0
  72. package/lib/mcp/tools/defectTools.js +199 -0
  73. package/lib/mcp/tools/defectTools.js.map +1 -0
  74. package/lib/mcp/tools/hierarchyValidate.d.ts +139 -0
  75. package/lib/mcp/tools/hierarchyValidate.js +540 -0
  76. package/lib/mcp/tools/hierarchyValidate.js.map +1 -0
  77. package/lib/mcp/tools/pageObjectGenerate.d.ts +3 -0
  78. package/lib/mcp/tools/pageObjectGenerate.js +153 -0
  79. package/lib/mcp/tools/pageObjectGenerate.js.map +1 -0
  80. package/lib/mcp/tools/pageObjectValidate.d.ts +18 -0
  81. package/lib/mcp/tools/pageObjectValidate.js +420 -0
  82. package/lib/mcp/tools/pageObjectValidate.js.map +1 -0
  83. package/lib/mcp/tools/projectInspect.d.ts +3 -0
  84. package/lib/mcp/tools/projectInspect.js +694 -0
  85. package/lib/mcp/tools/projectInspect.js.map +1 -0
  86. package/lib/mcp/tools/projectValidateFromPath.d.ts +3 -0
  87. package/lib/mcp/tools/projectValidateFromPath.js +153 -0
  88. package/lib/mcp/tools/projectValidateFromPath.js.map +1 -0
  89. package/lib/mcp/tools/propertiesTools.d.ts +7 -0
  90. package/lib/mcp/tools/propertiesTools.js +314 -0
  91. package/lib/mcp/tools/propertiesTools.js.map +1 -0
  92. package/lib/mcp/tools/qualityHubTools.d.ts +8 -0
  93. package/lib/mcp/tools/qualityHubTools.js +178 -0
  94. package/lib/mcp/tools/qualityHubTools.js.map +1 -0
  95. package/lib/mcp/tools/rcaTools.d.ts +4 -0
  96. package/lib/mcp/tools/rcaTools.js +620 -0
  97. package/lib/mcp/tools/rcaTools.js.map +1 -0
  98. package/lib/mcp/tools/sfSpawn.d.ts +28 -0
  99. package/lib/mcp/tools/sfSpawn.js +50 -0
  100. package/lib/mcp/tools/sfSpawn.js.map +1 -0
  101. package/lib/mcp/tools/testCaseGenerate.d.ts +3 -0
  102. package/lib/mcp/tools/testCaseGenerate.js +221 -0
  103. package/lib/mcp/tools/testCaseGenerate.js.map +1 -0
  104. package/lib/mcp/tools/testCaseValidate.d.ts +20 -0
  105. package/lib/mcp/tools/testCaseValidate.js +227 -0
  106. package/lib/mcp/tools/testCaseValidate.js.map +1 -0
  107. package/lib/mcp/tools/testPlanTools.d.ts +6 -0
  108. package/lib/mcp/tools/testPlanTools.js +311 -0
  109. package/lib/mcp/tools/testPlanTools.js.map +1 -0
  110. package/lib/mcp/tools/testPlanValidate.d.ts +2 -0
  111. package/lib/mcp/tools/testPlanValidate.js +75 -0
  112. package/lib/mcp/tools/testPlanValidate.js.map +1 -0
  113. package/lib/mcp/tools/testSuiteValidate.d.ts +2 -0
  114. package/lib/mcp/tools/testSuiteValidate.js +63 -0
  115. package/lib/mcp/tools/testSuiteValidate.js.map +1 -0
  116. package/lib/services/projectValidation.d.ts +119 -0
  117. package/lib/services/projectValidation.js +678 -0
  118. package/lib/services/projectValidation.js.map +1 -0
  119. package/messages/sf.provar.automation.project.validate.md +52 -0
  120. package/messages/sf.provar.mcp.start.md +74 -0
  121. package/oclif.manifest.json +1298 -1
  122. package/package.json +29 -15
@@ -0,0 +1,311 @@
1
+ /*
2
+ * Copyright (c) 2024 Provar Limited.
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.md file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ /* eslint-disable camelcase */
8
+ import fs from 'node:fs';
9
+ import path from 'node:path';
10
+ import { randomUUID } from 'node:crypto';
11
+ import { z } from 'zod';
12
+ import { assertPathAllowed, PathPolicyError } from '../security/pathPolicy.js';
13
+ import { makeError, makeRequestId } from '../schemas/common.js';
14
+ import { log } from '../logging/logger.js';
15
+ // ── Helpers ───────────────────────────────────────────────────────────────────
16
+ /**
17
+ * Try to extract testCaseId from testcase XML content.
18
+ * Looks for registryId, id, or guid attributes on the root element.
19
+ */
20
+ function extractTestCaseId(xmlContent) {
21
+ for (const attr of ['registryId', 'id', 'guid']) {
22
+ const match = new RegExp(`${attr}="([^"]+)"`).exec(xmlContent);
23
+ if (match)
24
+ return match[1];
25
+ }
26
+ return null;
27
+ }
28
+ /** Normalize path separators to forward slashes. */
29
+ function toForwardSlashes(p) {
30
+ return p.replace(/\\/g, '/');
31
+ }
32
+ /** Build a .testinstance XML string. */
33
+ function buildTestInstanceXml(guid, testCaseId, testCasePath) {
34
+ return [
35
+ '<?xml version="1.0" encoding="UTF-8" standalone="no"?>',
36
+ `<testPlanInstance guid="${guid}" testCaseId="${testCaseId}" testCasePath="${testCasePath}">`,
37
+ ' <planSettings/>',
38
+ ' <planFeatures/>',
39
+ '</testPlanInstance>',
40
+ ].join('\n');
41
+ }
42
+ /** Build a .planitem XML string. */
43
+ function buildPlanItemXml(guid) {
44
+ return [
45
+ '<?xml version="1.0" encoding="UTF-8" standalone="no"?>',
46
+ `<testPlan guid="${guid}">`,
47
+ ' <planSettings/>',
48
+ ' <planFeatures/>',
49
+ '</testPlan>',
50
+ ].join('\n');
51
+ }
52
+ // ── provar.testplan.add-instance ──────────────────────────────────────────────
53
+ export function registerTestPlanAddInstance(server, config) {
54
+ server.tool('provar.testplan.add-instance', [
55
+ 'Add a .testinstance file to an existing Provar test plan suite directory.',
56
+ 'The plan directory and suite directory must already exist.',
57
+ 'test_case_path is relative to the project root (e.g. "tests/MyTest.testcase").',
58
+ 'suite_path is the path within the plan (e.g. "MySuite" or "MySuite/SubSuite").',
59
+ 'Returns the guid assigned to the new instance and the path where it was written.',
60
+ ].join(' '), {
61
+ project_path: z.string().describe('Absolute path to the Provar project root'),
62
+ test_case_path: z.string().describe('Path to the .testcase file, relative to project root (e.g. "tests/MyTest.testcase")'),
63
+ plan_name: z.string().describe('Name of the test plan (directory under plans/)'),
64
+ suite_path: z.string().optional().describe('Path within the plan to place the instance (e.g. "MySuite" or "MySuite/SubSuite")'),
65
+ overwrite: z.boolean().optional().default(false).describe('Overwrite the .testinstance file if it already exists (default: false)'),
66
+ dry_run: z.boolean().optional().default(false).describe('Return what would be written without writing to disk (default: false)'),
67
+ }, ({ project_path, test_case_path, plan_name, suite_path, overwrite, dry_run }) => {
68
+ const requestId = makeRequestId();
69
+ log('info', 'provar.testplan.add-instance', { requestId, project_path, test_case_path, plan_name });
70
+ try {
71
+ assertPathAllowed(project_path, config.allowedPaths);
72
+ const projectRoot = path.resolve(project_path);
73
+ // Verify .testproject exists
74
+ const testProjectFiles = fs.existsSync(projectRoot)
75
+ ? fs.readdirSync(projectRoot).filter((f) => f.endsWith('.testproject'))
76
+ : [];
77
+ if (testProjectFiles.length === 0) {
78
+ return {
79
+ isError: true,
80
+ content: [{ type: 'text', text: JSON.stringify(makeError('NOT_A_PROJECT', `No .testproject file found in ${projectRoot}`, requestId)) }],
81
+ };
82
+ }
83
+ // Resolve testcase absolute path
84
+ const absoluteTestCasePath = path.join(projectRoot, test_case_path);
85
+ if (!fs.existsSync(absoluteTestCasePath)) {
86
+ return {
87
+ isError: true,
88
+ content: [{ type: 'text', text: JSON.stringify(makeError('FILE_NOT_FOUND', `Test case not found: ${absoluteTestCasePath}`, requestId)) }],
89
+ };
90
+ }
91
+ if (!test_case_path.endsWith('.testcase')) {
92
+ return {
93
+ isError: true,
94
+ content: [{ type: 'text', text: JSON.stringify(makeError('INVALID_PATH', 'test_case_path must end with .testcase', requestId)) }],
95
+ };
96
+ }
97
+ // Read testcase XML and extract testCaseId
98
+ const testCaseXml = fs.readFileSync(absoluteTestCasePath, 'utf-8');
99
+ const testCaseId = extractTestCaseId(testCaseXml);
100
+ if (!testCaseId) {
101
+ return {
102
+ isError: true,
103
+ content: [{ type: 'text', text: JSON.stringify(makeError('NO_TEST_CASE_ID', `Cannot extract registryId, id, or guid from ${absoluteTestCasePath}`, requestId)) }],
104
+ };
105
+ }
106
+ // Determine instance directory
107
+ const instanceDirParts = ['plans', plan_name];
108
+ if (suite_path)
109
+ instanceDirParts.push(...suite_path.split('/').filter(Boolean));
110
+ const instanceDir = path.join(projectRoot, ...instanceDirParts);
111
+ if (!fs.existsSync(instanceDir)) {
112
+ return {
113
+ isError: true,
114
+ content: [{ type: 'text', text: JSON.stringify(makeError('DIR_NOT_FOUND', `Suite directory does not exist: ${instanceDir}. Create it with provar.testplan.create-suite first.`, requestId)) }],
115
+ };
116
+ }
117
+ // Determine filename and full path
118
+ const instanceFileName = path.basename(test_case_path, '.testcase') + '.testinstance';
119
+ const instanceFilePath = path.join(instanceDir, instanceFileName);
120
+ if (!overwrite && fs.existsSync(instanceFilePath)) {
121
+ return {
122
+ isError: true,
123
+ content: [{ type: 'text', text: JSON.stringify(makeError('FILE_EXISTS', `Instance file already exists: ${instanceFilePath}. Set overwrite: true to replace it.`, requestId)) }],
124
+ };
125
+ }
126
+ // Build XML
127
+ const guid = randomUUID();
128
+ const normalizedTestCasePath = toForwardSlashes(test_case_path);
129
+ const xmlContent = buildTestInstanceXml(guid, testCaseId, normalizedTestCasePath);
130
+ if (!dry_run) {
131
+ fs.writeFileSync(instanceFilePath, xmlContent, 'utf-8');
132
+ }
133
+ const response = {
134
+ requestId,
135
+ instance_path: instanceFilePath,
136
+ guid,
137
+ test_case_id: testCaseId,
138
+ test_case_path: normalizedTestCasePath,
139
+ dry_run: dry_run ?? false,
140
+ written: !dry_run,
141
+ };
142
+ return {
143
+ content: [{ type: 'text', text: JSON.stringify(response) }],
144
+ structuredContent: response,
145
+ };
146
+ }
147
+ catch (err) {
148
+ const error = err;
149
+ return {
150
+ isError: true,
151
+ content: [{ type: 'text', text: JSON.stringify(makeError(error instanceof PathPolicyError ? error.code : (error.code ?? 'ADD_INSTANCE_ERROR'), error.message, requestId)) }],
152
+ };
153
+ }
154
+ });
155
+ }
156
+ // ── provar.testplan.create-suite ──────────────────────────────────────────────
157
+ export function registerTestPlanCreateSuite(server, config) {
158
+ server.tool('provar.testplan.create-suite', [
159
+ 'Create a new suite directory inside a Provar test plan.',
160
+ 'The plan directory must already exist with a .planitem file at its root.',
161
+ 'Writes a new .planitem file into the created suite directory.',
162
+ 'Returns the guid assigned to the new suite.',
163
+ ].join(' '), {
164
+ project_path: z.string().describe('Absolute path to the Provar project root'),
165
+ plan_name: z.string().describe('Name of the test plan (directory under plans/)'),
166
+ suite_name: z.string().describe('Name of the new suite directory to create'),
167
+ parent_suite_path: z.string().optional().describe('Path of the parent suite within the plan (e.g. "MySuite"). Omit to create at plan root.'),
168
+ dry_run: z.boolean().optional().default(false).describe('Return what would be created without writing to disk (default: false)'),
169
+ }, ({ project_path, plan_name, suite_name, parent_suite_path, dry_run }) => {
170
+ const requestId = makeRequestId();
171
+ log('info', 'provar.testplan.create-suite', { requestId, project_path, plan_name, suite_name });
172
+ try {
173
+ assertPathAllowed(project_path, config.allowedPaths);
174
+ const projectRoot = path.resolve(project_path);
175
+ // Verify .testproject exists
176
+ const testProjectFiles = fs.existsSync(projectRoot)
177
+ ? fs.readdirSync(projectRoot).filter((f) => f.endsWith('.testproject'))
178
+ : [];
179
+ if (testProjectFiles.length === 0) {
180
+ return {
181
+ isError: true,
182
+ content: [{ type: 'text', text: JSON.stringify(makeError('NOT_A_PROJECT', `No .testproject file found in ${projectRoot}`, requestId)) }],
183
+ };
184
+ }
185
+ // Verify plan directory exists
186
+ const planDir = path.join(projectRoot, 'plans', plan_name);
187
+ if (!fs.existsSync(planDir)) {
188
+ return {
189
+ isError: true,
190
+ content: [{ type: 'text', text: JSON.stringify(makeError('DIR_NOT_FOUND', `Plan directory does not exist: ${planDir}`, requestId)) }],
191
+ };
192
+ }
193
+ // Verify plan .planitem exists
194
+ const planItemPath = path.join(planDir, '.planitem');
195
+ if (!fs.existsSync(planItemPath)) {
196
+ return {
197
+ isError: true,
198
+ content: [{ type: 'text', text: JSON.stringify(makeError('FILE_NOT_FOUND', `Plan .planitem file does not exist: ${planItemPath}`, requestId)) }],
199
+ };
200
+ }
201
+ // Determine suite directory
202
+ const suiteDirParts = [planDir];
203
+ if (parent_suite_path)
204
+ suiteDirParts.push(...parent_suite_path.split('/').filter(Boolean));
205
+ suiteDirParts.push(suite_name);
206
+ const suiteDir = path.join(...suiteDirParts);
207
+ if (fs.existsSync(suiteDir)) {
208
+ return {
209
+ isError: true,
210
+ content: [{ type: 'text', text: JSON.stringify(makeError('DIR_EXISTS', `Suite directory already exists: ${suiteDir}`, requestId)) }],
211
+ };
212
+ }
213
+ const guid = randomUUID();
214
+ const xmlContent = buildPlanItemXml(guid);
215
+ const newPlanItemPath = path.join(suiteDir, '.planitem');
216
+ if (!dry_run) {
217
+ fs.mkdirSync(suiteDir, { recursive: true });
218
+ fs.writeFileSync(newPlanItemPath, xmlContent, 'utf-8');
219
+ }
220
+ const response = {
221
+ requestId,
222
+ suite_dir: suiteDir,
223
+ planitem_path: newPlanItemPath,
224
+ guid,
225
+ dry_run: dry_run ?? false,
226
+ created: !dry_run,
227
+ };
228
+ return {
229
+ content: [{ type: 'text', text: JSON.stringify(response) }],
230
+ structuredContent: response,
231
+ };
232
+ }
233
+ catch (err) {
234
+ const error = err;
235
+ return {
236
+ isError: true,
237
+ content: [{ type: 'text', text: JSON.stringify(makeError(error instanceof PathPolicyError ? error.code : (error.code ?? 'CREATE_SUITE_ERROR'), error.message, requestId)) }],
238
+ };
239
+ }
240
+ });
241
+ }
242
+ // ── provar.testplan.remove-instance ──────────────────────────────────────────
243
+ export function registerTestPlanRemoveInstance(server, config) {
244
+ server.tool('provar.testplan.remove-instance', [
245
+ 'Remove a .testinstance file from a Provar test plan.',
246
+ 'instance_path is relative to the project root.',
247
+ 'Returns the path of the removed file.',
248
+ ].join(' '), {
249
+ project_path: z.string().describe('Absolute path to the Provar project root'),
250
+ instance_path: z.string().describe('Path to the .testinstance file, relative to project root'),
251
+ dry_run: z.boolean().optional().default(false).describe('Return what would be removed without deleting (default: false)'),
252
+ }, ({ project_path, instance_path, dry_run }) => {
253
+ const requestId = makeRequestId();
254
+ log('info', 'provar.testplan.remove-instance', { requestId, project_path, instance_path });
255
+ try {
256
+ assertPathAllowed(project_path, config.allowedPaths);
257
+ const projectRoot = path.resolve(project_path);
258
+ const absolutePath = path.join(projectRoot, instance_path);
259
+ // Assert no traversal outside project root
260
+ const resolvedProjectRoot = path.resolve(projectRoot);
261
+ const resolvedAbsolute = path.resolve(absolutePath);
262
+ if (!resolvedAbsolute.startsWith(resolvedProjectRoot + path.sep) && resolvedAbsolute !== resolvedProjectRoot) {
263
+ return {
264
+ isError: true,
265
+ content: [{ type: 'text', text: JSON.stringify(makeError('PATH_TRAVERSAL', `Path traversal detected: ${instance_path}`, requestId)) }],
266
+ };
267
+ }
268
+ // Must end with .testinstance
269
+ if (!instance_path.endsWith('.testinstance')) {
270
+ return {
271
+ isError: true,
272
+ content: [{ type: 'text', text: JSON.stringify(makeError('INVALID_PATH', 'instance_path must end with .testinstance', requestId)) }],
273
+ };
274
+ }
275
+ // File must exist
276
+ if (!fs.existsSync(absolutePath)) {
277
+ return {
278
+ isError: true,
279
+ content: [{ type: 'text', text: JSON.stringify(makeError('FILE_NOT_FOUND', `Instance file not found: ${absolutePath}`, requestId)) }],
280
+ };
281
+ }
282
+ if (!dry_run) {
283
+ fs.unlinkSync(absolutePath);
284
+ }
285
+ const response = {
286
+ requestId,
287
+ removed_path: absolutePath,
288
+ dry_run: dry_run ?? false,
289
+ removed: !dry_run,
290
+ };
291
+ return {
292
+ content: [{ type: 'text', text: JSON.stringify(response) }],
293
+ structuredContent: response,
294
+ };
295
+ }
296
+ catch (err) {
297
+ const error = err;
298
+ return {
299
+ isError: true,
300
+ content: [{ type: 'text', text: JSON.stringify(makeError(error instanceof PathPolicyError ? error.code : (error.code ?? 'REMOVE_INSTANCE_ERROR'), error.message, requestId)) }],
301
+ };
302
+ }
303
+ });
304
+ }
305
+ // ── Convenience re-export ─────────────────────────────────────────────────────
306
+ export function registerAllTestPlanTools(server, config) {
307
+ registerTestPlanAddInstance(server, config);
308
+ registerTestPlanCreateSuite(server, config);
309
+ registerTestPlanRemoveInstance(server, config);
310
+ }
311
+ //# sourceMappingURL=testPlanTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testPlanTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/testPlanTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTestPlanValidate(server: McpServer): void;
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Copyright (c) 2024 Provar Limited.
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.md file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ /* eslint-disable camelcase */
8
+ import { z } from 'zod';
9
+ import { makeError, makeRequestId } from '../schemas/common.js';
10
+ import { log } from '../logging/logger.js';
11
+ import { validatePlan, buildHierarchySummary } from './hierarchyValidate.js';
12
+ // ── Zod schemas ───────────────────────────────────────────────────────────────
13
+ const testCaseSchema = z.object({
14
+ name: z.string().describe('Test case filename (e.g. CreateAccount.testcase)'),
15
+ xml_content: z.string().optional().describe('Full XML content of the test case file'),
16
+ xml: z.string().optional().describe('Full XML content (API-compatible alias for xml_content)'),
17
+ }).refine((d) => d.xml_content !== undefined || d.xml !== undefined, { message: 'Either xml_content or xml must be provided' });
18
+ const innerSuiteSchema = z.object({
19
+ name: z.string().describe('Suite name'),
20
+ test_cases: z.array(testCaseSchema).optional().describe('Test cases in this suite'),
21
+ test_case_count: z.number().int().min(0).optional().describe('Explicit test case count for size check'),
22
+ });
23
+ const suiteSchema = z.object({
24
+ name: z.string().describe('Test suite name'),
25
+ test_cases: z.array(testCaseSchema).optional().describe('Test cases directly in this suite'),
26
+ test_suites: z.array(innerSuiteSchema).optional().describe('Child suites (one level deep)'),
27
+ test_case_count: z.number().int().min(0).optional().describe('Explicit test case count for size check'),
28
+ });
29
+ const metadataSchema = z.object({
30
+ objectives: z.string().optional().describe('Testing objectives for this plan (configured in Provar Quality Hub)'),
31
+ in_scope: z.string().optional().describe('Features and areas in scope (configured in Provar Quality Hub)'),
32
+ testing_methodology: z.string().optional().describe('Testing approach, e.g. risk-based, regression, exploratory (configured in Provar Quality Hub)'),
33
+ acceptance_criteria: z.string().optional().describe('Criteria to determine when testing is complete (configured in Provar Quality Hub)'),
34
+ acceptable_pass_rate: z.number().min(0).max(100).optional().describe('Minimum pass rate 0-100 for the plan to be considered successful (configured in Provar Quality Hub)'),
35
+ environments: z.array(z.string()).optional().describe('Target environments, e.g. ["QA", "Staging", "UAT"] (configured in Provar Quality Hub)'),
36
+ test_data_strategy: z.string().optional().describe('How test data will be prepared and cleaned up (configured in Provar Quality Hub)'),
37
+ risks: z.string().optional().describe('Identified risks and mitigations (configured in Provar Quality Hub)'),
38
+ }).optional().describe('Plan completeness metadata — these fields are configured in the Provar Quality Hub app, not in local project files');
39
+ export function registerTestPlanValidate(server) {
40
+ server.tool('provar.testplan.validate', 'Validate a Provar test plan: checks for empty plans, duplicate suite names, oversized plans (>20 suites), plan completeness (objectives, scope, methodology, environments, acceptance criteria, test data strategy, risk assessment), and naming consistency. Recursively validates child suites and test cases. Returns quality score, plan-level violations, and full hierarchy results.', {
41
+ plan_name: z.string().describe('Name of the test plan'),
42
+ test_suites: z.array(suiteSchema).optional().describe('Test suites belonging to this plan'),
43
+ test_cases: z.array(testCaseSchema).optional().describe('Test cases directly in this plan (not in a suite)'),
44
+ test_suite_count: z.number().int().min(0).optional().describe('Explicit suite count for size check (overrides counting test_suites)'),
45
+ metadata: metadataSchema,
46
+ quality_threshold: z.number().min(0).max(100).optional().describe('Minimum quality score for a test case to be considered valid (default: 80)'),
47
+ }, ({ plan_name, test_suites, test_cases, test_suite_count, metadata, quality_threshold }) => {
48
+ const requestId = makeRequestId();
49
+ log('info', 'provar.testplan.validate', { requestId, plan_name });
50
+ try {
51
+ const threshold = quality_threshold ?? 80;
52
+ const input = {
53
+ name: plan_name,
54
+ test_suites: test_suites ?? [],
55
+ test_cases: test_cases ?? [],
56
+ test_suite_count,
57
+ metadata: metadata ?? {},
58
+ };
59
+ const result = validatePlan(input, threshold);
60
+ const summary = buildHierarchySummary(result);
61
+ const response = { requestId, ...result, summary };
62
+ return {
63
+ content: [{ type: 'text', text: JSON.stringify(response) }],
64
+ structuredContent: response,
65
+ };
66
+ }
67
+ catch (err) {
68
+ const error = err;
69
+ const errResult = makeError('VALIDATE_ERROR', error.message, requestId, false);
70
+ log('error', 'provar.testplan.validate failed', { requestId, error: error.message });
71
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
72
+ }
73
+ });
74
+ }
75
+ //# sourceMappingURL=testPlanValidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testPlanValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testPlanValidate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerTestSuiteValidate(server: McpServer): void;
@@ -0,0 +1,63 @@
1
+ /*
2
+ * Copyright (c) 2024 Provar Limited.
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.md file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ /* eslint-disable camelcase */
8
+ import { z } from 'zod';
9
+ import { makeError, makeRequestId } from '../schemas/common.js';
10
+ import { log } from '../logging/logger.js';
11
+ import { validateSuite, buildHierarchySummary } from './hierarchyValidate.js';
12
+ // ── Zod schemas ───────────────────────────────────────────────────────────────
13
+ const testCaseSchema = z.object({
14
+ name: z.string().describe('Test case filename (e.g. CreateAccount.testcase)'),
15
+ xml_content: z.string().optional().describe('Full XML content of the test case file'),
16
+ xml: z.string().optional().describe('Full XML content (API-compatible alias for xml_content)'),
17
+ }).refine((d) => d.xml_content !== undefined || d.xml !== undefined, { message: 'Either xml_content or xml must be provided' });
18
+ const innerSuiteSchema = z.object({
19
+ name: z.string().describe('Child suite name'),
20
+ test_cases: z.array(testCaseSchema).optional().describe('Test cases in this child suite'),
21
+ test_case_count: z.number().int().min(0).optional().describe('Explicit test case count (overrides counting test_cases)'),
22
+ });
23
+ const childSuiteSchema = z.object({
24
+ name: z.string().describe('Child suite name'),
25
+ test_cases: z.array(testCaseSchema).optional().describe('Test cases in this suite'),
26
+ test_suites: z.array(innerSuiteSchema).optional().describe('Nested child suites (one level deep)'),
27
+ test_case_count: z.number().int().min(0).optional().describe('Explicit test case count for size check'),
28
+ });
29
+ export function registerTestSuiteValidate(server) {
30
+ server.tool('provar.testsuite.validate', 'Validate a Provar test suite: checks for empty suites, duplicate names, oversized suites (>75 tests), and naming convention consistency. Recursively validates child suites and individual test case XML. Returns quality score, suite-level violations, and per-test-case results.', {
31
+ suite_name: z.string().describe('Name of the test suite'),
32
+ test_cases: z.array(testCaseSchema).optional().describe('Test cases directly in this suite'),
33
+ child_suites: z.array(childSuiteSchema).optional().describe('Child test suites (supports up to 2 levels of nesting)'),
34
+ test_case_count: z.number().int().min(0).optional().describe('Explicit total test case count for size check (overrides counting test_cases)'),
35
+ quality_threshold: z.number().min(0).max(100).optional().describe('Minimum quality score for a test case to be considered valid (default: 80)'),
36
+ }, ({ suite_name, test_cases, child_suites, test_case_count, quality_threshold }) => {
37
+ const requestId = makeRequestId();
38
+ log('info', 'provar.testsuite.validate', { requestId, suite_name });
39
+ try {
40
+ const threshold = quality_threshold ?? 80;
41
+ const input = {
42
+ name: suite_name,
43
+ test_cases: test_cases ?? [],
44
+ test_suites: (child_suites ?? []),
45
+ test_case_count,
46
+ };
47
+ const result = validateSuite(input, threshold);
48
+ const summary = buildHierarchySummary(result);
49
+ const response = { requestId, ...result, summary };
50
+ return {
51
+ content: [{ type: 'text', text: JSON.stringify(response) }],
52
+ structuredContent: response,
53
+ };
54
+ }
55
+ catch (err) {
56
+ const error = err;
57
+ const errResult = makeError('VALIDATE_ERROR', error.message, requestId, false);
58
+ log('error', 'provar.testsuite.validate failed', { requestId, error: error.message });
59
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
60
+ }
61
+ });
62
+ }
63
+ //# sourceMappingURL=testSuiteValidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testSuiteValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testSuiteValidate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ import { type TestCaseInput, type TestSuiteInput, type TestPlanInput, type ProjectContext, type ProjectResult, type TestCaseResult, type HierarchyViolation, type HierarchySummary } from '../mcp/tools/hierarchyValidate.js';
2
+ export declare class ProjectValidationError extends Error {
3
+ readonly code: string;
4
+ constructor(code: string, message: string);
5
+ }
6
+ export interface ProjectValidationOptions {
7
+ project_path: string;
8
+ quality_threshold?: number;
9
+ save_results?: boolean;
10
+ results_dir?: string;
11
+ }
12
+ export interface ValidatedTestCase {
13
+ name: string;
14
+ quality_score: number;
15
+ quality_tier: string;
16
+ status: string;
17
+ is_valid: boolean;
18
+ step_count: number;
19
+ error_count: number;
20
+ warning_count: number;
21
+ issues: TestCaseResult['issues'];
22
+ }
23
+ export interface ValidatedChildSuite {
24
+ name: string;
25
+ quality_score: number;
26
+ violations: HierarchyViolation[];
27
+ test_case_count: number;
28
+ }
29
+ export interface ValidatedSuite {
30
+ name: string;
31
+ quality_score: number;
32
+ violations: HierarchyViolation[];
33
+ test_cases: ValidatedTestCase[];
34
+ child_suites: ValidatedChildSuite[];
35
+ }
36
+ export interface ValidatedPlan {
37
+ name: string;
38
+ quality_score: number;
39
+ violations: HierarchyViolation[];
40
+ suites: ValidatedSuite[];
41
+ unplanned_test_cases: Array<{
42
+ name: string;
43
+ quality_score: number;
44
+ status: string;
45
+ error_count: number;
46
+ issues: TestCaseResult['issues'];
47
+ }>;
48
+ }
49
+ export interface ProjectValidationResult {
50
+ project_path: string;
51
+ project_name: string;
52
+ quality_score: number;
53
+ quality_tier: string;
54
+ quality_grade: string;
55
+ summary: HierarchySummary;
56
+ project_violations: HierarchyViolation[];
57
+ plans: ValidatedPlan[];
58
+ coverage: {
59
+ total_test_cases_on_disk: number;
60
+ covered_by_plans: number;
61
+ uncovered_count: number;
62
+ uncovered_test_cases: string[];
63
+ };
64
+ saved_to: string | null;
65
+ /** Set when save_results was requested but the write failed (disk full, permissions, etc.). */
66
+ save_error?: string;
67
+ }
68
+ export declare function toQualityTier(score: number): string;
69
+ export declare function toQualityGrade(score: number): string;
70
+ export declare function toTitleCase(s: string): string;
71
+ /**
72
+ * Given a path that may be a Provar workspace root (containing one or more project
73
+ * sub-directories) or the project root itself (contains .testproject), return the
74
+ * resolved project root.
75
+ *
76
+ * Detection order:
77
+ * 1. `.testproject` file present at given path → it is the project root
78
+ * 2. Exactly one sub-directory contains a `.testproject` → use that
79
+ * 3. Multiple sub-directories contain `.testproject` → return all candidates so the
80
+ * caller can surface a clear error rather than guessing
81
+ */
82
+ export declare function resolveProjectRoot(givenPath: string): {
83
+ root: string;
84
+ candidates: string[];
85
+ };
86
+ export declare function readProjectContext(projectPath: string): {
87
+ projectName: string;
88
+ context: ProjectContext;
89
+ };
90
+ export declare function resolveTestInstance(instancePath: string, projectPath: string): TestCaseInput | null;
91
+ export declare function readSuiteDirectory(dirPath: string, name: string, projectPath: string, depth?: number, coveredPaths?: Set<string>, idMap?: Map<string, string>): TestSuiteInput;
92
+ export declare function readPlanDirectory(planPath: string, name: string, projectPath: string, coveredPaths?: Set<string>, idMap?: Map<string, string>): TestPlanInput;
93
+ export declare function readPlansDir(projectPath: string): {
94
+ plans: TestPlanInput[];
95
+ coveredPaths: Set<string>;
96
+ };
97
+ /**
98
+ * Collects all .testcase file basenames (without extension) found under tests/.
99
+ * Includes callable tests (visibility="Internal") that have no plan instances,
100
+ * so that checkCaseCalls can distinguish genuine missing-callee errors from
101
+ * valid callable references.
102
+ */
103
+ export declare function collectAllTestCaseNames(projectPath: string): string[];
104
+ /**
105
+ * @deprecated Covered paths are now computed as a byproduct of readPlansDir().
106
+ * Use the coveredPaths returned by readPlansDir() instead.
107
+ */
108
+ export declare function collectCoveredPathsFromDisk(projectPath: string): Set<string>;
109
+ export declare function findUncoveredTestCases(projectPath: string, coveredPaths: Set<string>): string[];
110
+ export declare function buildQhReport(result: ProjectResult, projectName: string): Record<string, unknown>;
111
+ export declare function saveResults(projectPath: string, resultsDir: string | undefined, report: Record<string, unknown>, projectName: string): string;
112
+ /**
113
+ * Validate a Provar project from a path on disk.
114
+ *
115
+ * Throws ProjectValidationError for user-facing problems (path not found,
116
+ * ambiguous project, not a Provar project directory). Lets unexpected I/O
117
+ * errors propagate as-is.
118
+ */
119
+ export declare function validateProjectFromPath(options: ProjectValidationOptions): ProjectValidationResult;