@provartesting/provardx-cli 1.4.6 → 1.5.0-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +292 -8
  2. package/lib/commands/provar/automation/config/validate.js.map +1 -1
  3. package/lib/commands/provar/automation/project/validate.d.ts +14 -0
  4. package/lib/commands/provar/automation/project/validate.js +69 -0
  5. package/lib/commands/provar/automation/project/validate.js.map +1 -0
  6. package/lib/commands/provar/mcp/start.d.ts +16 -0
  7. package/lib/commands/provar/mcp/start.js +62 -0
  8. package/lib/commands/provar/mcp/start.js.map +1 -0
  9. package/lib/commands/provar/quality-hub/connect.d.ts +5 -0
  10. package/lib/commands/provar/quality-hub/connect.js +12 -0
  11. package/lib/commands/provar/quality-hub/connect.js.map +1 -0
  12. package/lib/commands/provar/quality-hub/display.d.ts +5 -0
  13. package/lib/commands/provar/quality-hub/display.js +12 -0
  14. package/lib/commands/provar/quality-hub/display.js.map +1 -0
  15. package/lib/commands/provar/quality-hub/open.d.ts +5 -0
  16. package/lib/commands/provar/quality-hub/open.js +12 -0
  17. package/lib/commands/provar/quality-hub/open.js.map +1 -0
  18. package/lib/commands/provar/quality-hub/test/run/abort.d.ts +5 -0
  19. package/lib/commands/provar/quality-hub/test/run/abort.js +12 -0
  20. package/lib/commands/provar/quality-hub/test/run/abort.js.map +1 -0
  21. package/lib/commands/provar/quality-hub/test/run/report.d.ts +5 -0
  22. package/lib/commands/provar/quality-hub/test/run/report.js +12 -0
  23. package/lib/commands/provar/quality-hub/test/run/report.js.map +1 -0
  24. package/lib/commands/provar/quality-hub/test/run.d.ts +5 -0
  25. package/lib/commands/provar/quality-hub/test/run.js +12 -0
  26. package/lib/commands/provar/quality-hub/test/run.js.map +1 -0
  27. package/lib/commands/provar/quality-hub/testcase/retrieve.d.ts +5 -0
  28. package/lib/commands/provar/quality-hub/testcase/retrieve.js +12 -0
  29. package/lib/commands/provar/quality-hub/testcase/retrieve.js.map +1 -0
  30. package/lib/mcp/licensing/algasClient.d.ts +19 -0
  31. package/lib/mcp/licensing/algasClient.js +144 -0
  32. package/lib/mcp/licensing/algasClient.js.map +1 -0
  33. package/lib/mcp/licensing/ideDetection.d.ts +34 -0
  34. package/lib/mcp/licensing/ideDetection.js +179 -0
  35. package/lib/mcp/licensing/ideDetection.js.map +1 -0
  36. package/lib/mcp/licensing/index.d.ts +5 -0
  37. package/lib/mcp/licensing/index.js +10 -0
  38. package/lib/mcp/licensing/index.js.map +1 -0
  39. package/lib/mcp/licensing/licenseCache.d.ts +20 -0
  40. package/lib/mcp/licensing/licenseCache.js +79 -0
  41. package/lib/mcp/licensing/licenseCache.js.map +1 -0
  42. package/lib/mcp/licensing/licenseError.d.ts +4 -0
  43. package/lib/mcp/licensing/licenseError.js +15 -0
  44. package/lib/mcp/licensing/licenseError.js.map +1 -0
  45. package/lib/mcp/licensing/licenseValidator.d.ts +33 -0
  46. package/lib/mcp/licensing/licenseValidator.js +103 -0
  47. package/lib/mcp/licensing/licenseValidator.js.map +1 -0
  48. package/lib/mcp/logging/logger.d.ts +7 -0
  49. package/lib/mcp/logging/logger.js +22 -0
  50. package/lib/mcp/logging/logger.js.map +1 -0
  51. package/lib/mcp/rules/page_object_validation_rules.json +344 -0
  52. package/lib/mcp/rules/provar_best_practices_rules.json +3192 -0
  53. package/lib/mcp/schemas/common.d.ts +20 -0
  54. package/lib/mcp/schemas/common.js +16 -0
  55. package/lib/mcp/schemas/common.js.map +1 -0
  56. package/lib/mcp/security/pathPolicy.d.ts +14 -0
  57. package/lib/mcp/security/pathPolicy.js +38 -0
  58. package/lib/mcp/security/pathPolicy.js.map +1 -0
  59. package/lib/mcp/server.d.ts +5 -0
  60. package/lib/mcp/server.js +59 -0
  61. package/lib/mcp/server.js.map +1 -0
  62. package/lib/mcp/tools/antTools.d.ts +21 -0
  63. package/lib/mcp/tools/antTools.js +602 -0
  64. package/lib/mcp/tools/antTools.js.map +1 -0
  65. package/lib/mcp/tools/automationTools.d.ts +14 -0
  66. package/lib/mcp/tools/automationTools.js +386 -0
  67. package/lib/mcp/tools/automationTools.js.map +1 -0
  68. package/lib/mcp/tools/bestPracticesEngine.d.ts +30 -0
  69. package/lib/mcp/tools/bestPracticesEngine.js +632 -0
  70. package/lib/mcp/tools/bestPracticesEngine.js.map +1 -0
  71. package/lib/mcp/tools/defectTools.d.ts +15 -0
  72. package/lib/mcp/tools/defectTools.js +199 -0
  73. package/lib/mcp/tools/defectTools.js.map +1 -0
  74. package/lib/mcp/tools/hierarchyValidate.d.ts +139 -0
  75. package/lib/mcp/tools/hierarchyValidate.js +540 -0
  76. package/lib/mcp/tools/hierarchyValidate.js.map +1 -0
  77. package/lib/mcp/tools/pageObjectGenerate.d.ts +3 -0
  78. package/lib/mcp/tools/pageObjectGenerate.js +153 -0
  79. package/lib/mcp/tools/pageObjectGenerate.js.map +1 -0
  80. package/lib/mcp/tools/pageObjectValidate.d.ts +18 -0
  81. package/lib/mcp/tools/pageObjectValidate.js +420 -0
  82. package/lib/mcp/tools/pageObjectValidate.js.map +1 -0
  83. package/lib/mcp/tools/projectInspect.d.ts +3 -0
  84. package/lib/mcp/tools/projectInspect.js +694 -0
  85. package/lib/mcp/tools/projectInspect.js.map +1 -0
  86. package/lib/mcp/tools/projectValidateFromPath.d.ts +3 -0
  87. package/lib/mcp/tools/projectValidateFromPath.js +153 -0
  88. package/lib/mcp/tools/projectValidateFromPath.js.map +1 -0
  89. package/lib/mcp/tools/propertiesTools.d.ts +7 -0
  90. package/lib/mcp/tools/propertiesTools.js +314 -0
  91. package/lib/mcp/tools/propertiesTools.js.map +1 -0
  92. package/lib/mcp/tools/qualityHubTools.d.ts +8 -0
  93. package/lib/mcp/tools/qualityHubTools.js +178 -0
  94. package/lib/mcp/tools/qualityHubTools.js.map +1 -0
  95. package/lib/mcp/tools/rcaTools.d.ts +4 -0
  96. package/lib/mcp/tools/rcaTools.js +620 -0
  97. package/lib/mcp/tools/rcaTools.js.map +1 -0
  98. package/lib/mcp/tools/sfSpawn.d.ts +28 -0
  99. package/lib/mcp/tools/sfSpawn.js +50 -0
  100. package/lib/mcp/tools/sfSpawn.js.map +1 -0
  101. package/lib/mcp/tools/testCaseGenerate.d.ts +3 -0
  102. package/lib/mcp/tools/testCaseGenerate.js +221 -0
  103. package/lib/mcp/tools/testCaseGenerate.js.map +1 -0
  104. package/lib/mcp/tools/testCaseValidate.d.ts +20 -0
  105. package/lib/mcp/tools/testCaseValidate.js +227 -0
  106. package/lib/mcp/tools/testCaseValidate.js.map +1 -0
  107. package/lib/mcp/tools/testPlanTools.d.ts +6 -0
  108. package/lib/mcp/tools/testPlanTools.js +311 -0
  109. package/lib/mcp/tools/testPlanTools.js.map +1 -0
  110. package/lib/mcp/tools/testPlanValidate.d.ts +2 -0
  111. package/lib/mcp/tools/testPlanValidate.js +75 -0
  112. package/lib/mcp/tools/testPlanValidate.js.map +1 -0
  113. package/lib/mcp/tools/testSuiteValidate.d.ts +2 -0
  114. package/lib/mcp/tools/testSuiteValidate.js +63 -0
  115. package/lib/mcp/tools/testSuiteValidate.js.map +1 -0
  116. package/lib/services/projectValidation.d.ts +119 -0
  117. package/lib/services/projectValidation.js +678 -0
  118. package/lib/services/projectValidation.js.map +1 -0
  119. package/messages/sf.provar.automation.project.validate.md +52 -0
  120. package/messages/sf.provar.mcp.start.md +74 -0
  121. package/oclif.manifest.json +1298 -1
  122. package/package.json +29 -15
@@ -0,0 +1,14 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Returns candidate sf CLI paths in common npm/nvm/volta install locations.
4
+ * Used as a fallback when `sf` is not in PATH.
5
+ */
6
+ export declare function getSfCommonPaths(): string[];
7
+ /** Exposed for testing only — pre-seeds the cached sf executable path, bypassing the probe spawn. */
8
+ export declare function setSfPathCacheForTesting(value: string | null): void;
9
+ export declare function registerAutomationConfigLoad(server: McpServer): void;
10
+ export declare function registerAutomationTestRun(server: McpServer): void;
11
+ export declare function registerAutomationCompile(server: McpServer): void;
12
+ export declare function registerAutomationMetadataDownload(server: McpServer): void;
13
+ export declare function registerAutomationSetup(server: McpServer): void;
14
+ export declare function registerAllAutomationTools(server: McpServer): void;
@@ -0,0 +1,386 @@
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 { makeError, makeRequestId } from '../schemas/common.js';
13
+ import { log } from '../logging/logger.js';
14
+ import { sfSpawnHelper } from './sfSpawn.js';
15
+ // ── SF CLI discovery ──────────────────────────────────────────────────────────
16
+ /**
17
+ * Returns candidate sf CLI paths in common npm/nvm/volta install locations.
18
+ * Used as a fallback when `sf` is not in PATH.
19
+ */
20
+ export function getSfCommonPaths() {
21
+ const home = os.homedir();
22
+ if (process.platform === 'win32') {
23
+ const appData = process.env['APPDATA'] ?? path.join(home, 'AppData', 'Roaming');
24
+ return [
25
+ path.join(appData, 'npm', 'sf.cmd'),
26
+ path.join('C:', 'Program Files', 'nodejs', 'sf.cmd'),
27
+ path.join('C:', 'Program Files (x86)', 'nodejs', 'sf.cmd'),
28
+ ];
29
+ }
30
+ const candidates = [
31
+ '/usr/local/bin/sf',
32
+ path.join(home, '.npm-global', 'bin', 'sf'),
33
+ path.join(home, '.local', 'bin', 'sf'),
34
+ path.join(home, '.volta', 'bin', 'sf'),
35
+ ];
36
+ // nvm — scan the three most-recently installed Node versions
37
+ const nvmBinDir = path.join(process.env['NVM_DIR'] ?? path.join(home, '.nvm'), 'versions', 'node');
38
+ if (fs.existsSync(nvmBinDir)) {
39
+ try {
40
+ for (const v of fs.readdirSync(nvmBinDir).sort().reverse().slice(0, 3)) {
41
+ candidates.push(path.join(nvmBinDir, v, 'bin', 'sf'));
42
+ }
43
+ }
44
+ catch { /* skip */ }
45
+ }
46
+ return candidates;
47
+ }
48
+ // ── Shared spawn helper ───────────────────────────────────────────────────────
49
+ const MAX_BUFFER = 50 * 1024 * 1024; // 50 MB — prevents ENOBUFS on verbose Provar runs
50
+ // Proactively resolve the sf executable path once on first use and cache it.
51
+ // This ensures sf is always found even when ENOENT is masked by other errors (e.g. ENOBUFS).
52
+ let cachedSfPath; // undefined = not yet probed
53
+ /** Exposed for testing only — pre-seeds the cached sf executable path, bypassing the probe spawn. */
54
+ export function setSfPathCacheForTesting(value) {
55
+ cachedSfPath = value;
56
+ }
57
+ function resolveSfExecutable() {
58
+ if (cachedSfPath !== undefined)
59
+ return cachedSfPath;
60
+ // Check PATH first via a cheap version probe
61
+ const probe = sfSpawnHelper.spawnSync('sf', ['--version'], { encoding: 'utf-8', shell: false, maxBuffer: 1024 * 1024 });
62
+ if (!probe.error) {
63
+ cachedSfPath = 'sf';
64
+ return cachedSfPath;
65
+ }
66
+ // Fall back to common install locations
67
+ for (const candidate of getSfCommonPaths()) {
68
+ if (fs.existsSync(candidate)) {
69
+ cachedSfPath = candidate;
70
+ return cachedSfPath;
71
+ }
72
+ }
73
+ cachedSfPath = null;
74
+ return null;
75
+ }
76
+ class SfNotFoundError extends Error {
77
+ code = 'SF_NOT_FOUND';
78
+ constructor(sfPath) {
79
+ const where = sfPath
80
+ ? `at explicit path "${sfPath}"`
81
+ : 'in PATH or common npm/nvm install locations';
82
+ super(`sf CLI not found ${where}. ` +
83
+ 'Install Salesforce CLI (npm install -g @salesforce/cli) and ensure the install directory is in your PATH, ' +
84
+ 'or pass sf_path pointing to the sf executable directly ' +
85
+ '(e.g. "~/.nvm/versions/node/v22.0.0/bin/sf").');
86
+ }
87
+ }
88
+ function runSfCommand(args, sfPath) {
89
+ // Use explicit path if provided; otherwise use cached probe result
90
+ const executable = sfPath ?? resolveSfExecutable();
91
+ if (!executable)
92
+ throw new SfNotFoundError();
93
+ const result = sfSpawnHelper.spawnSync(executable, args, { encoding: 'utf-8', shell: false, maxBuffer: MAX_BUFFER });
94
+ if (result.error) {
95
+ const err = result.error;
96
+ if (err.code === 'ENOENT') {
97
+ throw new SfNotFoundError(sfPath);
98
+ }
99
+ throw result.error;
100
+ }
101
+ return {
102
+ stdout: result.stdout ?? '',
103
+ stderr: result.stderr ?? '',
104
+ exitCode: result.status ?? 1,
105
+ };
106
+ }
107
+ function handleSpawnError(err, requestId, toolName) {
108
+ const error = err;
109
+ log('error', `${toolName} failed`, { requestId, error: error.message });
110
+ return {
111
+ isError: true,
112
+ content: [{ type: 'text', text: JSON.stringify(makeError(error.code ?? 'SF_ERROR', error.message, requestId, false)) }],
113
+ };
114
+ }
115
+ // ── Tool: provar.automation.config.load ──────────────────────────────────────
116
+ export function registerAutomationConfigLoad(server) {
117
+ server.tool('provar.automation.config.load', [
118
+ 'Register a provardx-properties.json file as the active Provar configuration.',
119
+ 'Invokes `sf provar automation config load --properties-file <path>`, writing the path to ~/.sf/config.json.',
120
+ 'REQUIRED before provar.automation.compile or provar.automation.testrun — without this step those commands fail with MISSING_FILE.',
121
+ 'Typical workflow: provar.automation.config.load → provar.automation.compile → provar.automation.testrun.',
122
+ ].join(' '), {
123
+ properties_path: z.string().describe('Absolute path to the provardx-properties.json file to register as active configuration'),
124
+ sf_path: z.string().optional().describe('Path to the sf CLI executable when not in PATH (e.g. "~/.nvm/versions/node/v22.0.0/bin/sf")'),
125
+ }, ({ properties_path, sf_path }) => {
126
+ const requestId = makeRequestId();
127
+ log('info', 'provar.automation.config.load', { requestId, properties_path });
128
+ try {
129
+ const result = runSfCommand(['provar', 'automation', 'config', 'load', '--properties-file', properties_path], sf_path);
130
+ const response = { requestId, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr, properties_path };
131
+ if (result.exitCode !== 0) {
132
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(makeError('AUTOMATION_CONFIG_LOAD_FAILED', result.stderr || result.stdout, requestId)) }] };
133
+ }
134
+ return { content: [{ type: 'text', text: JSON.stringify(response) }], structuredContent: response };
135
+ }
136
+ catch (err) {
137
+ return handleSpawnError(err, requestId, 'provar.automation.config.load');
138
+ }
139
+ });
140
+ }
141
+ // ── Tool: provar.automation.testrun ───────────────────────────────────────────
142
+ export function registerAutomationTestRun(server) {
143
+ server.tool('provar.automation.testrun', [
144
+ 'Trigger a LOCAL Provar automation test run using installed Provar binaries. Invokes `sf provar automation test run`.',
145
+ 'PREREQUISITE: Run provar.automation.config.load first to register a provardx-properties.json — without this the command fails with MISSING_FILE.',
146
+ 'Requires Provar to be installed locally and provarHome set correctly in the properties file.',
147
+ 'Use provar.automation.setup first if Provar is not yet installed.',
148
+ 'For grid/CI execution via Provar Quality Hub instead of running locally, use provar.qualityhub.testrun.',
149
+ 'Typical local AI loop: config.load → compile → testrun → inspect results.',
150
+ ].join(' '), {
151
+ flags: z.array(z.string()).optional().default([]).describe('Raw CLI flags to forward (e.g. ["--project-path", "/path/to/project"])'),
152
+ sf_path: z.string().optional().describe('Path to the sf CLI executable when not in PATH (e.g. "~/.nvm/versions/node/v22.0.0/bin/sf")'),
153
+ }, ({ flags, sf_path }) => {
154
+ const requestId = makeRequestId();
155
+ log('info', 'provar.automation.testrun', { requestId });
156
+ try {
157
+ const result = runSfCommand(['provar', 'automation', 'test', 'run', ...flags], sf_path);
158
+ const response = { requestId, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr };
159
+ if (result.exitCode !== 0) {
160
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(makeError('AUTOMATION_TESTRUN_FAILED', result.stderr || result.stdout, requestId)) }] };
161
+ }
162
+ return { content: [{ type: 'text', text: JSON.stringify(response) }], structuredContent: response };
163
+ }
164
+ catch (err) {
165
+ return handleSpawnError(err, requestId, 'provar.automation.testrun');
166
+ }
167
+ });
168
+ }
169
+ // ── Tool: provar.automation.compile ───────────────────────────────────────────
170
+ export function registerAutomationCompile(server) {
171
+ server.tool('provar.automation.compile', [
172
+ 'Compile a Provar automation project. Invokes `sf provar automation project compile`.',
173
+ 'PREREQUISITE: Run provar.automation.config.load first to register a provardx-properties.json — without this the command fails with MISSING_FILE.',
174
+ 'Run this before triggering a test run after modifying test cases.',
175
+ ].join(' '), {
176
+ flags: z.array(z.string()).optional().default([]).describe('Raw CLI flags to forward (e.g. ["--project-path", "/path/to/project"])'),
177
+ sf_path: z.string().optional().describe('Path to the sf CLI executable when not in PATH (e.g. "~/.nvm/versions/node/v22.0.0/bin/sf")'),
178
+ }, ({ flags, sf_path }) => {
179
+ const requestId = makeRequestId();
180
+ log('info', 'provar.automation.compile', { requestId });
181
+ try {
182
+ const result = runSfCommand(['provar', 'automation', 'project', 'compile', ...flags], sf_path);
183
+ const response = { requestId, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr };
184
+ if (result.exitCode !== 0) {
185
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(makeError('AUTOMATION_COMPILE_FAILED', result.stderr || result.stdout, requestId)) }] };
186
+ }
187
+ return { content: [{ type: 'text', text: JSON.stringify(response) }], structuredContent: response };
188
+ }
189
+ catch (err) {
190
+ return handleSpawnError(err, requestId, 'provar.automation.compile');
191
+ }
192
+ });
193
+ }
194
+ // ── Tool: provar.automation.metadata.download ─────────────────────────────────
195
+ export function registerAutomationMetadataDownload(server) {
196
+ server.tool('provar.automation.metadata.download', 'Download Salesforce metadata into a Provar project. Invokes `sf provar automation metadata download`.', {
197
+ flags: z.array(z.string()).optional().default([]).describe('Raw CLI flags to forward (e.g. ["--target-org", "myorg"])'),
198
+ sf_path: z.string().optional().describe('Path to the sf CLI executable when not in PATH (e.g. "~/.nvm/versions/node/v22.0.0/bin/sf")'),
199
+ }, ({ flags, sf_path }) => {
200
+ const requestId = makeRequestId();
201
+ log('info', 'provar.automation.metadata.download', { requestId });
202
+ try {
203
+ const result = runSfCommand(['provar', 'automation', 'metadata', 'download', ...flags], sf_path);
204
+ const response = { requestId, exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr };
205
+ if (result.exitCode !== 0) {
206
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(makeError('AUTOMATION_METADATA_FAILED', result.stderr || result.stdout, requestId)) }] };
207
+ }
208
+ return { content: [{ type: 'text', text: JSON.stringify(response) }], structuredContent: response };
209
+ }
210
+ catch (err) {
211
+ return handleSpawnError(err, requestId, 'provar.automation.metadata.download');
212
+ }
213
+ });
214
+ }
215
+ // ── Tool: provar.automation.setup ─────────────────────────────────────────────
216
+ /** Known system-level Provar install paths per platform. */
217
+ const SYSTEM_INSTALL_BASES = {
218
+ win32: [
219
+ 'C:/Program Files',
220
+ 'C:/Program Files (x86)',
221
+ ],
222
+ darwin: [
223
+ '/Applications',
224
+ ],
225
+ linux: [
226
+ '/opt',
227
+ '/usr/local',
228
+ ],
229
+ };
230
+ /** Try to read a Provar version string from well-known files inside an install dir. */
231
+ function readProvarVersion(installPath) {
232
+ for (const candidate of ['version.txt', 'VERSION', 'provardx/version.txt', 'lib/version.txt']) {
233
+ try {
234
+ const content = fs.readFileSync(path.join(installPath, candidate), 'utf-8').trim();
235
+ if (content)
236
+ return content;
237
+ }
238
+ catch {
239
+ // try next candidate
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ /** Return true if the directory looks like a valid Provar installation (has provardx.jar). */
245
+ function isValidProvarHome(dir) {
246
+ return fs.existsSync(path.join(dir, 'provardx', 'provardx.jar'));
247
+ }
248
+ /**
249
+ * Scan common install locations and return every Provar installation found on this machine.
250
+ * Checks (in order): PROVAR_HOME env var, ./ProvarHome (CLI-installed), platform system dirs.
251
+ */
252
+ function findExistingInstallations() {
253
+ const found = [];
254
+ const seen = new Set();
255
+ function addIfValid(installPath, source) {
256
+ const resolved = path.resolve(installPath);
257
+ if (seen.has(resolved))
258
+ return;
259
+ if (!fs.existsSync(resolved))
260
+ return;
261
+ if (isValidProvarHome(resolved)) {
262
+ seen.add(resolved);
263
+ found.push({ path: resolved, version: readProvarVersion(resolved), source });
264
+ }
265
+ }
266
+ // 1. PROVAR_HOME environment variable
267
+ const envHome = process.env['PROVAR_HOME'];
268
+ if (envHome)
269
+ addIfValid(envHome, 'env');
270
+ // 2. ./ProvarHome — where `sf provar automation setup` installs by default
271
+ addIfValid(path.join(process.cwd(), 'ProvarHome'), 'local');
272
+ // 3. Platform-specific system install dirs — scan for any Provar* subdirectory
273
+ const bases = SYSTEM_INSTALL_BASES[process.platform] ?? [];
274
+ for (const base of bases) {
275
+ if (!fs.existsSync(base))
276
+ continue;
277
+ let entries;
278
+ try {
279
+ entries = fs.readdirSync(base);
280
+ }
281
+ catch {
282
+ continue;
283
+ }
284
+ for (const entry of entries) {
285
+ if (entry.toLowerCase().startsWith('provar')) {
286
+ const fullPath = path.join(base, entry);
287
+ // For macOS .app bundles the resources sit inside Contents/Resources
288
+ const candidates = [
289
+ fullPath,
290
+ path.join(fullPath, 'Contents', 'Resources'),
291
+ path.join(fullPath, 'Contents', 'Resources', 'ProvarHome'),
292
+ ];
293
+ for (const candidate of candidates) {
294
+ addIfValid(candidate, 'system');
295
+ }
296
+ }
297
+ }
298
+ }
299
+ return found;
300
+ }
301
+ export function registerAutomationSetup(server) {
302
+ server.tool('provar.automation.setup', [
303
+ 'Download and install Provar Automation binaries locally. Invokes `sf provar automation setup`.',
304
+ 'Before downloading, checks for existing Provar installations in:',
305
+ ' • PROVAR_HOME environment variable',
306
+ ' • ./ProvarHome (default CLI install location)',
307
+ ' • C:\\Program Files\\Provar* (Windows system installs)',
308
+ ' • /Applications/Provar* (macOS app installs)',
309
+ 'If an existing installation is found, returns its path so you can set provarHome in the properties file — skipping the download unless force is true.',
310
+ 'After a successful install, update the provarHome property in provardx-properties.json to the returned install_path using provar.properties.set.',
311
+ ].join(' '), {
312
+ version: z.string().optional().describe('Specific Provar Automation version to install, e.g. "2.12.0". Omit to install the latest release.'),
313
+ force: z.boolean().optional().default(false).describe('Force a fresh download even if an existing installation is already detected (default: false).'),
314
+ sf_path: z.string().optional().describe('Path to the sf CLI executable when not in PATH (e.g. "~/.nvm/versions/node/v22.0.0/bin/sf")'),
315
+ }, ({ version, force, sf_path }) => {
316
+ const requestId = makeRequestId();
317
+ log('info', 'provar.automation.setup', { requestId, version, force });
318
+ try {
319
+ // ── 1. Check for existing installations ──────────────────────────────
320
+ const existing = findExistingInstallations();
321
+ if (existing.length > 0 && !force) {
322
+ const primary = existing[0];
323
+ const response = {
324
+ requestId,
325
+ already_installed: true,
326
+ installations: existing,
327
+ install_path: primary.path,
328
+ version: primary.version,
329
+ message: [
330
+ `Found ${existing.length} existing Provar installation(s). Skipped download.`,
331
+ `Set provarHome to "${primary.path}" in your provardx-properties.json,`,
332
+ 'or pass force: true to download and overwrite with a fresh copy.',
333
+ ].join(' '),
334
+ };
335
+ return {
336
+ content: [{ type: 'text', text: JSON.stringify(response) }],
337
+ structuredContent: response,
338
+ };
339
+ }
340
+ // ── 2. Run sf provar automation setup ────────────────────────────────
341
+ const flags = version ? ['--version', version] : [];
342
+ const result = runSfCommand(['provar', 'automation', 'setup', ...flags], sf_path);
343
+ if (result.exitCode !== 0) {
344
+ return {
345
+ isError: true,
346
+ content: [{ type: 'text', text: JSON.stringify(makeError('AUTOMATION_SETUP_FAILED', result.stderr || result.stdout, requestId)) }],
347
+ };
348
+ }
349
+ // ── 3. Locate the freshly installed ProvarHome ───────────────────────
350
+ const freshInstalls = findExistingInstallations();
351
+ const localInstall = freshInstalls.find(i => i.source === 'local') ?? freshInstalls[0];
352
+ const installPath = localInstall?.path ?? path.resolve(process.cwd(), 'ProvarHome');
353
+ const detectedVersion = localInstall?.version ?? version ?? null;
354
+ const response = {
355
+ requestId,
356
+ already_installed: false,
357
+ forced: force,
358
+ exitCode: result.exitCode,
359
+ stdout: result.stdout,
360
+ stderr: result.stderr,
361
+ install_path: installPath,
362
+ version: detectedVersion,
363
+ message: [
364
+ `Provar Automation installed successfully at: ${installPath}.`,
365
+ 'Update provarHome in your provardx-properties.json to this path using provar.properties.set.',
366
+ ].join(' '),
367
+ };
368
+ return {
369
+ content: [{ type: 'text', text: JSON.stringify(response) }],
370
+ structuredContent: response,
371
+ };
372
+ }
373
+ catch (err) {
374
+ return handleSpawnError(err, requestId, 'provar.automation.setup');
375
+ }
376
+ });
377
+ }
378
+ // ── Bulk registration ─────────────────────────────────────────────────────────
379
+ export function registerAllAutomationTools(server) {
380
+ registerAutomationSetup(server);
381
+ registerAutomationConfigLoad(server);
382
+ registerAutomationTestRun(server);
383
+ registerAutomationCompile(server);
384
+ registerAutomationMetadataDownload(server);
385
+ }
386
+ //# sourceMappingURL=automationTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automationTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/automationTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface BPViolation {
2
+ rule_id: string;
3
+ name: string;
4
+ description: string;
5
+ category: string;
6
+ severity: 'critical' | 'major' | 'minor' | 'info';
7
+ weight: number;
8
+ message: string;
9
+ recommendation: string;
10
+ applies_to: string[];
11
+ count?: number;
12
+ }
13
+ export interface BPEngineResult {
14
+ quality_score: number;
15
+ violations: BPViolation[];
16
+ rules_evaluated: number;
17
+ }
18
+ export interface BPMetadata {
19
+ testName?: string;
20
+ filePath?: string;
21
+ }
22
+ export declare function calculateBPScore(violations: BPViolation[]): number;
23
+ /**
24
+ * Run all active best-practice rules against a single test case XML string.
25
+ *
26
+ * @param xmlContent Raw XML of the test case file.
27
+ * @param metadata Optional context (testName used for regex rules).
28
+ * @returns Quality score (0–100) + list of violations.
29
+ */
30
+ export declare function runBestPractices(xmlContent: string, metadata?: BPMetadata): BPEngineResult;