@provartesting/provardx-cli 1.4.7 → 1.5.0-beta.1

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 +263 -9
  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 +153 -0
  32. package/lib/mcp/licensing/algasClient.js.map +1 -0
  33. package/lib/mcp/licensing/ideDetection.d.ts +22 -0
  34. package/lib/mcp/licensing/ideDetection.js +107 -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 +85 -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 +110 -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 +19 -0
  57. package/lib/mcp/security/pathPolicy.js +66 -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 +62 -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 +614 -0
  64. package/lib/mcp/tools/antTools.js.map +1 -0
  65. package/lib/mcp/tools/automationTools.d.ts +15 -0
  66. package/lib/mcp/tools/automationTools.js +379 -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 +211 -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 +189 -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 +56 -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 +232 -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 +1370 -1
  122. package/package.json +48 -26
@@ -0,0 +1,620 @@
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 os from 'node:os';
10
+ import path from 'node:path';
11
+ import { z } from 'zod';
12
+ import { XMLParser } from 'fast-xml-parser';
13
+ import { makeError, makeRequestId } from '../schemas/common.js';
14
+ import { log } from '../logging/logger.js';
15
+ const RCA_RULES = [
16
+ {
17
+ category: 'DRIVER_VERSION_MISMATCH',
18
+ pattern: /SessionNotCreatedException.*Chrome version|Chrome version must be between/i,
19
+ summary: 'WebDriver version incompatible with Chrome',
20
+ recommendation: 'Update ChromeDriver to match installed Chrome, or pin Chrome version in CI',
21
+ },
22
+ {
23
+ category: 'LOCATOR_STALE',
24
+ pattern: /NoSuchElementException|ElementNotVisibleException|StaleElementReferenceException/i,
25
+ summary: 'Page object selector no longer matches current UI',
26
+ recommendation: 'Re-capture the failing element in Provar IDE',
27
+ },
28
+ {
29
+ category: 'TIMEOUT',
30
+ pattern: /TimeoutException|ElementClickInterceptedException|timed out/i,
31
+ summary: 'Element or operation did not complete in time',
32
+ recommendation: 'Increase step timeout or add explicit wait; check org performance',
33
+ },
34
+ {
35
+ category: 'ASSERTION_FAILED',
36
+ pattern: /AssertionException|UiAssert|AssertionError/i,
37
+ summary: 'Test assertion failed',
38
+ recommendation: 'Verify expected value is correct for current org state',
39
+ },
40
+ {
41
+ category: 'CREDENTIAL_FAILURE',
42
+ pattern: /InvalidPasswordException|AuthenticationException|INVALID_LOGIN/i,
43
+ summary: 'Salesforce login failed',
44
+ recommendation: 'Refresh credentials in .secrets or .testproject',
45
+ },
46
+ {
47
+ category: 'MISSING_CALLABLE',
48
+ pattern: /caseCall.*cannot.*resolv|callable.*not.*found/i,
49
+ summary: 'caseCall references unresolvable callable',
50
+ recommendation: 'Use provar.project.validate to diagnose PROJ-CALLABLE violations',
51
+ },
52
+ {
53
+ category: 'METADATA_CACHE',
54
+ pattern: /Loading index of metadata|CachingException|metadata.*fail/i,
55
+ summary: 'Metadata loading or caching failed',
56
+ recommendation: 'Set metadataLevel to Refresh and re-run',
57
+ },
58
+ {
59
+ category: 'PAGE_OBJECT_COMPILE',
60
+ pattern: /ClassNotFoundException|CompilationException/i,
61
+ summary: 'Page object class not compiled',
62
+ recommendation: 'Run provar.automation.compile before testrun',
63
+ },
64
+ {
65
+ category: 'CONNECTION_REFUSED',
66
+ pattern: /WebDriverException|SessionNotCreatedException|browser.*launch.*fail/i,
67
+ summary: 'Browser or WebDriver session failed',
68
+ recommendation: 'Check WebDriver version compatibility',
69
+ },
70
+ {
71
+ category: 'DATA_SETUP',
72
+ pattern: /SetValues.*fail|ApexCreateObject.*fail/i,
73
+ summary: 'Data setup precondition failed',
74
+ recommendation: 'Run data setup callable first',
75
+ },
76
+ {
77
+ category: 'LICENSE_INVALID',
78
+ pattern: /LicenseException|license.*expired|license.*invalid/i,
79
+ summary: 'Provar license invalid or expired',
80
+ recommendation: 'Check license status, contact Provar support',
81
+ },
82
+ ];
83
+ const UNKNOWN_RULE = {
84
+ category: 'UNKNOWN',
85
+ pattern: /.*/,
86
+ summary: 'Cause undetermined',
87
+ recommendation: 'Review full failure message and screenshot',
88
+ };
89
+ function classifyFailure(text) {
90
+ for (const rule of RCA_RULES) {
91
+ if (rule.pattern.test(text))
92
+ return rule;
93
+ }
94
+ return UNKNOWN_RULE;
95
+ }
96
+ const INFRA_CATEGORIES = new Set([
97
+ 'CREDENTIAL_FAILURE',
98
+ 'METADATA_CACHE',
99
+ 'PAGE_OBJECT_COMPILE',
100
+ 'CONNECTION_REFUSED',
101
+ 'DRIVER_VERSION_MISMATCH',
102
+ 'LICENSE_INVALID',
103
+ ]);
104
+ // ── Filesystem helpers ────────────────────────────────────────────────────────
105
+ /**
106
+ * Walk a directory recursively and collect files matching a predicate.
107
+ */
108
+ function walkFiles(dir, predicate) {
109
+ const results = [];
110
+ if (!fs.existsSync(dir))
111
+ return results;
112
+ try {
113
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
114
+ for (const entry of entries) {
115
+ const full = path.join(dir, entry.name);
116
+ if (entry.isDirectory()) {
117
+ results.push(...walkFiles(full, predicate));
118
+ }
119
+ else if (entry.isFile() && predicate(full)) {
120
+ results.push(full);
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // ignore permission errors
126
+ }
127
+ return results;
128
+ }
129
+ /**
130
+ * List immediate numeric child directories of a directory.
131
+ */
132
+ function numericChildDirs(dir) {
133
+ if (!fs.existsSync(dir))
134
+ return [];
135
+ try {
136
+ return fs
137
+ .readdirSync(dir, { withFileTypes: true })
138
+ .filter((e) => e.isDirectory() && /^\d+$/.test(e.name))
139
+ .map((e) => parseInt(e.name, 10))
140
+ .filter((n) => n > 0);
141
+ }
142
+ catch {
143
+ return [];
144
+ }
145
+ }
146
+ /**
147
+ * Expand ${env.VAR} placeholders in a string using process.env.
148
+ */
149
+ function expandEnvVars(value) {
150
+ return value.replace(/\$\{env\.([^}]+)\}/g, (_, varName) => process.env[varName] ?? '');
151
+ }
152
+ function readResultsFromSfConfig() {
153
+ try {
154
+ const sfConfigPath = path.join(os.homedir(), '.sf', 'config.json');
155
+ if (!fs.existsSync(sfConfigPath))
156
+ return null;
157
+ const sfConfig = JSON.parse(fs.readFileSync(sfConfigPath, 'utf-8'));
158
+ const propFilePath = sfConfig['PROVARDX_PROPERTIES_FILE_PATH'];
159
+ if (!propFilePath || !fs.existsSync(propFilePath))
160
+ return null;
161
+ const props = JSON.parse(fs.readFileSync(propFilePath, 'utf-8'));
162
+ const rp = props['resultsPath'];
163
+ if (!rp)
164
+ return null;
165
+ return { resultsBase: rp, disposition: props['resultsPathDisposition'] ?? 'Replace' };
166
+ }
167
+ catch {
168
+ return null;
169
+ }
170
+ }
171
+ function readResultsFromPropertiesFile(projectPath) {
172
+ try {
173
+ const entries = fs.readdirSync(projectPath, { withFileTypes: true });
174
+ for (const entry of entries) {
175
+ if (!entry.isFile() || !/provardx-properties.*\.json/i.test(entry.name))
176
+ continue;
177
+ try {
178
+ const props = JSON.parse(fs.readFileSync(path.join(projectPath, entry.name), 'utf-8'));
179
+ const rp = props['resultsPath'];
180
+ if (rp)
181
+ return { resultsBase: rp, disposition: props['resultsPathDisposition'] ?? 'Replace' };
182
+ }
183
+ catch {
184
+ // ignore individual file parse errors
185
+ }
186
+ }
187
+ }
188
+ catch {
189
+ // ignore readdir errors
190
+ }
191
+ return null;
192
+ }
193
+ function readResultsFromAntBuildXml(projectPath) {
194
+ try {
195
+ const buildXmlPath = path.join(projectPath, 'ANT', 'build.xml');
196
+ if (!fs.existsSync(buildXmlPath))
197
+ return null;
198
+ const xmlContent = fs.readFileSync(buildXmlPath, 'utf-8');
199
+ const match = /<property\s+name="testproject\.results"\s+value="([^"]+)"/i.exec(xmlContent);
200
+ return match ? expandEnvVars(match[1]) : null;
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ }
206
+ function resolveResultsLocation(project_path, results_path, run_index) {
207
+ let resultsBase = null;
208
+ let disposition = 'Replace';
209
+ let resolution_source = 'explicit';
210
+ if (results_path) {
211
+ resultsBase = results_path;
212
+ }
213
+ else {
214
+ const fromSf = readResultsFromSfConfig();
215
+ if (fromSf) {
216
+ resultsBase = fromSf.resultsBase;
217
+ disposition = fromSf.disposition;
218
+ resolution_source = 'sf_config';
219
+ }
220
+ else {
221
+ const fromFile = readResultsFromPropertiesFile(project_path);
222
+ if (fromFile) {
223
+ resultsBase = fromFile.resultsBase;
224
+ disposition = fromFile.disposition;
225
+ resolution_source = 'properties_file';
226
+ }
227
+ else {
228
+ const fromAnt = readResultsFromAntBuildXml(project_path);
229
+ if (fromAnt) {
230
+ resultsBase = fromAnt;
231
+ resolution_source = 'ant_build_xml';
232
+ }
233
+ }
234
+ }
235
+ }
236
+ if (!resultsBase) {
237
+ return {
238
+ error: 'RESULTS_NOT_CONFIGURED',
239
+ message: 'Could not determine results directory from sf config, properties file, or ANT build.xml',
240
+ };
241
+ }
242
+ // Increment resolution
243
+ const numericDirs = numericChildDirs(resultsBase);
244
+ if (disposition === 'Increment' || numericDirs.length > 0) {
245
+ if (numericDirs.length > 0) {
246
+ const targetIndex = run_index ?? Math.max(...numericDirs);
247
+ return {
248
+ results_dir: path.join(resultsBase, String(targetIndex)),
249
+ run_index: targetIndex,
250
+ disposition,
251
+ resolution_source,
252
+ };
253
+ }
254
+ // Disposition is Increment but no numeric subdirs yet — fall through to base
255
+ }
256
+ return {
257
+ results_dir: resultsBase,
258
+ run_index: null,
259
+ disposition,
260
+ resolution_source,
261
+ };
262
+ }
263
+ // ── provar.testrun.report.locate tool ─────────────────────────────────────────
264
+ export function registerTestRunLocate(server) {
265
+ server.tool('provar.testrun.report.locate', [
266
+ 'Resolve exactly where Provar test run artifacts were written, without parsing them.',
267
+ 'Returns the results directory, paths to JUnit.xml and Index.html if they exist,',
268
+ 'paths to per-test HTML reports, and any validation JSON files.',
269
+ 'Supports explicit results_path override or auto-detection from sf config, provardx properties file, or ANT build.xml.',
270
+ ].join(' '), {
271
+ project_path: z
272
+ .string()
273
+ .describe('Absolute path to the Provar project root'),
274
+ results_path: z
275
+ .string()
276
+ .optional()
277
+ .describe('Explicit override for the results base directory; if provided, skip auto-detection'),
278
+ run_index: z
279
+ .number()
280
+ .optional()
281
+ .describe('Which Increment run to target (default: latest)'),
282
+ }, (input) => {
283
+ const requestId = makeRequestId();
284
+ log('info', 'provar.testrun.report.locate', { requestId });
285
+ try {
286
+ const resolved = resolveResultsLocation(input.project_path, input.results_path, input.run_index);
287
+ if ('error' in resolved) {
288
+ const err = makeError(resolved.error, resolved.message, requestId);
289
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
290
+ }
291
+ const { results_dir, run_index: resolvedRunIndex, disposition, resolution_source } = resolved;
292
+ // Check for JUnit.xml and Index.html
293
+ const junitPath = path.join(results_dir, 'JUnit.xml');
294
+ const indexPath = path.join(results_dir, 'Index.html');
295
+ const junit_xml = fs.existsSync(junitPath) ? junitPath : null;
296
+ const index_html = fs.existsSync(indexPath) ? indexPath : null;
297
+ // Collect per-test HTML reports (*.testcase.html)
298
+ const htmlFiles = walkFiles(results_dir, (f) => f.endsWith('.testcase.html'));
299
+ const per_test_reports = htmlFiles.map((htmlPath) => ({
300
+ test_name: path.basename(htmlPath, '.html'),
301
+ html_path: htmlPath,
302
+ }));
303
+ // Collect validation reports
304
+ const validationDir = path.join(input.project_path, 'provardx', 'validation');
305
+ const validation_reports = [];
306
+ if (fs.existsSync(validationDir)) {
307
+ try {
308
+ const entries = fs.readdirSync(validationDir);
309
+ for (const entry of entries) {
310
+ if (entry.endsWith('.json')) {
311
+ validation_reports.push(path.join(validationDir, entry));
312
+ }
313
+ }
314
+ }
315
+ catch {
316
+ // ignore
317
+ }
318
+ }
319
+ const result = {
320
+ requestId,
321
+ results_dir,
322
+ junit_xml,
323
+ index_html,
324
+ per_test_reports,
325
+ validation_reports,
326
+ run_index: resolvedRunIndex,
327
+ disposition,
328
+ resolution_source,
329
+ };
330
+ return {
331
+ content: [{ type: 'text', text: JSON.stringify(result) }],
332
+ };
333
+ }
334
+ catch (err) {
335
+ const error = err;
336
+ const errResult = makeError('LOCATE_ERROR', error.message, requestId);
337
+ log('error', 'provar.testrun.report.locate failed', { requestId, error: error.message });
338
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
339
+ }
340
+ });
341
+ }
342
+ function parseJUnit(xmlContent) {
343
+ const parser = new XMLParser({
344
+ ignoreAttributes: false,
345
+ attributeNamePrefix: '',
346
+ allowBooleanAttributes: true,
347
+ parseAttributeValue: true,
348
+ textNodeName: '#text',
349
+ isArray: (tagName) => ['testsuite', 'testcase', 'failure', 'error'].includes(tagName),
350
+ });
351
+ const doc = parser.parse(xmlContent);
352
+ // Normalise to array of testsuites
353
+ let suites = [];
354
+ if (doc['testsuites']) {
355
+ const ts = doc['testsuites']['testsuite'];
356
+ suites = Array.isArray(ts) ? ts : ts ? [ts] : [];
357
+ }
358
+ else if (doc['testsuite']) {
359
+ const ts = doc['testsuite'];
360
+ suites = Array.isArray(ts) ? ts : [ts];
361
+ }
362
+ let total = 0;
363
+ let failures = 0;
364
+ let errors = 0;
365
+ let skipped = 0;
366
+ let duration_seconds = 0;
367
+ const testcases = [];
368
+ for (const suite of suites) {
369
+ // Prefer attribute-level counts for the suite, fall back to counting testcases
370
+ const suiteTests = Number(suite['tests'] ?? 0);
371
+ const suiteFailures = Number(suite['failures'] ?? 0);
372
+ const suiteErrors = Number(suite['errors'] ?? 0);
373
+ const suiteSkipped = Number(suite['skipped'] ?? 0);
374
+ const suiteTime = Number(suite['time'] ?? 0);
375
+ total += suiteTests;
376
+ failures += suiteFailures;
377
+ errors += suiteErrors;
378
+ skipped += suiteSkipped;
379
+ duration_seconds += suiteTime;
380
+ const rawTestcases = suite['testcase'];
381
+ const tcArray = Array.isArray(rawTestcases)
382
+ ? rawTestcases
383
+ : rawTestcases
384
+ ? [rawTestcases]
385
+ : [];
386
+ for (const tc of tcArray) {
387
+ const name = String(tc['name'] ?? '');
388
+ const isSkipped = tc['skipped'] !== undefined;
389
+ // Extract failure/error text
390
+ let failureText = null;
391
+ const failureArr = tc['failure'];
392
+ const errorArr = tc['error'];
393
+ const extractText = (arr) => {
394
+ if (!arr)
395
+ return null;
396
+ const items = Array.isArray(arr) ? arr : [arr];
397
+ for (const item of items) {
398
+ if (typeof item === 'string' && item.trim())
399
+ return item.trim();
400
+ if (typeof item === 'object' && item !== null) {
401
+ const obj = item;
402
+ const text = obj['#text'] ?? obj['message'] ?? obj[''];
403
+ if (typeof text === 'string' && text.trim())
404
+ return text.trim();
405
+ }
406
+ }
407
+ return null;
408
+ };
409
+ failureText = extractText(failureArr) ?? extractText(errorArr);
410
+ testcases.push({ name, failureText, isSkipped });
411
+ }
412
+ }
413
+ // If total wasn't set from suite attributes, compute from testcases
414
+ if (total === 0 && testcases.length > 0) {
415
+ total = testcases.length;
416
+ }
417
+ const passed = total - failures - errors - skipped;
418
+ return { total, passed: Math.max(0, passed), failures, errors, skipped, duration_seconds, testcases };
419
+ }
420
+ // ── RCA handler helpers ───────────────────────────────────────────────────────
421
+ function collectValidationReports(projectPath) {
422
+ const validationDir = path.join(projectPath, 'provardx', 'validation');
423
+ if (!fs.existsSync(validationDir))
424
+ return [];
425
+ try {
426
+ return fs.readdirSync(validationDir)
427
+ .filter((e) => e.endsWith('.json'))
428
+ .map((e) => path.join(validationDir, e));
429
+ }
430
+ catch {
431
+ return [];
432
+ }
433
+ }
434
+ function buildPriorFailureSet(resultsDir, resolvedRunIndex) {
435
+ const names = new Set();
436
+ if (resolvedRunIndex === null)
437
+ return names;
438
+ const resultsBase = path.dirname(resultsDir);
439
+ const priorDirs = numericChildDirs(resultsBase).filter((n) => n < resolvedRunIndex);
440
+ for (const priorIdx of priorDirs) {
441
+ const priorJunit = path.join(resultsBase, String(priorIdx), 'JUnit.xml');
442
+ if (!fs.existsSync(priorJunit))
443
+ continue;
444
+ try {
445
+ const priorParsed = parseJUnit(fs.readFileSync(priorJunit, 'utf-8'));
446
+ for (const tc of priorParsed.testcases) {
447
+ if (tc.failureText !== null)
448
+ names.add(tc.name);
449
+ }
450
+ }
451
+ catch {
452
+ // ignore
453
+ }
454
+ }
455
+ return names;
456
+ }
457
+ function buildFailureReports(testcases, htmlFiles, screenshotDir, priorFailed) {
458
+ const errorClassPatterns = [
459
+ 'NoSuchElementException', 'TimeoutException', 'AssertionException',
460
+ 'SessionNotCreatedException', 'WebDriverException', 'ClassNotFoundException',
461
+ 'LicenseException', 'InvalidPasswordException',
462
+ ];
463
+ const reports = [];
464
+ for (const tc of testcases) {
465
+ if (tc.failureText === null || tc.isSkipped)
466
+ continue;
467
+ const failureText = tc.failureText;
468
+ const rule = classifyFailure(failureText);
469
+ let error_class = null;
470
+ for (const cls of errorClassPatterns) {
471
+ if (failureText.includes(cls)) {
472
+ error_class = cls;
473
+ break;
474
+ }
475
+ }
476
+ const poMatch = /Page Object:\s*([\w.]+)/i.exec(failureText);
477
+ const opMatch = /operation:\s*(\w+)/i.exec(failureText);
478
+ const matchingHtml = htmlFiles.find((f) => path.basename(f) === `${tc.name}.html`);
479
+ reports.push({
480
+ test_case: tc.name,
481
+ error_class,
482
+ error_message: failureText.slice(0, 500),
483
+ root_cause_category: rule.category,
484
+ root_cause_summary: rule.summary,
485
+ recommendation: rule.recommendation,
486
+ page_object: poMatch ? poMatch[1] : null,
487
+ operation: opMatch ? opMatch[1] : null,
488
+ report_html: matchingHtml ?? null,
489
+ screenshot_dir: screenshotDir,
490
+ pre_existing: priorFailed.has(tc.name),
491
+ });
492
+ }
493
+ return reports;
494
+ }
495
+ // ── provar.testrun.rca tool ───────────────────────────────────────────────────
496
+ export function registerTestRunRca(server) {
497
+ server.tool('provar.testrun.rca', [
498
+ 'Parse a completed Provar test run and produce a structured Root Cause Analysis (RCA) report.',
499
+ 'Resolves the results directory, parses JUnit.xml, classifies each failure by category,',
500
+ 'and produces recommendations. Use locate_only=true to skip parsing and just resolve artifact locations.',
501
+ ].join(' '), {
502
+ project_path: z
503
+ .string()
504
+ .describe('Absolute path to the Provar project root'),
505
+ results_path: z
506
+ .string()
507
+ .optional()
508
+ .describe('Explicit override for the results base directory'),
509
+ run_index: z
510
+ .number()
511
+ .optional()
512
+ .describe('Which Increment run to target (default: latest)'),
513
+ locate_only: z
514
+ .boolean()
515
+ .optional()
516
+ .default(false)
517
+ .describe('If true, skip parsing and return just artifact locations'),
518
+ }, (input) => {
519
+ const requestId = makeRequestId();
520
+ log('info', 'provar.testrun.rca', { requestId, locate_only: input.locate_only });
521
+ try {
522
+ // ── Resolve location ─────────────────────────────────────────────────
523
+ const resolved = resolveResultsLocation(input.project_path, input.results_path, input.run_index);
524
+ if ('error' in resolved) {
525
+ const err = makeError(resolved.error, resolved.message, requestId);
526
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
527
+ }
528
+ const { results_dir, run_index: resolvedRunIndex, disposition, resolution_source } = resolved;
529
+ const junitPath = path.join(results_dir, 'JUnit.xml');
530
+ const indexPath = path.join(results_dir, 'Index.html');
531
+ const junit_xml = fs.existsSync(junitPath) ? junitPath : null;
532
+ const index_html = fs.existsSync(indexPath) ? indexPath : null;
533
+ const htmlFiles = walkFiles(results_dir, (f) => f.endsWith('.testcase.html'));
534
+ const per_test_reports = htmlFiles.map((htmlPath) => ({
535
+ test_name: path.basename(htmlPath, '.html'),
536
+ html_path: htmlPath,
537
+ }));
538
+ const validation_reports = collectValidationReports(input.project_path);
539
+ const locateResult = {
540
+ requestId,
541
+ results_dir,
542
+ junit_xml,
543
+ index_html,
544
+ per_test_reports,
545
+ validation_reports,
546
+ run_index: resolvedRunIndex,
547
+ disposition,
548
+ resolution_source,
549
+ };
550
+ // ── locate_only shortcut ─────────────────────────────────────────────
551
+ if (input.locate_only) {
552
+ const result = { ...locateResult, rca_skipped: true, failures: [], infrastructure_issues: [], recommendations: [] };
553
+ return {
554
+ content: [{ type: 'text', text: JSON.stringify(result) }],
555
+ };
556
+ }
557
+ // ── Check JUnit.xml exists ───────────────────────────────────────────
558
+ if (!junit_xml) {
559
+ const result = {
560
+ requestId,
561
+ results_dir,
562
+ run_in_progress: true,
563
+ message: 'JUnit.xml not found — test run may still be in progress or has not started',
564
+ failures: [],
565
+ infrastructure_issues: [],
566
+ recommendations: [],
567
+ };
568
+ return {
569
+ content: [{ type: 'text', text: JSON.stringify(result) }],
570
+ };
571
+ }
572
+ // ── Parse JUnit.xml ──────────────────────────────────────────────────
573
+ const xmlContent = fs.readFileSync(junit_xml, 'utf-8');
574
+ const parsed = parseJUnit(xmlContent);
575
+ const run_summary = {
576
+ results_dir,
577
+ total: parsed.total,
578
+ passed: parsed.passed,
579
+ failures: parsed.failures,
580
+ errors: parsed.errors,
581
+ skipped: parsed.skipped,
582
+ duration_seconds: parsed.duration_seconds,
583
+ };
584
+ // ── Build failure reports ────────────────────────────────────────────
585
+ const artifactsDir = path.join(results_dir, 'Artifacts');
586
+ const screenshot_dir = fs.existsSync(artifactsDir) ? artifactsDir : null;
587
+ const priorFailedTestNames = buildPriorFailureSet(results_dir, resolvedRunIndex);
588
+ const failureReports = buildFailureReports(parsed.testcases, htmlFiles, screenshot_dir, priorFailedTestNames);
589
+ // ── Infrastructure issues ────────────────────────────────────────────
590
+ const infrastructure_issues = failureReports
591
+ .filter((fr) => INFRA_CATEGORIES.has(fr.root_cause_category))
592
+ .map((fr) => `${fr.test_case}: [${fr.root_cause_category}] ${fr.root_cause_summary}`);
593
+ // ── Recommendations (deduplicated) ───────────────────────────────────
594
+ const recommendations = [...new Set(failureReports.map((fr) => fr.recommendation))];
595
+ const result = {
596
+ requestId,
597
+ results_dir,
598
+ run_summary,
599
+ failures: failureReports,
600
+ infrastructure_issues,
601
+ recommendations,
602
+ };
603
+ return {
604
+ content: [{ type: 'text', text: JSON.stringify(result) }],
605
+ };
606
+ }
607
+ catch (err) {
608
+ const error = err;
609
+ const errResult = makeError('RCA_ERROR', error.message, requestId);
610
+ log('error', 'provar.testrun.rca failed', { requestId, error: error.message });
611
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
612
+ }
613
+ });
614
+ }
615
+ // ── Registration entry point ──────────────────────────────────────────────────
616
+ export function registerAllRcaTools(server) {
617
+ registerTestRunLocate(server);
618
+ registerTestRunRca(server);
619
+ }
620
+ //# sourceMappingURL=rcaTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rcaTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/rcaTools.ts"],"names":[],"mappings":"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"}