@provartesting/provardx-cli 1.5.0 → 1.5.2-beta.2
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/lib/mcp/docs/PROVAR_TOOL_GUIDE.md +18 -6
- package/lib/mcp/prompts/guidePrompts.js +21 -11
- package/lib/mcp/prompts/guidePrompts.js.map +1 -1
- package/lib/mcp/rules/provar_best_practices_rules.json +29 -0
- package/lib/mcp/server.d.ts +1 -0
- package/lib/mcp/server.js +90 -21
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/tools/antTools.d.ts +20 -0
- package/lib/mcp/tools/antTools.js +105 -41
- package/lib/mcp/tools/antTools.js.map +1 -1
- package/lib/mcp/tools/automationTools.js +65 -35
- package/lib/mcp/tools/automationTools.js.map +1 -1
- package/lib/mcp/tools/bestPracticesEngine.js +148 -9
- package/lib/mcp/tools/bestPracticesEngine.js.map +1 -1
- package/lib/mcp/tools/connectionTools.js +100 -30
- package/lib/mcp/tools/connectionTools.js.map +1 -1
- package/lib/mcp/tools/defectTools.js +12 -7
- package/lib/mcp/tools/defectTools.js.map +1 -1
- package/lib/mcp/tools/descHelper.d.ts +5 -0
- package/lib/mcp/tools/descHelper.js +14 -0
- package/lib/mcp/tools/descHelper.js.map +1 -0
- package/lib/mcp/tools/nitroXTools.js +72 -32
- package/lib/mcp/tools/nitroXTools.js.map +1 -1
- package/lib/mcp/tools/orgDescribeTools.d.ts +57 -0
- package/lib/mcp/tools/orgDescribeTools.js +329 -0
- package/lib/mcp/tools/orgDescribeTools.js.map +1 -0
- package/lib/mcp/tools/pageObjectGenerate.js +33 -15
- package/lib/mcp/tools/pageObjectGenerate.js.map +1 -1
- package/lib/mcp/tools/pageObjectValidate.js +11 -4
- package/lib/mcp/tools/pageObjectValidate.js.map +1 -1
- package/lib/mcp/tools/projectInspect.js +31 -5
- package/lib/mcp/tools/projectInspect.js.map +1 -1
- package/lib/mcp/tools/projectValidateFromPath.js +128 -22
- package/lib/mcp/tools/projectValidateFromPath.js.map +1 -1
- package/lib/mcp/tools/propertiesTools.d.ts +12 -0
- package/lib/mcp/tools/propertiesTools.js +155 -17
- package/lib/mcp/tools/propertiesTools.js.map +1 -1
- package/lib/mcp/tools/qualityHubApiTools.js +8 -7
- package/lib/mcp/tools/qualityHubApiTools.js.map +1 -1
- package/lib/mcp/tools/qualityHubTools.js +108 -37
- package/lib/mcp/tools/qualityHubTools.js.map +1 -1
- package/lib/mcp/tools/rcaTools.d.ts +17 -0
- package/lib/mcp/tools/rcaTools.js +69 -15
- package/lib/mcp/tools/rcaTools.js.map +1 -1
- package/lib/mcp/tools/testCaseGenerate.d.ts +1 -0
- package/lib/mcp/tools/testCaseGenerate.js +254 -17
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
- package/lib/mcp/tools/testCaseStepTools.js +27 -9
- package/lib/mcp/tools/testCaseStepTools.js.map +1 -1
- package/lib/mcp/tools/testCaseValidate.d.ts +14 -1
- package/lib/mcp/tools/testCaseValidate.js +190 -69
- package/lib/mcp/tools/testCaseValidate.js.map +1 -1
- package/lib/mcp/tools/testPlanTools.js +43 -26
- package/lib/mcp/tools/testPlanTools.js.map +1 -1
- package/lib/mcp/tools/testPlanValidate.js +64 -11
- package/lib/mcp/tools/testPlanValidate.js.map +1 -1
- package/lib/mcp/tools/testSuiteValidate.js +99 -10
- package/lib/mcp/tools/testSuiteValidate.js.map +1 -1
- package/lib/mcp/utils/detailLevel.d.ts +9 -0
- package/lib/mcp/utils/detailLevel.js +20 -0
- package/lib/mcp/utils/detailLevel.js.map +1 -0
- package/lib/mcp/utils/fieldMask.d.ts +17 -0
- package/lib/mcp/utils/fieldMask.js +75 -0
- package/lib/mcp/utils/fieldMask.js.map +1 -0
- package/lib/mcp/utils/testCasePlanMode.d.ts +41 -0
- package/lib/mcp/utils/testCasePlanMode.js +208 -0
- package/lib/mcp/utils/testCasePlanMode.js.map +1 -0
- package/lib/mcp/utils/tokenMeta.d.ts +40 -0
- package/lib/mcp/utils/tokenMeta.js +90 -0
- package/lib/mcp/utils/tokenMeta.js.map +1 -0
- package/lib/mcp/utils/validationDiff.d.ts +57 -0
- package/lib/mcp/utils/validationDiff.js +191 -0
- package/lib/mcp/utils/validationDiff.js.map +1 -0
- package/lib/mcp/utils/validationScore.d.ts +15 -0
- package/lib/mcp/utils/validationScore.js +31 -0
- package/lib/mcp/utils/validationScore.js.map +1 -0
- package/lib/mcp/utils/warningCodes.d.ts +10 -0
- package/lib/mcp/utils/warningCodes.js +19 -0
- package/lib/mcp/utils/warningCodes.js.map +1 -0
- package/oclif.manifest.json +1 -1
- package/package.json +13 -1
|
@@ -77,15 +77,27 @@ provar_properties_set { file_path: "<output_path>", key: "connectionName", valu
|
|
|
77
77
|
|
|
78
78
|
## "I want to write a new test"
|
|
79
79
|
|
|
80
|
+
A Provar test case is a tree (scenarios → UI screens → asserts), not a flat list of steps. The agent that calls `provar_testcase_generate` is responsible for constructing the full tree in **one** call. Splitting authoring across many tool calls causes scenario numbering drift, flat asserts, and inconsistent step types — `provar_testcase_step_edit` is for **amending** an existing test case, not for **constructing** one.
|
|
81
|
+
|
|
82
|
+
Recommended sequence:
|
|
83
|
+
|
|
80
84
|
```
|
|
81
|
-
1. provar_project_inspect
|
|
82
|
-
2.
|
|
83
|
-
3.
|
|
84
|
-
4. provar_testcase_validate
|
|
85
|
-
5. provar_testplan_add-instance
|
|
86
|
-
6. provar_testplan_validate
|
|
85
|
+
1. provar_project_inspect { project_path } ← find coverage gaps first
|
|
86
|
+
2. provar_qualityhub_examples_retrieve { object_or_scenario } ← ground in corpus examples for the step types you need
|
|
87
|
+
3. provar_testcase_generate { test_case_name, steps: [<ALL steps>] } ← single call, full step tree in one payload
|
|
88
|
+
4. provar_testcase_validate { file_path } ← must pass before adding to plan
|
|
89
|
+
5. provar_testplan_add-instance { project_path, plan_name, test_case_path }
|
|
90
|
+
6. provar_testplan_validate { project_path, plan_name }
|
|
87
91
|
```
|
|
88
92
|
|
|
93
|
+
Use `provar_testcase_step_edit` only when:
|
|
94
|
+
|
|
95
|
+
- Adding a single step to an existing, already-validated test case
|
|
96
|
+
- Fixing a step's attributes after a validation finding
|
|
97
|
+
- Targeted edits during debugging
|
|
98
|
+
|
|
99
|
+
Do **not** use `provar_testcase_step_edit` to construct a test case step-by-step from an empty skeleton — the LLM loses scenario context between calls and the resulting structure is unreliable.
|
|
100
|
+
|
|
89
101
|
---
|
|
90
102
|
|
|
91
103
|
## "I want to work with Salesforce metadata"
|
|
@@ -225,16 +225,23 @@ Required sequence — do not skip steps:
|
|
|
225
225
|
6. provar_qualityhub_defect_create → optional, create defects for failures`,
|
|
226
226
|
'author-test': `## Author a New Test Case
|
|
227
227
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
228
|
+
Construct the full step tree in a single \`provar_testcase_generate\` call.
|
|
229
|
+
\`provar_testcase_step_edit\` is for amending an existing case, not for
|
|
230
|
+
building one step-by-step (that pattern drops scenarios and flattens nesting).
|
|
231
|
+
|
|
232
|
+
1. provar_project_inspect → find coverage gaps before writing
|
|
233
|
+
2. provar_qualityhub_examples_retrieve → ground in corpus examples for the step types you need
|
|
234
|
+
3. provar_automation_metadata_download → if SF metadata is stale (missing fields/objects)
|
|
235
|
+
4. provar_pageobject_generate → only if a new page object is needed
|
|
236
|
+
5. provar_pageobject_validate → validate before compile
|
|
237
|
+
6. provar_automation_compile → after any page object change
|
|
238
|
+
7. provar_testcase_generate → single call, pass ALL steps in one payload
|
|
239
|
+
8. provar_testcase_validate → MUST pass before adding to a plan
|
|
240
|
+
9. provar_testplan_add-instance → add to an existing plan
|
|
241
|
+
10. provar_testplan_validate → validate the plan
|
|
242
|
+
|
|
243
|
+
Use provar_testcase_step_edit only to amend an existing validated test case
|
|
244
|
+
(single-step add, attribute fix, debug edit) — never to construct one from scratch.`,
|
|
238
245
|
'debug-failures': `## Debug Failing Tests
|
|
239
246
|
|
|
240
247
|
1. provar_testrun_report_locate → find the report file
|
|
@@ -278,11 +285,14 @@ provar_pageobject_validate
|
|
|
278
285
|
provar_nitrox_generate OR provar_nitrox_patch
|
|
279
286
|
└── provar_nitrox_validate (always validate after)
|
|
280
287
|
|
|
281
|
-
provar_testcase_generate
|
|
288
|
+
provar_testcase_generate (construct full case — pass ALL steps in one call)
|
|
282
289
|
└── provar_testcase_validate
|
|
283
290
|
└── provar_testplan_add-instance
|
|
284
291
|
└── provar_testplan_validate
|
|
285
292
|
|
|
293
|
+
provar_testcase_step_edit (amend an existing validated case only — never construct)
|
|
294
|
+
└── provar_testcase_validate
|
|
295
|
+
|
|
286
296
|
### Safe to run in parallel (no dependency between them)
|
|
287
297
|
- provar_project_inspect + provar_connection_list
|
|
288
298
|
- provar_pageobject_validate on multiple files
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guidePrompts.js","sourceRoot":"","sources":["../../../src/mcp/prompts/guidePrompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,gFAAgF;AAEhF,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,MAAM,CACX,yBAAyB,EACzB,kOAAkO,EAClO;QACE,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,gIAAgI,CACjI;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,gJAAgJ,CACjJ;KACJ,EACD,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;;;EAKhB,WAAW;wBACT,CAAC,CAAC,oCAAoC,WAAW,EAAE;wBACnD,CAAC,CAAC,iQACN;;kBAEkB,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4B7F,IAAI,KAAK,aAAa;wBACpB,CAAC,CAAC;;;;;;;;;;;;;8EAawE;wBAC1E,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;8EAsBN;;;;;;;;;;;;;;;;;yEAiByE;iBAC9D;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,MAAM,CACX,2BAA2B,EAC3B,2NAA2N,EAC3N;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,iIAAiI,CAClI;QACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;KACvG,EACD,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;;EAGhB,YAAY;wBACV,CAAC,CAAC,6BAA6B,YAAY,EAAE;wBAC7C,CAAC,CAAC,4FACN;EACE,WAAW,CAAC,CAAC,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAqDzB;iBACjB;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,MAAM,CACX,4BAA4B,EAC5B,4NAA4N,EAC5N;QACE,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,0PAA0P,CAC3P;KACJ,EACD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACX,MAAM,KAAK,GAA2B;YACpC,WAAW,EAAE;;;;;;;;;;2DAUsC;YAEnD,iBAAiB,EAAE;;;;;;;;4EAQiD;YAEpE,aAAa,EAAE
|
|
1
|
+
{"version":3,"file":"guidePrompts.js","sourceRoot":"","sources":["../../../src/mcp/prompts/guidePrompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -2899,6 +2899,35 @@
|
|
|
2899
2899
|
},
|
|
2900
2900
|
"notes": "Provar internally stores dates as epoch timestamps (milliseconds since 1970-01-01). When valueClass='date' is used, Provar expects a numeric epoch value. String dates cause XML parsing/loading failures. All valid corpus examples use epoch timestamps with valueClass='date': 1637798400000, 1513209600000, etc.",
|
|
2901
2901
|
"source": "Corpus analysis: All valueClass='date' values are epoch timestamps; string dates cause Provar IDE load failures"
|
|
2902
|
+
},
|
|
2903
|
+
{
|
|
2904
|
+
"id": "UI-NEST-STRUCT-001",
|
|
2905
|
+
"category": "XMLSchema",
|
|
2906
|
+
"name": "UI action steps must be nested inside a UiWithScreen substeps clause",
|
|
2907
|
+
"description": "UiDoAction, UiAssert, UiRead, UiFill, UiNavigate, UiWithRow, and UiHandleAlert steps must descend from a UiWithScreen or UiWithRow ancestor through a <clause name=\"substeps\"> path. Control-flow wrappers (IfThen, ForEach, DoWhile, WaitFor, Switch) between the screen ancestor and the UI action are allowed. Steps inside <clause name=\"hidden\"> are exempt. When emitted flat (e.g. as siblings of UiWithScreen in the root <steps>), Provar IDE cannot bind them to a screen context and they will not render correctly.",
|
|
2908
|
+
"appliesTo": ["Step"],
|
|
2909
|
+
"severity": "major",
|
|
2910
|
+
"weight": 7,
|
|
2911
|
+
"recommendation": "Wrap each UI action inside a parent UiWithScreen using this structure:\n\n <apiCall apiId=\"com.provar.plugins.forcedotcom.core.ui.UiWithScreen\" ...>\n <arguments>...</arguments>\n <clauses>\n <clause name=\"substeps\" testItemId=\"...\">\n <steps>\n <apiCall apiId=\"...UiDoAction\" .../>\n <apiCall apiId=\"...UiWithRow\" ...> ... </apiCall>\n </steps>\n </clause>\n </clauses>\n </apiCall>\n\nUiWithRow may contain its own <clauses><clause name=\"substeps\"> with further UI actions inside. Control-flow wrappers (IfThen, ForEach, DoWhile, WaitFor) between the screen ancestor and the UI action are allowed; <clause name=\"hidden\"> is exempt (disabled/settings blocks).",
|
|
2912
|
+
"check": {
|
|
2913
|
+
"type": "uiActionNestingStructure",
|
|
2914
|
+
"target": "step",
|
|
2915
|
+
"uiActionApiIds": [
|
|
2916
|
+
"com.provar.plugins.forcedotcom.core.ui.UiDoAction",
|
|
2917
|
+
"com.provar.plugins.forcedotcom.core.ui.UiAssert",
|
|
2918
|
+
"com.provar.plugins.forcedotcom.core.ui.UiRead",
|
|
2919
|
+
"com.provar.plugins.forcedotcom.core.ui.UiFill",
|
|
2920
|
+
"com.provar.plugins.forcedotcom.core.ui.UiNavigate",
|
|
2921
|
+
"com.provar.plugins.forcedotcom.core.ui.UiWithRow",
|
|
2922
|
+
"com.provar.plugins.forcedotcom.core.ui.UiHandleAlert"
|
|
2923
|
+
],
|
|
2924
|
+
"screenContainerApiIds": [
|
|
2925
|
+
"com.provar.plugins.forcedotcom.core.ui.UiWithScreen",
|
|
2926
|
+
"com.provar.plugins.forcedotcom.core.ui.UiWithRow"
|
|
2927
|
+
]
|
|
2928
|
+
},
|
|
2929
|
+
"notes": "Mirrors QH UiActionNestingStructureValidator (lambda/src/validator/best_practices_engine.py). Emits one violation per offending step so that (rule_id, test_item_id) de-dups against the API. UiWithRow plays a dual role: itself a UI action that must be nested, and a container whose substeps clause satisfies the rule for its descendants.",
|
|
2930
|
+
"source": "Field observation: flat-emitted UI actions (sibling of UiWithScreen) fail to render in Provar IDE despite scoring 100/94 in earlier local validation"
|
|
2902
2931
|
}
|
|
2903
2932
|
]
|
|
2904
2933
|
}
|
package/lib/mcp/server.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export interface ServerConfig {
|
|
|
7
7
|
updateCommand: string | null;
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
+
export declare function parseActiveGroups(): Set<string> | null;
|
|
10
11
|
export declare function createProvarMcpServer(config: ServerConfig): McpServer;
|
|
11
12
|
/**
|
|
12
13
|
* Resolve the docs directory for bundled MCP Markdown resources.
|
package/lib/mcp/server.js
CHANGED
|
@@ -32,7 +32,72 @@ import { registerAllTestPlanTools } from './tools/testPlanTools.js';
|
|
|
32
32
|
import { registerAllNitroXTools } from './tools/nitroXTools.js';
|
|
33
33
|
import { registerAllTestCaseStepTools } from './tools/testCaseStepTools.js';
|
|
34
34
|
import { registerAllConnectionTools } from './tools/connectionTools.js';
|
|
35
|
+
import { registerAllOrgDescribeTools } from './tools/orgDescribeTools.js';
|
|
35
36
|
import { registerAllPrompts } from './prompts/index.js';
|
|
37
|
+
import { createDepthGuardState, wrapWithDepthGuard, } from './utils/tokenMeta.js';
|
|
38
|
+
import { desc } from './tools/descHelper.js';
|
|
39
|
+
// ── Tool group registry ───────────────────────────────────────────────────────
|
|
40
|
+
// Groups are keyed in lowercase so they match the lowercased env var values.
|
|
41
|
+
const TOOL_GROUPS = {
|
|
42
|
+
nitrox: [registerAllNitroXTools],
|
|
43
|
+
automation: [registerAllAutomationTools],
|
|
44
|
+
qualityhub: [registerAllQualityHubTools, registerAllQualityHubApiTools, registerAllDefectTools],
|
|
45
|
+
validation: [
|
|
46
|
+
registerProjectValidateFromPath,
|
|
47
|
+
registerAllAntTools,
|
|
48
|
+
registerAllPropertiesTools,
|
|
49
|
+
registerTestCaseValidate,
|
|
50
|
+
registerTestSuiteValidate,
|
|
51
|
+
registerTestPlanValidate,
|
|
52
|
+
registerPageObjectValidate,
|
|
53
|
+
],
|
|
54
|
+
authoring: [
|
|
55
|
+
registerTestCaseGenerate,
|
|
56
|
+
registerPageObjectGenerate,
|
|
57
|
+
registerAllTestCaseStepTools,
|
|
58
|
+
registerAllTestPlanTools,
|
|
59
|
+
],
|
|
60
|
+
inspect: [registerProjectInspect, registerAllOrgDescribeTools],
|
|
61
|
+
connection: [registerAllConnectionTools],
|
|
62
|
+
rca: [registerAllRcaTools],
|
|
63
|
+
};
|
|
64
|
+
export function parseActiveGroups() {
|
|
65
|
+
const env = process.env['PROVAR_MCP_TOOLS'];
|
|
66
|
+
if (!env?.trim())
|
|
67
|
+
return null;
|
|
68
|
+
const requested = new Set(env
|
|
69
|
+
.split(',')
|
|
70
|
+
.map((g) => g.trim().toLowerCase())
|
|
71
|
+
.filter(Boolean));
|
|
72
|
+
if (requested.size === 0) {
|
|
73
|
+
log('warn', 'PROVAR_MCP_TOOLS was set but contained no valid group names — activating all groups', { raw: env });
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const known = new Set(Object.keys(TOOL_GROUPS));
|
|
77
|
+
const matched = new Set();
|
|
78
|
+
const unknown = [];
|
|
79
|
+
for (const g of requested) {
|
|
80
|
+
if (known.has(g))
|
|
81
|
+
matched.add(g);
|
|
82
|
+
else
|
|
83
|
+
unknown.push(g);
|
|
84
|
+
}
|
|
85
|
+
if (unknown.length > 0) {
|
|
86
|
+
log('warn', 'PROVAR_MCP_TOOLS contains unknown group names — they will be ignored', {
|
|
87
|
+
raw: env,
|
|
88
|
+
unknown,
|
|
89
|
+
known: [...known],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (matched.size === 0) {
|
|
93
|
+
log('warn', 'PROVAR_MCP_TOOLS matched no known group names — activating all groups', {
|
|
94
|
+
raw: env,
|
|
95
|
+
known: [...known],
|
|
96
|
+
});
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return matched;
|
|
100
|
+
}
|
|
36
101
|
export function createProvarMcpServer(config) {
|
|
37
102
|
log('info', 'Creating Provar MCP server', { allowedPaths: config.allowedPaths });
|
|
38
103
|
const server = new McpServer({
|
|
@@ -42,9 +107,13 @@ export function createProvarMcpServer(config) {
|
|
|
42
107
|
// ── Sanity-check tool ────────────────────────────────────────────────────────
|
|
43
108
|
server.registerTool('provardx_ping', {
|
|
44
109
|
title: 'Ping MCP Server',
|
|
45
|
-
description: 'Sanity-check tool. Echoes back a message with a timestamp. Use this to verify the MCP server is reachable before calling other tools.',
|
|
110
|
+
description: desc('Sanity-check tool. Echoes back a message with a timestamp. Use this to verify the MCP server is reachable before calling other tools.', 'Echo message back with timestamp; verify MCP server is reachable.'),
|
|
46
111
|
inputSchema: {
|
|
47
|
-
message: z
|
|
112
|
+
message: z
|
|
113
|
+
.string()
|
|
114
|
+
.optional()
|
|
115
|
+
.default('ping')
|
|
116
|
+
.describe(desc('Optional message to echo back', 'message to echo')),
|
|
48
117
|
},
|
|
49
118
|
}, ({ message }) => {
|
|
50
119
|
const result = {
|
|
@@ -60,26 +129,20 @@ export function createProvarMcpServer(config) {
|
|
|
60
129
|
structuredContent: result,
|
|
61
130
|
};
|
|
62
131
|
});
|
|
132
|
+
// ── Depth-guard middleware (PDX-474) ─────────────────────────────────────────
|
|
133
|
+
const rawLimit = parseInt(process.env['PROVAR_MCP_MAX_TOOL_DEPTH'] ?? '50', 10);
|
|
134
|
+
const depthLimit = Number.isNaN(rawLimit) || rawLimit <= 0 ? 50 : rawLimit;
|
|
135
|
+
const depthState = createDepthGuardState();
|
|
136
|
+
patchWithMiddleware(server, depthState, depthLimit);
|
|
63
137
|
// ── Provar tools ─────────────────────────────────────────────────────────────
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
registerAllPropertiesTools(server, config);
|
|
73
|
-
registerAllQualityHubTools(server);
|
|
74
|
-
registerAllQualityHubApiTools(server);
|
|
75
|
-
registerAllAutomationTools(server, config);
|
|
76
|
-
registerAllDefectTools(server);
|
|
77
|
-
registerAllAntTools(server, config);
|
|
78
|
-
registerAllRcaTools(server, config);
|
|
79
|
-
registerAllTestPlanTools(server, config);
|
|
80
|
-
registerAllNitroXTools(server, config);
|
|
81
|
-
registerAllTestCaseStepTools(server, config);
|
|
82
|
-
registerAllConnectionTools(server, config);
|
|
138
|
+
const activeGroups = parseActiveGroups();
|
|
139
|
+
for (const [group, registrars] of Object.entries(TOOL_GROUPS)) {
|
|
140
|
+
if (activeGroups === null || activeGroups.has(group)) {
|
|
141
|
+
for (const register of registrars) {
|
|
142
|
+
register(server, config);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
83
146
|
// ── Provar prompts ───────────────────────────────────────────────────────────
|
|
84
147
|
registerAllPrompts(server);
|
|
85
148
|
// ── Documentation resources ──────────────────────────────────────────────────
|
|
@@ -167,6 +230,12 @@ export function createProvarMcpServer(config) {
|
|
|
167
230
|
});
|
|
168
231
|
return server;
|
|
169
232
|
}
|
|
233
|
+
function patchWithMiddleware(server, state, limit) {
|
|
234
|
+
const orig = server.registerTool.bind(server);
|
|
235
|
+
// Cast through unknown to patch the overloaded method without triggering no-unsafe-any.
|
|
236
|
+
const patchable = server;
|
|
237
|
+
patchable.registerTool = (name, config, handler) => orig(name, config, wrapWithDepthGuard(name, handler, state, limit));
|
|
238
|
+
}
|
|
170
239
|
/**
|
|
171
240
|
* Resolve the docs directory for bundled MCP Markdown resources.
|
|
172
241
|
* In compiled output (lib/mcp/) the sibling docs/ dir exists; in dev/ts-node
|
package/lib/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,MAAM,cAAc,GAAY,WAAW,CAAC,oBAAoB,CAAyB,CAAC,OAAO,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,MAAM,cAAc,GAAY,WAAW,CAAC,oBAAoB,CAAyB,CAAC,OAAO,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAGnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,iFAAiF;AACjF,6EAA6E;AAC7E,MAAM,WAAW,GAA6E;IAC5F,MAAM,EAAE,CAAC,sBAAsB,CAAC;IAChC,UAAU,EAAE,CAAC,0BAA0B,CAAC;IACxC,UAAU,EAAE,CAAC,0BAA0B,EAAE,6BAA6B,EAAE,sBAAsB,CAAC;IAC/F,UAAU,EAAE;QACV,+BAA+B;QAC/B,mBAAmB;QACnB,0BAA0B;QAC1B,wBAAwB;QACxB,yBAAyB;QACzB,wBAAwB;QACxB,0BAA0B;KAC3B;IACD,SAAS,EAAE;QACT,wBAAwB;QACxB,0BAA0B;QAC1B,4BAA4B;QAC5B,wBAAwB;KACzB;IACD,OAAO,EAAE,CAAC,sBAAsB,EAAE,2BAA2B,CAAC;IAC9D,UAAU,EAAE,CAAC,0BAA0B,CAAC;IACxC,GAAG,EAAE,CAAC,mBAAmB,CAAC;CAC3B,CAAC;AAWF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,GAAG;SACA,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;IACF,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,EAAE,qFAAqF,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACjH,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,MAAM,EAAE,sEAAsE,EAAE;YAClF,GAAG,EAAE,GAAG;YACR,OAAO;YACP,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;SAClB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,MAAM,EAAE,uEAAuE,EAAE;YACnF,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;SAClB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,GAAG,CAAC,MAAM,EAAE,4BAA4B,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAEjF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,gFAAgF;IAChF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,IAAI,CACf,uIAAuI,EACvI,mEAAmE,CACpE;QACD,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CAAC,IAAI,CAAC,+BAA+B,EAAE,iBAAiB,CAAC,CAAC;SACtE;KACF,EACD,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;QACd,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,MAAM,EAAE,cAAc,cAAc,EAAE;YACtC,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,eAAe,IAAI,KAAK;YAC9D,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,aAAa,IAAI,IAAI;YACzD,aAAa,EAAE,MAAM,CAAC,YAAY,EAAE,aAAa,IAAI,IAAI;SAC1D,CAAC;QACF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,iBAAiB,EAAE,MAAM;SAC1B,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,gFAAgF;IAChF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3E,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAC;IAC3C,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAEpD,gFAAgF;IAChF,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9D,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3B,gFAAgF;IAChF,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAExE,MAAM,CAAC,QAAQ,CACb,iCAAiC,EACjC,mCAAmC,EACnC;QACE,WAAW,EACT,kRAAkR;QACpR,QAAQ,EAAE,eAAe;KAC1B,EACD,GAAG,EAAE;QACH,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B,CAAC,EAAE,OAAO,CAAC,CAAC;YACjF,OAAO;gBACL,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,mCAAmC,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;aAC1F,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,mCAAmC;wBACxC,QAAQ,EAAE,eAAe;wBACzB,IAAI,EAAE,4KAA4K;qBACnL;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,8BAA8B,EAC9B,gCAAgC,EAChC;QACE,WAAW,EACT,0QAA0Q;QAC5Q,QAAQ,EAAE,kBAAkB;KAC7B,EACD,GAAG,EAAE;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO;YACL,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,gCAAgC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;SAC1F,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,uBAAuB,EACvB,8BAA8B,EAC9B;QACE,WAAW,EACT,oNAAoN;QACtN,QAAQ,EAAE,eAAe;KAC1B,EACD,GAAG,EAAE;QACH,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,+BAA+B,CAAC,EAAE,OAAO,CAAC,CAAC;YACtF,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,8BAA8B;wBACnC,QAAQ,EAAE,eAAe;wBACzB,IAAI,EAAE,OAAO;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,8BAA8B;wBACnC,QAAQ,EAAE,eAAe;wBACzB,IAAI,EAAE,oLAAoL;qBAC3L;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,mBAAmB,EACnB,0BAA0B,EAC1B;QACE,WAAW,EACT,qQAAqQ;QACvQ,QAAQ,EAAE,eAAe;KAC1B,EACD,GAAG,EAAE;QACH,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1E,OAAO;gBACL,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,0BAA0B,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;aACjF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,0BAA0B;wBAC/B,QAAQ,EAAE,eAAe;wBACzB,IAAI,EAAE,0FAA0F;qBACjG;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiB,EAAE,KAAsB,EAAE,KAAa;IACnF,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE9C,wFAAwF;IACxF,MAAM,SAAS,GAAG,MAAqD,CAAC;IACxE,SAAS,CAAC,YAAY,GAAG,CAAC,IAAY,EAAE,MAAe,EAAE,OAAwB,EAAW,EAAE,CAC3F,IAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACvG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,4BAA4B,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,4EAA4E;QAC5E,+DAA+D;QAC/D,IAAI,CAAC,CAAC,gBAAgB,IAAI,MAAM,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,IAAI;SACrB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -18,15 +18,35 @@ export interface AntValidationResult {
|
|
|
18
18
|
}
|
|
19
19
|
/** Pure function — exported for unit testing */
|
|
20
20
|
export declare function validateAntXml(xmlContent: string): AntValidationResult;
|
|
21
|
+
export type JUnitErrorCategory = 'INFRASTRUCTURE' | 'ASSERTION' | 'LOCATOR' | 'TIMEOUT' | 'OTHER';
|
|
21
22
|
export interface JUnitStepResult {
|
|
22
23
|
testItemId: string;
|
|
23
24
|
title: string;
|
|
24
25
|
status: 'pass' | 'fail' | 'skip';
|
|
25
26
|
errorMessage?: string;
|
|
27
|
+
error_category?: JUnitErrorCategory;
|
|
28
|
+
retryable?: boolean;
|
|
26
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Classify a failure message into a coarse-grained category used for retry decisions.
|
|
32
|
+
* Mirrors the classifier in rcaTools.ts (PDX-490) so a downstream consumer sees the
|
|
33
|
+
* same labelling whether they consume `provar_automation_testrun.steps[]` or
|
|
34
|
+
* `provar_testrun_rca.failures[]`.
|
|
35
|
+
*
|
|
36
|
+
* Returns `undefined` when no pattern matches.
|
|
37
|
+
*/
|
|
38
|
+
export declare function classifyStepErrorCategory(errorText: string): JUnitErrorCategory | undefined;
|
|
39
|
+
/** Only transient categories (INFRASTRUCTURE, TIMEOUT) are retryable. */
|
|
40
|
+
export declare function isStepRetryable(category: JUnitErrorCategory | undefined): boolean | undefined;
|
|
27
41
|
export interface JUnitParseResult {
|
|
28
42
|
steps: JUnitStepResult[];
|
|
29
43
|
warning?: string;
|
|
44
|
+
/**
|
|
45
|
+
* True iff at least one JUnit XML file was located AND parsed without throwing.
|
|
46
|
+
* Distinguishes "we have data and the test selector matched zero cases" (legit RUN-001 signal)
|
|
47
|
+
* from "we have no data because nothing parsed" (insufficient info — must stay silent).
|
|
48
|
+
*/
|
|
49
|
+
parsedAny: boolean;
|
|
30
50
|
}
|
|
31
51
|
/**
|
|
32
52
|
* Scan a Provar results directory for JUnit XML files and return structured step results.
|