@provartesting/provardx-cli 1.5.0-dev.2 → 1.5.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.
- package/README.md +163 -12
- package/bin/mcp-start.js +74 -0
- package/lib/commands/provar/auth/clear.d.ts +7 -0
- package/lib/commands/provar/auth/clear.js +36 -0
- package/lib/commands/provar/auth/clear.js.map +1 -0
- package/lib/commands/provar/auth/login.d.ts +10 -0
- package/lib/commands/provar/auth/login.js +90 -0
- package/lib/commands/provar/auth/login.js.map +1 -0
- package/lib/commands/provar/auth/rotate.d.ts +7 -0
- package/lib/commands/provar/auth/rotate.js +42 -0
- package/lib/commands/provar/auth/rotate.js.map +1 -0
- package/lib/commands/provar/auth/status.d.ts +7 -0
- package/lib/commands/provar/auth/status.js +107 -0
- package/lib/commands/provar/auth/status.js.map +1 -0
- package/lib/commands/provar/mcp/start.d.ts +2 -0
- package/lib/commands/provar/mcp/start.js +14 -1
- package/lib/commands/provar/mcp/start.js.map +1 -1
- package/lib/mcp/docs/NITROX_CATALOG_SOURCE.json +6 -0
- package/lib/mcp/docs/NITROX_COMPONENT_CATALOG.md +2001 -0
- package/lib/mcp/docs/PROVAR_TEST_STEP_REFERENCE.md +1430 -0
- package/lib/mcp/docs/PROVAR_TOOL_GUIDE.md +187 -0
- package/lib/mcp/licensing/algasClient.js +14 -5
- package/lib/mcp/licensing/algasClient.js.map +1 -1
- package/lib/mcp/licensing/ideDetection.d.ts +0 -12
- package/lib/mcp/licensing/ideDetection.js +1 -73
- package/lib/mcp/licensing/ideDetection.js.map +1 -1
- package/lib/mcp/licensing/licenseCache.js +7 -1
- package/lib/mcp/licensing/licenseCache.js.map +1 -1
- package/lib/mcp/licensing/licenseValidator.d.ts +3 -3
- package/lib/mcp/licensing/licenseValidator.js +11 -4
- package/lib/mcp/licensing/licenseValidator.js.map +1 -1
- package/lib/mcp/prompts/guidePrompts.d.ts +4 -0
- package/lib/mcp/prompts/guidePrompts.js +334 -0
- package/lib/mcp/prompts/guidePrompts.js.map +1 -0
- package/lib/mcp/prompts/index.d.ts +2 -0
- package/lib/mcp/prompts/index.js +23 -0
- package/lib/mcp/prompts/index.js.map +1 -0
- package/lib/mcp/prompts/loopPrompts.d.ts +6 -0
- package/lib/mcp/prompts/loopPrompts.js +435 -0
- package/lib/mcp/prompts/loopPrompts.js.map +1 -0
- package/lib/mcp/prompts/migrationPrompts.d.ts +4 -0
- package/lib/mcp/prompts/migrationPrompts.js +207 -0
- package/lib/mcp/prompts/migrationPrompts.js.map +1 -0
- package/lib/mcp/rules/provar_best_practices_rules.json +256 -544
- package/lib/mcp/security/pathPolicy.d.ts +5 -0
- package/lib/mcp/security/pathPolicy.js +58 -3
- package/lib/mcp/security/pathPolicy.js.map +1 -1
- package/lib/mcp/server.d.ts +18 -0
- package/lib/mcp/server.js +232 -19
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/tools/antTools.d.ts +15 -0
- package/lib/mcp/tools/antTools.js +369 -170
- package/lib/mcp/tools/antTools.js.map +1 -1
- package/lib/mcp/tools/automationTools.d.ts +18 -8
- package/lib/mcp/tools/automationTools.js +333 -176
- package/lib/mcp/tools/automationTools.js.map +1 -1
- package/lib/mcp/tools/bestPracticesEngine.js +161 -23
- package/lib/mcp/tools/bestPracticesEngine.js.map +1 -1
- package/lib/mcp/tools/connectionTools.d.ts +4 -0
- package/lib/mcp/tools/connectionTools.js +242 -0
- package/lib/mcp/tools/connectionTools.js.map +1 -0
- package/lib/mcp/tools/defectTools.d.ts +1 -1
- package/lib/mcp/tools/defectTools.js +61 -50
- 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/hierarchyValidate.d.ts +1 -1
- package/lib/mcp/tools/hierarchyValidate.js +127 -42
- package/lib/mcp/tools/hierarchyValidate.js.map +1 -1
- package/lib/mcp/tools/nitroXTools.d.ts +23 -0
- package/lib/mcp/tools/nitroXTools.js +863 -0
- package/lib/mcp/tools/nitroXTools.js.map +1 -0
- package/lib/mcp/tools/pageObjectGenerate.js +150 -57
- package/lib/mcp/tools/pageObjectGenerate.js.map +1 -1
- package/lib/mcp/tools/pageObjectValidate.js +143 -46
- package/lib/mcp/tools/pageObjectValidate.js.map +1 -1
- package/lib/mcp/tools/projectInspect.js +79 -32
- package/lib/mcp/tools/projectInspect.js.map +1 -1
- package/lib/mcp/tools/projectValidateFromPath.js +185 -58
- package/lib/mcp/tools/projectValidateFromPath.js.map +1 -1
- package/lib/mcp/tools/propertiesTools.d.ts +2 -0
- package/lib/mcp/tools/propertiesTools.js +358 -78
- package/lib/mcp/tools/propertiesTools.js.map +1 -1
- package/lib/mcp/tools/qualityHubApiTools.d.ts +3 -0
- package/lib/mcp/tools/qualityHubApiTools.js +139 -0
- package/lib/mcp/tools/qualityHubApiTools.js.map +1 -0
- package/lib/mcp/tools/qualityHubTools.js +292 -72
- package/lib/mcp/tools/qualityHubTools.js.map +1 -1
- package/lib/mcp/tools/rcaTools.d.ts +3 -2
- package/lib/mcp/tools/rcaTools.js +194 -56
- package/lib/mcp/tools/rcaTools.js.map +1 -1
- package/lib/mcp/tools/sfSpawn.d.ts +25 -3
- package/lib/mcp/tools/sfSpawn.js +154 -6
- package/lib/mcp/tools/sfSpawn.js.map +1 -1
- package/lib/mcp/tools/testCaseGenerate.js +285 -78
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
- package/lib/mcp/tools/testCaseStepTools.d.ts +4 -0
- package/lib/mcp/tools/testCaseStepTools.js +244 -0
- package/lib/mcp/tools/testCaseStepTools.js.map +1 -0
- package/lib/mcp/tools/testCaseValidate.d.ts +11 -0
- package/lib/mcp/tools/testCaseValidate.js +381 -46
- package/lib/mcp/tools/testCaseValidate.js.map +1 -1
- package/lib/mcp/tools/testPlanTools.d.ts +1 -0
- package/lib/mcp/tools/testPlanTools.js +316 -59
- package/lib/mcp/tools/testPlanTools.js.map +1 -1
- package/lib/mcp/tools/testPlanValidate.js +114 -23
- package/lib/mcp/tools/testPlanValidate.js.map +1 -1
- package/lib/mcp/tools/testSuiteValidate.js +130 -15
- package/lib/mcp/tools/testSuiteValidate.js.map +1 -1
- package/lib/mcp/update/updateChecker.d.ts +14 -0
- package/lib/mcp/update/updateChecker.js +228 -0
- package/lib/mcp/update/updateChecker.js.map +1 -0
- 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/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/services/auth/credentials.d.ts +21 -0
- package/lib/services/auth/credentials.js +75 -0
- package/lib/services/auth/credentials.js.map +1 -0
- package/lib/services/auth/loginFlow.d.ts +68 -0
- package/lib/services/auth/loginFlow.js +216 -0
- package/lib/services/auth/loginFlow.js.map +1 -0
- package/lib/services/projectValidation.d.ts +5 -2
- package/lib/services/projectValidation.js +83 -31
- package/lib/services/projectValidation.js.map +1 -1
- package/lib/services/qualityHub/client.d.ts +161 -0
- package/lib/services/qualityHub/client.js +226 -0
- package/lib/services/qualityHub/client.js.map +1 -0
- package/messages/sf.provar.auth.clear.md +16 -0
- package/messages/sf.provar.auth.login.md +31 -0
- package/messages/sf.provar.auth.rotate.md +23 -0
- package/messages/sf.provar.auth.status.md +16 -0
- package/messages/sf.provar.mcp.start.md +83 -48
- package/oclif.manifest.json +325 -28
- package/package.json +35 -12
package/lib/mcp/tools/sfSpawn.js
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
* Licensed under the BSD 3-Clause license.
|
|
5
5
|
* For full license text, see LICENSE.md file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
6
6
|
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import os from 'node:os';
|
|
9
|
+
import path from 'node:path';
|
|
7
10
|
import { spawnSync as _spawnSync } from 'node:child_process';
|
|
8
11
|
/**
|
|
9
12
|
* Thin wrapper around spawnSync so tests can stub sfSpawnHelper.spawnSync.
|
|
@@ -15,21 +18,166 @@ export const sfSpawnHelper = {
|
|
|
15
18
|
// ── Shared error type ─────────────────────────────────────────────────────────
|
|
16
19
|
export class SfNotFoundError extends Error {
|
|
17
20
|
code = 'SF_NOT_FOUND';
|
|
18
|
-
constructor() {
|
|
19
|
-
|
|
21
|
+
constructor(sfPath) {
|
|
22
|
+
const where = sfPath ? `at explicit path "${sfPath}"` : 'in PATH or common npm/nvm/volta install locations';
|
|
23
|
+
super(`sf CLI not found ${where}. ` +
|
|
24
|
+
'Install Salesforce CLI (npm install -g @salesforce/cli) and ensure the install directory is in your PATH, ' +
|
|
25
|
+
'or pass sf_path pointing to the sf executable directly ' +
|
|
26
|
+
'(e.g. "~/.nvm/versions/node/v22.0.0/bin/sf").');
|
|
20
27
|
this.name = 'SfNotFoundError';
|
|
21
28
|
}
|
|
22
29
|
}
|
|
30
|
+
const MAX_BUFFER = 50 * 1024 * 1024; // 50 MB — prevents ENOBUFS on verbose Provar runs
|
|
31
|
+
// ── SF CLI discovery ──────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Returns candidate sf CLI paths in common install locations.
|
|
34
|
+
* Used as a fallback when `sf` is not in PATH.
|
|
35
|
+
*/
|
|
36
|
+
export function getSfCommonPaths() {
|
|
37
|
+
const home = os.homedir();
|
|
38
|
+
if (process.platform === 'win32') {
|
|
39
|
+
const appData = process.env['APPDATA'] ?? path.join(home, 'AppData', 'Roaming');
|
|
40
|
+
return [
|
|
41
|
+
path.join(appData, 'npm', 'sf.cmd'),
|
|
42
|
+
path.join('C:', 'Program Files', 'nodejs', 'sf.cmd'),
|
|
43
|
+
path.join('C:', 'Program Files (x86)', 'nodejs', 'sf.cmd'),
|
|
44
|
+
// Windows standalone installer (https://developer.salesforce.com/tools/salesforcecli)
|
|
45
|
+
path.join('C:', 'Program Files', 'sf', 'bin', 'sf.cmd'),
|
|
46
|
+
path.join('C:', 'Program Files', 'sf', 'client', 'bin', 'sf.cmd'),
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
const candidates = [
|
|
50
|
+
'/usr/local/bin/sf',
|
|
51
|
+
path.join(home, '.npm-global', 'bin', 'sf'),
|
|
52
|
+
path.join(home, '.local', 'bin', 'sf'),
|
|
53
|
+
path.join(home, '.volta', 'bin', 'sf'),
|
|
54
|
+
];
|
|
55
|
+
// nvm — scan the three most-recently installed Node versions
|
|
56
|
+
const nvmBinDir = path.join(process.env['NVM_DIR'] ?? path.join(home, '.nvm'), 'versions', 'node');
|
|
57
|
+
if (fs.existsSync(nvmBinDir)) {
|
|
58
|
+
try {
|
|
59
|
+
for (const v of fs.readdirSync(nvmBinDir).sort().reverse().slice(0, 3)) {
|
|
60
|
+
candidates.push(path.join(nvmBinDir, v, 'bin', 'sf'));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
/* skip */
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return candidates;
|
|
68
|
+
}
|
|
69
|
+
// Proactively resolve the sf executable path once on first use and cache it.
|
|
70
|
+
// This ensures sf is always found even when ENOENT is masked by other errors (e.g. ENOBUFS).
|
|
71
|
+
let cachedSfPath; // undefined = not yet probed
|
|
72
|
+
/**
|
|
73
|
+
* Exposed for testing only — pre-seeds the cached sf executable path, bypassing the probe spawn.
|
|
74
|
+
* Pass `undefined` to reset the cache so the next call triggers a fresh probe.
|
|
75
|
+
*/
|
|
76
|
+
export function setSfPathCacheForTesting(value) {
|
|
77
|
+
cachedSfPath = value;
|
|
78
|
+
}
|
|
79
|
+
// Platform override used in tests so Windows-specific shell logic can be exercised on any OS.
|
|
80
|
+
let sfPlatformOverride;
|
|
81
|
+
/** Exposed for testing only — overrides process.platform for needsWindowsShell decisions. */
|
|
82
|
+
export function setSfPlatformForTesting(platform) {
|
|
83
|
+
sfPlatformOverride = platform;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Returns true when spawning `executable` requires the Windows shell.
|
|
87
|
+
* On Windows, `.cmd` and `.bat` batch scripts cannot be executed directly by
|
|
88
|
+
* Node's spawnSync — they must be invoked through cmd.exe (i.e. shell: true).
|
|
89
|
+
* The bare name "sf" also needs this treatment on Windows because the file on
|
|
90
|
+
* disk is actually "sf.cmd" and Node won't auto-append the extension.
|
|
91
|
+
*/
|
|
92
|
+
export function needsWindowsShell(executable, platform = process.platform) {
|
|
93
|
+
if (platform !== 'win32')
|
|
94
|
+
return false;
|
|
95
|
+
const lower = executable.toLowerCase();
|
|
96
|
+
return lower.endsWith('.cmd') || lower.endsWith('.bat') || !path.extname(lower);
|
|
97
|
+
}
|
|
98
|
+
function resolveSfExecutable() {
|
|
99
|
+
if (cachedSfPath !== undefined)
|
|
100
|
+
return cachedSfPath;
|
|
101
|
+
const platform = sfPlatformOverride ?? process.platform;
|
|
102
|
+
// Two-phase probe avoids false-positives on Windows with shell:true.
|
|
103
|
+
// When shell:true is used, cmd.exe spawns successfully even when `sf` is
|
|
104
|
+
// missing — it exits non-zero with "not recognised" in stderr but sets no
|
|
105
|
+
// probe.error. Trying shell:false first catches both cases correctly.
|
|
106
|
+
//
|
|
107
|
+
// First attempt: shell:false (works on Linux/macOS; gives ENOENT on Windows if
|
|
108
|
+
// sf.cmd is on PATH but requires the shell).
|
|
109
|
+
const probe = sfSpawnHelper.spawnSync('sf', ['--version'], {
|
|
110
|
+
encoding: 'utf-8',
|
|
111
|
+
shell: false,
|
|
112
|
+
maxBuffer: 1024 * 1024,
|
|
113
|
+
});
|
|
114
|
+
if (!probe.error && probe.status === 0) {
|
|
115
|
+
cachedSfPath = 'sf';
|
|
116
|
+
return cachedSfPath;
|
|
117
|
+
}
|
|
118
|
+
// Windows fallback: retry with shell:true when the plain probe failed
|
|
119
|
+
// with ENOENT — meaning sf.cmd exists on PATH but can't run without the shell.
|
|
120
|
+
if (platform === 'win32' && probe.error?.code === 'ENOENT') {
|
|
121
|
+
const probeShell = sfSpawnHelper.spawnSync('sf', ['--version'], {
|
|
122
|
+
encoding: 'utf-8',
|
|
123
|
+
shell: true,
|
|
124
|
+
maxBuffer: 1024 * 1024,
|
|
125
|
+
});
|
|
126
|
+
if (!probeShell.error && probeShell.status === 0) {
|
|
127
|
+
cachedSfPath = 'sf';
|
|
128
|
+
return cachedSfPath;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Fall back to common install locations
|
|
132
|
+
for (const candidate of getSfCommonPaths()) {
|
|
133
|
+
if (fs.existsSync(candidate)) {
|
|
134
|
+
cachedSfPath = candidate;
|
|
135
|
+
return cachedSfPath;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
cachedSfPath = null;
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Reject shell metacharacters in an sf_path that will be executed via shell:true.
|
|
143
|
+
* On Windows, cmd.exe interprets & | ; < > ` ' " and newlines as shell syntax.
|
|
144
|
+
* A valid filesystem path should never contain these characters.
|
|
145
|
+
*/
|
|
146
|
+
function assertShellSafePath(sfPath) {
|
|
147
|
+
if (/[&|;<>`'"\n\r]/.test(sfPath)) {
|
|
148
|
+
throw Object.assign(new Error('sf_path contains characters that are unsafe for shell execution on Windows ' +
|
|
149
|
+
'(& | ; < > ` \' " or line-breaks). Provide an absolute filesystem path to the sf executable.'), { code: 'INVALID_SF_PATH' });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
23
152
|
/**
|
|
24
153
|
* Run `sf <args>` synchronously and return stdout, stderr, and exit code.
|
|
25
|
-
* Throws SfNotFoundError if the `sf` binary
|
|
154
|
+
* Throws SfNotFoundError if the `sf` binary cannot be found.
|
|
155
|
+
* Pass `sfPath` to override auto-discovery with an explicit executable path.
|
|
26
156
|
*/
|
|
27
|
-
export function runSfCommand(args) {
|
|
28
|
-
|
|
157
|
+
export function runSfCommand(args, sfPath) {
|
|
158
|
+
// Treat empty/whitespace sfPath as absent so auto-discovery runs instead of
|
|
159
|
+
// throwing SfNotFoundError with no useful path hint.
|
|
160
|
+
const trimmedSfPath = sfPath?.trim();
|
|
161
|
+
const resolvedSfPath = trimmedSfPath !== '' ? trimmedSfPath : undefined;
|
|
162
|
+
const executable = resolvedSfPath ?? resolveSfExecutable();
|
|
163
|
+
if (!executable)
|
|
164
|
+
throw new SfNotFoundError();
|
|
165
|
+
const platform = sfPlatformOverride ?? process.platform;
|
|
166
|
+
const useShell = needsWindowsShell(executable, platform);
|
|
167
|
+
// Guard against injection when shell:true is used with a user-supplied path.
|
|
168
|
+
// Common install locations returned by resolveSfExecutable() are safe by construction.
|
|
169
|
+
if (useShell && resolvedSfPath) {
|
|
170
|
+
assertShellSafePath(resolvedSfPath);
|
|
171
|
+
}
|
|
172
|
+
const result = sfSpawnHelper.spawnSync(executable, args, {
|
|
173
|
+
encoding: 'utf-8',
|
|
174
|
+
shell: useShell,
|
|
175
|
+
maxBuffer: MAX_BUFFER,
|
|
176
|
+
});
|
|
29
177
|
if (result.error) {
|
|
30
178
|
const err = result.error;
|
|
31
179
|
if (err.code === 'ENOENT') {
|
|
32
|
-
throw new SfNotFoundError();
|
|
180
|
+
throw new SfNotFoundError(resolvedSfPath);
|
|
33
181
|
}
|
|
34
182
|
throw result.error;
|
|
35
183
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sfSpawn.js","sourceRoot":"","sources":["../../../src/mcp/tools/sfSpawn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,UAAU;CACtB,CAAC;AAEF,iFAAiF;AAEjF,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,IAAI,GAAG,cAAc,CAAC;IACtC;
|
|
1
|
+
{"version":3,"file":"sfSpawn.js","sourceRoot":"","sources":["../../../src/mcp/tools/sfSpawn.ts"],"names":[],"mappings":"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"}
|