@provartesting/provardx-cli 1.5.1 → 1.5.2-beta.3
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_TEST_STEP_REFERENCE.md +256 -78
- package/lib/mcp/prompts/loopPrompts.js +4 -3
- package/lib/mcp/prompts/loopPrompts.js.map +1 -1
- package/lib/mcp/rules/provar_best_practices_rules.json +59 -0
- package/lib/mcp/server.js +2 -1
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/tools/antTools.d.ts +20 -0
- package/lib/mcp/tools/antTools.js +45 -3
- package/lib/mcp/tools/antTools.js.map +1 -1
- package/lib/mcp/tools/automationTools.js +44 -15
- package/lib/mcp/tools/automationTools.js.map +1 -1
- package/lib/mcp/tools/bestPracticesEngine.js +300 -9
- package/lib/mcp/tools/bestPracticesEngine.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/propertiesTools.d.ts +12 -0
- package/lib/mcp/tools/propertiesTools.js +113 -1
- package/lib/mcp/tools/propertiesTools.js.map +1 -1
- package/lib/mcp/tools/rcaTools.d.ts +17 -0
- package/lib/mcp/tools/rcaTools.js +51 -2
- package/lib/mcp/tools/rcaTools.js.map +1 -1
- package/lib/mcp/tools/testCaseGenerate.d.ts +1 -0
- package/lib/mcp/tools/testCaseGenerate.js +275 -12
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
- package/lib/mcp/tools/testCaseValidate.d.ts +14 -1
- package/lib/mcp/tools/testCaseValidate.js +67 -21
- package/lib/mcp/tools/testCaseValidate.js.map +1 -1
- package/lib/mcp/tools/uiActionApiIds.d.ts +23 -0
- package/lib/mcp/tools/uiActionApiIds.js +46 -0
- package/lib/mcp/tools/uiActionApiIds.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/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 +2 -1
|
@@ -0,0 +1,208 @@
|
|
|
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 { assertPathAllowed } from '../security/pathPolicy.js';
|
|
12
|
+
/**
|
|
13
|
+
* Resolve whether a given test case file is referenced directly via
|
|
14
|
+
* `testCase`/`testCases` or via a `.testinstance` inside a plan.
|
|
15
|
+
*
|
|
16
|
+
* The resolution flow is intentionally best-effort and silent: any file
|
|
17
|
+
* read failure, JSON parse error, or path-policy violation collapses to
|
|
18
|
+
* `mode: 'unknown'` so the caller falls back to default behaviour rather
|
|
19
|
+
* than surfacing a confusing error from the validator.
|
|
20
|
+
*/
|
|
21
|
+
export function resolveTestCasePlanMode(opts) {
|
|
22
|
+
const propsPath = readPropertiesFilePath(opts);
|
|
23
|
+
if (!propsPath)
|
|
24
|
+
return { mode: 'unknown' };
|
|
25
|
+
let propsObj;
|
|
26
|
+
try {
|
|
27
|
+
propsObj = JSON.parse(fs.readFileSync(propsPath, 'utf-8'));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { mode: 'unknown', propertiesFilePath: propsPath };
|
|
31
|
+
}
|
|
32
|
+
const projectPath = typeof propsObj['projectPath'] === 'string' ? propsObj['projectPath'] : null;
|
|
33
|
+
if (!projectPath) {
|
|
34
|
+
// Without a project root we cannot resolve relative `testCase` entries or
|
|
35
|
+
// walk `plans/`. The mode is unknown.
|
|
36
|
+
return { mode: 'unknown', propertiesFilePath: propsPath };
|
|
37
|
+
}
|
|
38
|
+
let resolvedProjectPath;
|
|
39
|
+
try {
|
|
40
|
+
resolvedProjectPath = path.resolve(projectPath);
|
|
41
|
+
assertPathAllowed(resolvedProjectPath, opts.allowedPaths);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { mode: 'unknown', propertiesFilePath: propsPath };
|
|
45
|
+
}
|
|
46
|
+
const resolvedTestCasePath = path.resolve(opts.testCaseFilePath);
|
|
47
|
+
// A `.testinstance` reference inside any plan wins — plan mode supports
|
|
48
|
+
// data-driven iteration.
|
|
49
|
+
if (isReferencedFromPlanInstance(resolvedProjectPath, resolvedTestCasePath)) {
|
|
50
|
+
return { mode: 'plan', propertiesFilePath: propsPath, projectPath: resolvedProjectPath };
|
|
51
|
+
}
|
|
52
|
+
if (isReferencedDirectly(propsObj, resolvedProjectPath, resolvedTestCasePath)) {
|
|
53
|
+
return { mode: 'direct', propertiesFilePath: propsPath, projectPath: resolvedProjectPath };
|
|
54
|
+
}
|
|
55
|
+
return { mode: 'unknown', propertiesFilePath: propsPath, projectPath: resolvedProjectPath };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolve the active properties file path. Prefers an explicit override
|
|
59
|
+
* (used by tests), then `~/.sf/config.json`'s `PROVARDX_PROPERTIES_FILE_PATH`.
|
|
60
|
+
*
|
|
61
|
+
* Both the override and the value read from `~/.sf/config.json` are funnelled
|
|
62
|
+
* through `assertPathAllowed` so a caller cannot trick the resolver into
|
|
63
|
+
* reading a properties file outside the configured `allowedPaths`. Any policy
|
|
64
|
+
* violation collapses to `null` to preserve the helper's best-effort contract.
|
|
65
|
+
*/
|
|
66
|
+
function readPropertiesFilePath(opts) {
|
|
67
|
+
if (opts.propertiesFilePathOverride) {
|
|
68
|
+
return enforceAllowed(opts.propertiesFilePathOverride, opts.allowedPaths);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const sfConfigPath = opts.sfConfigPathOverride ?? path.join(os.homedir(), '.sf', 'config.json');
|
|
72
|
+
if (!fs.existsSync(sfConfigPath))
|
|
73
|
+
return null;
|
|
74
|
+
const sfConfig = JSON.parse(fs.readFileSync(sfConfigPath, 'utf-8'));
|
|
75
|
+
const propsPath = sfConfig['PROVARDX_PROPERTIES_FILE_PATH'];
|
|
76
|
+
if (!propsPath)
|
|
77
|
+
return null;
|
|
78
|
+
return enforceAllowed(propsPath, opts.allowedPaths);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Resolve a candidate properties-file path through `assertPathAllowed`, then
|
|
86
|
+
* canonicalize via `fs.realpathSync` when the file exists so a symlink
|
|
87
|
+
* inside an allowed directory cannot redirect the read outside it. Returns
|
|
88
|
+
* `null` on any policy violation, missing file, or unexpected error — the
|
|
89
|
+
* caller treats `null` as "mode unknown" and falls back to default behaviour.
|
|
90
|
+
*/
|
|
91
|
+
function enforceAllowed(candidate, allowedPaths) {
|
|
92
|
+
try {
|
|
93
|
+
const resolved = path.resolve(candidate);
|
|
94
|
+
assertPathAllowed(resolved, allowedPaths);
|
|
95
|
+
if (!fs.existsSync(resolved))
|
|
96
|
+
return null;
|
|
97
|
+
try {
|
|
98
|
+
return fs.realpathSync(resolved);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return resolved;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Does the properties file's top-level `testCase` or `testCases` array
|
|
110
|
+
* reference this test case file? Entries are interpreted relative to
|
|
111
|
+
* `<projectPath>/tests/` (per the Provar runtime convention).
|
|
112
|
+
*/
|
|
113
|
+
function isReferencedDirectly(props, projectPath, testCaseFilePath) {
|
|
114
|
+
const entries = [];
|
|
115
|
+
const tc = props['testCase'];
|
|
116
|
+
const tcs = props['testCases'];
|
|
117
|
+
for (const candidate of [tc, tcs]) {
|
|
118
|
+
if (typeof candidate === 'string') {
|
|
119
|
+
entries.push(candidate);
|
|
120
|
+
}
|
|
121
|
+
else if (Array.isArray(candidate)) {
|
|
122
|
+
for (const e of candidate) {
|
|
123
|
+
if (typeof e === 'string')
|
|
124
|
+
entries.push(e);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (entries.length === 0)
|
|
129
|
+
return false;
|
|
130
|
+
const testsDir = path.join(projectPath, 'tests');
|
|
131
|
+
const targetNorm = path.resolve(testCaseFilePath).toLowerCase();
|
|
132
|
+
for (const entry of entries) {
|
|
133
|
+
// Provar accepts both bare names ("MyTest") and relative paths
|
|
134
|
+
// ("Module/MyTest.testcase"). Allow either; match with and without the
|
|
135
|
+
// `.testcase` extension.
|
|
136
|
+
const variants = [];
|
|
137
|
+
const trimmed = entry.replace(/^[/\\]+/, '');
|
|
138
|
+
variants.push(path.resolve(testsDir, trimmed));
|
|
139
|
+
if (!/\.testcase$/i.test(trimmed)) {
|
|
140
|
+
variants.push(path.resolve(testsDir, `${trimmed}.testcase`));
|
|
141
|
+
}
|
|
142
|
+
for (const v of variants) {
|
|
143
|
+
if (v.toLowerCase() === targetNorm)
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Walk `<projectPath>/plans/` for `.testinstance` files referencing this
|
|
151
|
+
* test case via `testCasePath="..."`. Best-effort — any read error skips
|
|
152
|
+
* the offending file.
|
|
153
|
+
*/
|
|
154
|
+
function isReferencedFromPlanInstance(projectPath, testCaseFilePath) {
|
|
155
|
+
const plansDir = path.join(projectPath, 'plans');
|
|
156
|
+
if (!fs.existsSync(plansDir))
|
|
157
|
+
return false;
|
|
158
|
+
const testsDir = path.join(projectPath, 'tests');
|
|
159
|
+
const targetNorm = path.resolve(testCaseFilePath).toLowerCase();
|
|
160
|
+
let found = false;
|
|
161
|
+
const walk = (dir) => {
|
|
162
|
+
if (found)
|
|
163
|
+
return;
|
|
164
|
+
let entries;
|
|
165
|
+
try {
|
|
166
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
for (const entry of entries) {
|
|
172
|
+
if (found)
|
|
173
|
+
return;
|
|
174
|
+
if (entry.name.startsWith('.') && !entry.name.endsWith('.testinstance'))
|
|
175
|
+
continue;
|
|
176
|
+
const full = path.join(dir, entry.name);
|
|
177
|
+
if (entry.isDirectory()) {
|
|
178
|
+
walk(full);
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (!entry.name.endsWith('.testinstance'))
|
|
182
|
+
continue;
|
|
183
|
+
let content;
|
|
184
|
+
try {
|
|
185
|
+
content = fs.readFileSync(full, 'utf-8');
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const matches = content.matchAll(/testCasePath=["']([^"']+)["']/g);
|
|
191
|
+
for (const m of matches) {
|
|
192
|
+
const rel = m[1].replace(/\\/g, '/');
|
|
193
|
+
// testCasePath in Provar testinstances is conventionally relative to
|
|
194
|
+
// `<projectPath>/tests/`. Also tolerate paths relative to project root.
|
|
195
|
+
const candidates = [path.resolve(testsDir, rel), path.resolve(projectPath, rel)];
|
|
196
|
+
for (const c of candidates) {
|
|
197
|
+
if (c.toLowerCase() === targetNorm) {
|
|
198
|
+
found = true;
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
walk(plansDir);
|
|
206
|
+
return found;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=testCasePlanMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testCasePlanMode.js","sourceRoot":"","sources":["../../../src/mcp/utils/testCasePlanMode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const WARNING_CODES: {
|
|
2
|
+
readonly PROVARHOME_001: "PROVARHOME-001";
|
|
3
|
+
readonly DATA_001: "DATA-001";
|
|
4
|
+
readonly PARALLEL_001: "PARALLEL-001";
|
|
5
|
+
readonly SCHEMA_001: "SCHEMA-001";
|
|
6
|
+
readonly RUN_001: "RUN-001";
|
|
7
|
+
readonly JUNIT_001: "JUNIT-001";
|
|
8
|
+
};
|
|
9
|
+
export type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];
|
|
10
|
+
export declare function formatWarning(code: WarningCode, message: string, suggestion?: string): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
export const WARNING_CODES = {
|
|
8
|
+
PROVARHOME_001: 'PROVARHOME-001',
|
|
9
|
+
DATA_001: 'DATA-001',
|
|
10
|
+
PARALLEL_001: 'PARALLEL-001',
|
|
11
|
+
SCHEMA_001: 'SCHEMA-001',
|
|
12
|
+
RUN_001: 'RUN-001',
|
|
13
|
+
JUNIT_001: 'JUNIT-001',
|
|
14
|
+
};
|
|
15
|
+
export function formatWarning(code, message, suggestion) {
|
|
16
|
+
const base = `WARNING [${code}]: ${message}`;
|
|
17
|
+
return suggestion ? `${base} Did you mean '${suggestion}'?` : base;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=warningCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warningCodes.js","sourceRoot":"","sources":["../../../src/mcp/utils/warningCodes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc,EAAE,gBAAgB;IAChC,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,cAAc;IAC5B,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;CACd,CAAC;AAIX,MAAM,UAAU,aAAa,CAAC,IAAiB,EAAE,OAAe,EAAE,UAAmB;IACnF,MAAM,IAAI,GAAG,YAAY,IAAI,MAAM,OAAO,EAAE,CAAC;IAC7C,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,kBAAkB,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC"}
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@provartesting/provardx-cli",
|
|
3
3
|
"description": "A plugin for the Salesforce CLI to orchestrate testing activities and report quality metrics to Provar Quality Hub",
|
|
4
|
-
"version": "1.5.
|
|
4
|
+
"version": "1.5.2-beta.3",
|
|
5
5
|
"mcpName": "io.github.ProvarTesting/provar",
|
|
6
6
|
"license": "BSD-3-Clause",
|
|
7
7
|
"plugins": [
|
|
@@ -159,6 +159,7 @@
|
|
|
159
159
|
"docs/NITROX_COMPONENT_CATALOG.md",
|
|
160
160
|
"docs/NITROX_CATALOG_SOURCE.json",
|
|
161
161
|
"docs/PROVAR_TOOL_GUIDE.md",
|
|
162
|
+
"docs/PROVAR_TEST_STEP_REFERENCE.md",
|
|
162
163
|
"**/tsconfig.json",
|
|
163
164
|
"messages/**"
|
|
164
165
|
],
|