@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.
Files changed (147) hide show
  1. package/README.md +163 -12
  2. package/bin/mcp-start.js +74 -0
  3. package/lib/commands/provar/auth/clear.d.ts +7 -0
  4. package/lib/commands/provar/auth/clear.js +36 -0
  5. package/lib/commands/provar/auth/clear.js.map +1 -0
  6. package/lib/commands/provar/auth/login.d.ts +10 -0
  7. package/lib/commands/provar/auth/login.js +90 -0
  8. package/lib/commands/provar/auth/login.js.map +1 -0
  9. package/lib/commands/provar/auth/rotate.d.ts +7 -0
  10. package/lib/commands/provar/auth/rotate.js +42 -0
  11. package/lib/commands/provar/auth/rotate.js.map +1 -0
  12. package/lib/commands/provar/auth/status.d.ts +7 -0
  13. package/lib/commands/provar/auth/status.js +107 -0
  14. package/lib/commands/provar/auth/status.js.map +1 -0
  15. package/lib/commands/provar/mcp/start.d.ts +2 -0
  16. package/lib/commands/provar/mcp/start.js +14 -1
  17. package/lib/commands/provar/mcp/start.js.map +1 -1
  18. package/lib/mcp/docs/NITROX_CATALOG_SOURCE.json +6 -0
  19. package/lib/mcp/docs/NITROX_COMPONENT_CATALOG.md +2001 -0
  20. package/lib/mcp/docs/PROVAR_TEST_STEP_REFERENCE.md +1430 -0
  21. package/lib/mcp/docs/PROVAR_TOOL_GUIDE.md +187 -0
  22. package/lib/mcp/licensing/algasClient.js +14 -5
  23. package/lib/mcp/licensing/algasClient.js.map +1 -1
  24. package/lib/mcp/licensing/ideDetection.d.ts +0 -12
  25. package/lib/mcp/licensing/ideDetection.js +1 -73
  26. package/lib/mcp/licensing/ideDetection.js.map +1 -1
  27. package/lib/mcp/licensing/licenseCache.js +7 -1
  28. package/lib/mcp/licensing/licenseCache.js.map +1 -1
  29. package/lib/mcp/licensing/licenseValidator.d.ts +3 -3
  30. package/lib/mcp/licensing/licenseValidator.js +11 -4
  31. package/lib/mcp/licensing/licenseValidator.js.map +1 -1
  32. package/lib/mcp/prompts/guidePrompts.d.ts +4 -0
  33. package/lib/mcp/prompts/guidePrompts.js +334 -0
  34. package/lib/mcp/prompts/guidePrompts.js.map +1 -0
  35. package/lib/mcp/prompts/index.d.ts +2 -0
  36. package/lib/mcp/prompts/index.js +23 -0
  37. package/lib/mcp/prompts/index.js.map +1 -0
  38. package/lib/mcp/prompts/loopPrompts.d.ts +6 -0
  39. package/lib/mcp/prompts/loopPrompts.js +435 -0
  40. package/lib/mcp/prompts/loopPrompts.js.map +1 -0
  41. package/lib/mcp/prompts/migrationPrompts.d.ts +4 -0
  42. package/lib/mcp/prompts/migrationPrompts.js +207 -0
  43. package/lib/mcp/prompts/migrationPrompts.js.map +1 -0
  44. package/lib/mcp/rules/provar_best_practices_rules.json +256 -544
  45. package/lib/mcp/security/pathPolicy.d.ts +5 -0
  46. package/lib/mcp/security/pathPolicy.js +58 -3
  47. package/lib/mcp/security/pathPolicy.js.map +1 -1
  48. package/lib/mcp/server.d.ts +18 -0
  49. package/lib/mcp/server.js +232 -19
  50. package/lib/mcp/server.js.map +1 -1
  51. package/lib/mcp/tools/antTools.d.ts +15 -0
  52. package/lib/mcp/tools/antTools.js +369 -170
  53. package/lib/mcp/tools/antTools.js.map +1 -1
  54. package/lib/mcp/tools/automationTools.d.ts +18 -8
  55. package/lib/mcp/tools/automationTools.js +333 -176
  56. package/lib/mcp/tools/automationTools.js.map +1 -1
  57. package/lib/mcp/tools/bestPracticesEngine.js +161 -23
  58. package/lib/mcp/tools/bestPracticesEngine.js.map +1 -1
  59. package/lib/mcp/tools/connectionTools.d.ts +4 -0
  60. package/lib/mcp/tools/connectionTools.js +242 -0
  61. package/lib/mcp/tools/connectionTools.js.map +1 -0
  62. package/lib/mcp/tools/defectTools.d.ts +1 -1
  63. package/lib/mcp/tools/defectTools.js +61 -50
  64. package/lib/mcp/tools/defectTools.js.map +1 -1
  65. package/lib/mcp/tools/descHelper.d.ts +5 -0
  66. package/lib/mcp/tools/descHelper.js +14 -0
  67. package/lib/mcp/tools/descHelper.js.map +1 -0
  68. package/lib/mcp/tools/hierarchyValidate.d.ts +1 -1
  69. package/lib/mcp/tools/hierarchyValidate.js +127 -42
  70. package/lib/mcp/tools/hierarchyValidate.js.map +1 -1
  71. package/lib/mcp/tools/nitroXTools.d.ts +23 -0
  72. package/lib/mcp/tools/nitroXTools.js +863 -0
  73. package/lib/mcp/tools/nitroXTools.js.map +1 -0
  74. package/lib/mcp/tools/pageObjectGenerate.js +150 -57
  75. package/lib/mcp/tools/pageObjectGenerate.js.map +1 -1
  76. package/lib/mcp/tools/pageObjectValidate.js +143 -46
  77. package/lib/mcp/tools/pageObjectValidate.js.map +1 -1
  78. package/lib/mcp/tools/projectInspect.js +79 -32
  79. package/lib/mcp/tools/projectInspect.js.map +1 -1
  80. package/lib/mcp/tools/projectValidateFromPath.js +185 -58
  81. package/lib/mcp/tools/projectValidateFromPath.js.map +1 -1
  82. package/lib/mcp/tools/propertiesTools.d.ts +2 -0
  83. package/lib/mcp/tools/propertiesTools.js +358 -78
  84. package/lib/mcp/tools/propertiesTools.js.map +1 -1
  85. package/lib/mcp/tools/qualityHubApiTools.d.ts +3 -0
  86. package/lib/mcp/tools/qualityHubApiTools.js +139 -0
  87. package/lib/mcp/tools/qualityHubApiTools.js.map +1 -0
  88. package/lib/mcp/tools/qualityHubTools.js +292 -72
  89. package/lib/mcp/tools/qualityHubTools.js.map +1 -1
  90. package/lib/mcp/tools/rcaTools.d.ts +3 -2
  91. package/lib/mcp/tools/rcaTools.js +194 -56
  92. package/lib/mcp/tools/rcaTools.js.map +1 -1
  93. package/lib/mcp/tools/sfSpawn.d.ts +25 -3
  94. package/lib/mcp/tools/sfSpawn.js +154 -6
  95. package/lib/mcp/tools/sfSpawn.js.map +1 -1
  96. package/lib/mcp/tools/testCaseGenerate.js +285 -78
  97. package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
  98. package/lib/mcp/tools/testCaseStepTools.d.ts +4 -0
  99. package/lib/mcp/tools/testCaseStepTools.js +244 -0
  100. package/lib/mcp/tools/testCaseStepTools.js.map +1 -0
  101. package/lib/mcp/tools/testCaseValidate.d.ts +11 -0
  102. package/lib/mcp/tools/testCaseValidate.js +381 -46
  103. package/lib/mcp/tools/testCaseValidate.js.map +1 -1
  104. package/lib/mcp/tools/testPlanTools.d.ts +1 -0
  105. package/lib/mcp/tools/testPlanTools.js +316 -59
  106. package/lib/mcp/tools/testPlanTools.js.map +1 -1
  107. package/lib/mcp/tools/testPlanValidate.js +114 -23
  108. package/lib/mcp/tools/testPlanValidate.js.map +1 -1
  109. package/lib/mcp/tools/testSuiteValidate.js +130 -15
  110. package/lib/mcp/tools/testSuiteValidate.js.map +1 -1
  111. package/lib/mcp/update/updateChecker.d.ts +14 -0
  112. package/lib/mcp/update/updateChecker.js +228 -0
  113. package/lib/mcp/update/updateChecker.js.map +1 -0
  114. package/lib/mcp/utils/detailLevel.d.ts +9 -0
  115. package/lib/mcp/utils/detailLevel.js +20 -0
  116. package/lib/mcp/utils/detailLevel.js.map +1 -0
  117. package/lib/mcp/utils/fieldMask.d.ts +17 -0
  118. package/lib/mcp/utils/fieldMask.js +75 -0
  119. package/lib/mcp/utils/fieldMask.js.map +1 -0
  120. package/lib/mcp/utils/tokenMeta.d.ts +40 -0
  121. package/lib/mcp/utils/tokenMeta.js +90 -0
  122. package/lib/mcp/utils/tokenMeta.js.map +1 -0
  123. package/lib/mcp/utils/validationDiff.d.ts +57 -0
  124. package/lib/mcp/utils/validationDiff.js +191 -0
  125. package/lib/mcp/utils/validationDiff.js.map +1 -0
  126. package/lib/mcp/utils/validationScore.d.ts +15 -0
  127. package/lib/mcp/utils/validationScore.js +31 -0
  128. package/lib/mcp/utils/validationScore.js.map +1 -0
  129. package/lib/services/auth/credentials.d.ts +21 -0
  130. package/lib/services/auth/credentials.js +75 -0
  131. package/lib/services/auth/credentials.js.map +1 -0
  132. package/lib/services/auth/loginFlow.d.ts +68 -0
  133. package/lib/services/auth/loginFlow.js +216 -0
  134. package/lib/services/auth/loginFlow.js.map +1 -0
  135. package/lib/services/projectValidation.d.ts +5 -2
  136. package/lib/services/projectValidation.js +83 -31
  137. package/lib/services/projectValidation.js.map +1 -1
  138. package/lib/services/qualityHub/client.d.ts +161 -0
  139. package/lib/services/qualityHub/client.js +226 -0
  140. package/lib/services/qualityHub/client.js.map +1 -0
  141. package/messages/sf.provar.auth.clear.md +16 -0
  142. package/messages/sf.provar.auth.login.md +31 -0
  143. package/messages/sf.provar.auth.rotate.md +23 -0
  144. package/messages/sf.provar.auth.status.md +16 -0
  145. package/messages/sf.provar.mcp.start.md +83 -48
  146. package/oclif.manifest.json +325 -28
  147. package/package.json +35 -12
@@ -0,0 +1,242 @@
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 path from 'node:path';
10
+ import { XMLParser } from 'fast-xml-parser';
11
+ import { z } from 'zod';
12
+ import { assertPathAllowed, PathPolicyError } from '../security/pathPolicy.js';
13
+ import { makeError, makeRequestId } from '../schemas/common.js';
14
+ import { log } from '../logging/logger.js';
15
+ import { maskFields, parseFieldsParam } from '../utils/fieldMask.js';
16
+ import { desc } from './descHelper.js';
17
+ // ── Class → human-readable type mapping ──────────────────────────────────────
18
+ const CLASS_TO_TYPE = {
19
+ sf: 'Salesforce',
20
+ ui: 'Web',
21
+ testmanager: 'Quality Hub',
22
+ webservice: 'Web Service',
23
+ database: 'Database',
24
+ google: 'Google',
25
+ msexc: 'Microsoft',
26
+ zephyr: 'Zephyr',
27
+ zephyrScale: 'Zephyr',
28
+ zephyrServer: 'Zephyr',
29
+ sso: 'SSO',
30
+ };
31
+ function classToType(className) {
32
+ return CLASS_TO_TYPE[className] ?? className;
33
+ }
34
+ // ── .testproject parsers ──────────────────────────────────────────────────────
35
+ const TP_PARSER = new XMLParser({
36
+ ignoreAttributes: false,
37
+ attributeNamePrefix: '@_',
38
+ parseAttributeValue: false,
39
+ isArray: (name) => name === 'connectionClass' ||
40
+ name === 'connection' ||
41
+ name === 'environment' ||
42
+ name === 'connectionUrl' ||
43
+ name === 'association',
44
+ });
45
+ class XmlParseError extends Error {
46
+ code = 'CONNECTION_XML_PARSE_ERROR';
47
+ }
48
+ function parseTestProjectXml(content) {
49
+ let parsed;
50
+ try {
51
+ parsed = TP_PARSER.parse(content);
52
+ }
53
+ catch (e) {
54
+ throw new XmlParseError(`Failed to parse .testproject XML: ${e.message}`);
55
+ }
56
+ const raw = parsed['testProject'];
57
+ return raw !== null && typeof raw === 'object' ? raw : {};
58
+ }
59
+ function buildConnectionMap(tp) {
60
+ const map = new Map();
61
+ const cc = tp['connectionClasses'];
62
+ if (!cc || typeof cc !== 'object')
63
+ return map;
64
+ const classesRaw = cc['connectionClass'];
65
+ if (!Array.isArray(classesRaw))
66
+ return map;
67
+ for (const cls of classesRaw) {
68
+ const className = cls['@_name'];
69
+ if (!className)
70
+ continue;
71
+ // Real .testproject XML nests each <connection> inside a <connections> wrapper.
72
+ const connsWrap = cls['connections'];
73
+ const connsRaw = connsWrap?.['connection'];
74
+ if (!Array.isArray(connsRaw))
75
+ continue;
76
+ for (const conn of connsRaw) {
77
+ const id = conn['@_id'];
78
+ const name = conn['@_name'];
79
+ if (!name)
80
+ continue;
81
+ let defaultUrl;
82
+ const urlsByEnvId = new Map();
83
+ const urlsWrap = conn['connectionUrls'];
84
+ const urlsRaw = urlsWrap?.['connectionUrl'];
85
+ if (Array.isArray(urlsRaw)) {
86
+ for (const u of urlsRaw) {
87
+ const url = u['@_url'];
88
+ if (!url)
89
+ continue;
90
+ const envId = u['@_envId'];
91
+ // The base entry (no @_envId) is the connection's default URL;
92
+ // entries with @_envId are environment-specific overrides keyed by env GUID.
93
+ if (envId)
94
+ urlsByEnvId.set(envId, url);
95
+ else if (defaultUrl === undefined)
96
+ defaultUrl = url;
97
+ }
98
+ }
99
+ const info = { name, className, defaultUrl, urlsByEnvId };
100
+ if (id)
101
+ map.set(id, info);
102
+ // Also key by name so name-based lookups (e.g. legacy callers) still work.
103
+ map.set(`name:${name}`, info);
104
+ }
105
+ }
106
+ return map;
107
+ }
108
+ function parseConnectionList(content) {
109
+ const tp = parseTestProjectXml(content);
110
+ const map = buildConnectionMap(tp);
111
+ const connections = [];
112
+ const seen = new Set();
113
+ for (const info of map.values()) {
114
+ if (seen.has(info))
115
+ continue;
116
+ seen.add(info);
117
+ connections.push({
118
+ name: info.name,
119
+ type: classToType(info.className),
120
+ ...(info.defaultUrl ? { url: info.defaultUrl } : {}),
121
+ sso_configured: info.className === 'sso',
122
+ });
123
+ }
124
+ return connections;
125
+ }
126
+ function parseEnvironmentList(content) {
127
+ const tp = parseTestProjectXml(content);
128
+ const envSection = tp['environments'];
129
+ if (!envSection || typeof envSection !== 'object')
130
+ return [];
131
+ const envsRaw = envSection['environment'];
132
+ if (!Array.isArray(envsRaw))
133
+ return [];
134
+ const connectionMap = buildConnectionMap(tp);
135
+ const environments = [];
136
+ for (const env of envsRaw) {
137
+ const name = env['@_name'];
138
+ if (!name)
139
+ continue;
140
+ const envGuid = env['@_guid'];
141
+ let connectionName = '';
142
+ let envUrl;
143
+ // associations may be missing, an empty string (no associations), or an object wrapping an array.
144
+ const assocs = env['associations'];
145
+ if (assocs !== null && typeof assocs === 'object') {
146
+ const assocsRaw = assocs['association'];
147
+ if (Array.isArray(assocsRaw) && assocsRaw.length > 0) {
148
+ const first = assocsRaw[0];
149
+ const connId = first['@_connectionId'];
150
+ if (connId) {
151
+ const info = connectionMap.get(connId);
152
+ if (info) {
153
+ connectionName = info.name;
154
+ if (envGuid)
155
+ envUrl = info.urlsByEnvId.get(envGuid);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ environments.push({
161
+ name,
162
+ connection: connectionName,
163
+ ...(envUrl ? { url: envUrl } : {}),
164
+ });
165
+ }
166
+ return environments;
167
+ }
168
+ // ── Tool registration ─────────────────────────────────────────────────────────
169
+ export function registerConnectionList(server, config) {
170
+ server.registerTool('provar_connection_list', {
171
+ title: 'List Connections',
172
+ description: desc([
173
+ 'List all connections and named environments defined in the .testproject file.',
174
+ 'Use this before generating test cases or page objects to get the correct connection names.',
175
+ 'Returns connections (name, type, url, sso_configured) and environments (name, connection, url).',
176
+ 'Prerequisite: the project must have a .testproject file — run provar_project_validate first if unsure.',
177
+ 'Security: only connection names, types, and URLs are returned — credential values from .secrets are never included.',
178
+ ].join(' '), 'List connections and environments from the .testproject file.'),
179
+ inputSchema: {
180
+ project_path: z
181
+ .string()
182
+ .describe(desc('Absolute or relative path to the Provar project root directory (must be within --allowed-paths)', 'string, absolute path to project root')),
183
+ fields: z
184
+ .string()
185
+ .optional()
186
+ .describe(desc('Comma-separated list of top-level response keys to retain (e.g. "connections,summary"). ' +
187
+ 'Supports dot notation for nested filtering (e.g. "connections.name,connections.type"). ' +
188
+ 'Unknown field names are silently ignored. Omit for full response.', 'string, optional; comma-separated keys to keep (supports dot notation)')),
189
+ },
190
+ }, ({ project_path, fields }) => {
191
+ const requestId = makeRequestId();
192
+ log('info', 'provar_connection_list', { requestId, project_path });
193
+ try {
194
+ const resolvedPath = path.resolve(project_path);
195
+ assertPathAllowed(resolvedPath, config.allowedPaths);
196
+ const testProjectPath = path.join(resolvedPath, '.testproject');
197
+ if (!fs.existsSync(testProjectPath)) {
198
+ const err = makeError('CONNECTION_FILE_NOT_FOUND', `No .testproject file found at: ${testProjectPath}. Run provar_project_validate first to confirm the project structure.`, requestId, false, { suggestion: 'Run provar_project_validate with the project_path to confirm the project root, then retry.' });
199
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
200
+ }
201
+ assertPathAllowed(testProjectPath, config.allowedPaths);
202
+ let content;
203
+ try {
204
+ content = fs.readFileSync(testProjectPath, 'utf-8');
205
+ }
206
+ catch (readErr) {
207
+ const err = makeError('CONNECTION_FILE_READ_ERROR', `Failed to read .testproject: ${readErr.message}`, requestId, false);
208
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
209
+ }
210
+ const connections = parseConnectionList(content);
211
+ const environments = parseEnvironmentList(content);
212
+ let result = {
213
+ requestId,
214
+ project_path: resolvedPath,
215
+ connections,
216
+ environments,
217
+ summary: {
218
+ connection_count: connections.length,
219
+ environment_count: environments.length,
220
+ },
221
+ };
222
+ const fieldList = parseFieldsParam(fields);
223
+ if (fieldList) {
224
+ result = maskFields(result, fieldList);
225
+ }
226
+ return {
227
+ content: [{ type: 'text', text: JSON.stringify(result) }],
228
+ structuredContent: result,
229
+ };
230
+ }
231
+ catch (err) {
232
+ const error = err;
233
+ const errResult = makeError(error instanceof PathPolicyError ? error.code : error.code ?? 'CONNECTION_LIST_ERROR', error.message, requestId, false);
234
+ log('error', 'provar_connection_list failed', { requestId, error: error.message });
235
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
236
+ }
237
+ });
238
+ }
239
+ export function registerAllConnectionTools(server, config) {
240
+ registerConnectionList(server, config);
241
+ }
242
+ //# sourceMappingURL=connectionTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/connectionTools.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export interface DefectCreateResult {
6
6
  executionId: string;
7
7
  testCaseId: string;
8
8
  }
9
- export declare function createDefectsForRun(runId: string, targetOrg: string, failedTestFilter?: string[]): {
9
+ export declare function createDefectsForRun(runId: string, targetOrg: string, failedTestFilter?: string[], sfPath?: string): {
10
10
  created: DefectCreateResult[];
11
11
  skipped: number;
12
12
  message: string;
@@ -9,31 +9,33 @@ import { z } from 'zod';
9
9
  import { makeError, makeRequestId } from '../schemas/common.js';
10
10
  import { log } from '../logging/logger.js';
11
11
  import { runSfCommand, soqlEscape } from './sfSpawn.js';
12
+ import { desc } from './descHelper.js';
12
13
  // ── SF CLI helpers ─────────────────────────────────────────────────────────────
13
- function runSfArgs(args) {
14
- const { stdout, exitCode } = runSfCommand(args);
15
- return { stdout, exitCode };
14
+ function runSfArgs(args, sfPath) {
15
+ const { stdout, stderr, exitCode } = runSfCommand(args, sfPath);
16
+ return { stdout, stderr, exitCode };
16
17
  }
17
- function runQuery(soql, targetOrg) {
18
- const { stdout } = runSfArgs([
19
- 'data', 'query',
20
- '--query', soql,
21
- '--target-org', targetOrg,
22
- '--json',
23
- ]);
18
+ function formatSfCommandError(action, exitCode, stderr, stdout) {
19
+ const details = [stderr?.trim(), stdout?.trim()].filter(Boolean).join('\n');
20
+ return details
21
+ ? `${action} failed with exit code ${exitCode}: ${details}`
22
+ : `${action} failed with exit code ${exitCode}`;
23
+ }
24
+ function runQuery(soql, targetOrg, sfPath) {
25
+ const { stdout, stderr, exitCode } = runSfArgs(['data', 'query', '--query', soql, '--target-org', targetOrg, '--json'], sfPath);
26
+ if (exitCode !== 0) {
27
+ throw new Error(formatSfCommandError('Salesforce query', exitCode, stderr, stdout));
28
+ }
24
29
  return JSON.parse(stdout);
25
30
  }
26
- function createRecord(sobject, values, targetOrg) {
27
- const { stdout } = runSfArgs([
28
- 'data', 'create', 'record',
29
- '--sobject', sobject,
30
- '--values', values,
31
- '--target-org', targetOrg,
32
- '--json',
33
- ]);
31
+ function createRecord(sobject, values, targetOrg, sfPath) {
32
+ const { stdout, stderr, exitCode } = runSfArgs(['data', 'create', 'record', '--sobject', sobject, '--values', values, '--target-org', targetOrg, '--json'], sfPath);
33
+ if (exitCode !== 0) {
34
+ throw new Error(formatSfCommandError(`Failed to create ${sobject}`, exitCode, stderr, stdout));
35
+ }
34
36
  const parsed = JSON.parse(stdout);
35
37
  if (!parsed.result?.success) {
36
- throw new Error(`Failed to create ${sobject}: ${stdout}`);
38
+ throw new Error(formatSfCommandError(`Failed to create ${sobject}`, exitCode, stderr, stdout));
37
39
  }
38
40
  return parsed.result.id;
39
41
  }
@@ -41,14 +43,11 @@ function createRecord(sobject, values, targetOrg) {
41
43
  function safeText(value, maxLen = 200) {
42
44
  if (value === null || value === undefined)
43
45
  return '';
44
- return String(value)
45
- .replace(/"/g, "'")
46
- .replace(/\n|\r/g, ' ')
47
- .substring(0, maxLen);
46
+ return String(value).replace(/"/g, "'").replace(/\n|\r/g, ' ').substring(0, maxLen);
48
47
  }
49
- export function createDefectsForRun(runId, targetOrg, failedTestFilter) {
48
+ export function createDefectsForRun(runId, targetOrg, failedTestFilter, sfPath) {
50
49
  // Step 1: resolve job record ID from tracking ID
51
- const jobQuery = runQuery(`SELECT Id FROM provar__Test_Plan_Schedule_Job__c WHERE provar__Tracking_Id__c = '${soqlEscape(runId)}'`, targetOrg);
50
+ const jobQuery = runQuery(`SELECT Id FROM provar__Test_Plan_Schedule_Job__c WHERE provar__Tracking_Id__c = '${soqlEscape(runId)}'`, targetOrg, sfPath);
52
51
  if (jobQuery.result.totalSize === 0) {
53
52
  throw new Error(`No Test_Plan_Schedule_Job__c found with Tracking_Id__c = '${runId}'`);
54
53
  }
@@ -57,7 +56,7 @@ export function createDefectsForRun(runId, targetOrg, failedTestFilter) {
57
56
  const cycleQuery = runQuery(`SELECT Id, provar__Web_Browser__c, provar__Browser_Version__c, provar__Environment_Text__c
58
57
  FROM provar__Test_Cycle__c
59
58
  WHERE provar__Test_Plan_Schedule_Job__c = '${soqlEscape(jobId)}'
60
- LIMIT 1`, targetOrg);
59
+ LIMIT 1`, targetOrg, sfPath);
61
60
  const cycle = cycleQuery.result.records[0] ?? {};
62
61
  const browser = safeText(cycle['provar__Web_Browser__c'], 100);
63
62
  const browserVersion = safeText(cycle['provar__Browser_Version__c'], 100);
@@ -70,7 +69,7 @@ export function createDefectsForRun(runId, targetOrg, failedTestFilter) {
70
69
  const execQuery = runQuery(`SELECT Id, provar__Test_Case__c, provar__Tester__c
71
70
  FROM provar__Test_Execution__c
72
71
  WHERE provar__Test_Cycle__c = '${soqlEscape(cycleId)}'
73
- AND provar__Status__c = 'Failed'`, targetOrg);
72
+ AND provar__Status__c = 'Failed'`, targetOrg, sfPath);
74
73
  if (execQuery.result.totalSize === 0) {
75
74
  return { created: [], skipped: 0, message: 'No failed test executions found for this run.' };
76
75
  }
@@ -91,7 +90,7 @@ export function createDefectsForRun(runId, targetOrg, failedTestFilter) {
91
90
  WHERE provar__Test_Execution__c = '${soqlEscape(executionId)}'
92
91
  AND provar__Result__c = 'Fail'
93
92
  ORDER BY provar__Sequence_No__c ASC
94
- LIMIT 1`, targetOrg);
93
+ LIMIT 1`, targetOrg, sfPath);
95
94
  const step = stepQuery.result.records[0] ?? {};
96
95
  const stepExecutionId = step['Id'] ?? '';
97
96
  const stepId = String(step['provar__Test_Step__c'] ?? '');
@@ -126,17 +125,17 @@ export function createDefectsForRun(runId, targetOrg, failedTestFilter) {
126
125
  const defectValues = `Name="TC Failure: ${safeText(testCaseId, 100)}" ` +
127
126
  `provar__Description__c="${safeText(descLines, 2000)}" ` +
128
127
  'provar__Status__c="Open"';
129
- const defectId = createRecord('provar__Defect__c', defectValues, targetOrg);
128
+ const defectId = createRecord('provar__Defect__c', defectValues, targetOrg, sfPath);
130
129
  // Step 5b: link TC → Defect
131
130
  const tcDefectValues = `provar__Defect__c="${defectId}" ` +
132
131
  `provar__Test_Case__c="${testCaseId}"` +
133
132
  (stepId ? ` provar__Test_Step__c="${stepId}"` : '');
134
- const tcDefectId = createRecord('provar__Test_Case_Defect__c', tcDefectValues, targetOrg);
133
+ const tcDefectId = createRecord('provar__Test_Case_Defect__c', tcDefectValues, targetOrg, sfPath);
135
134
  // Step 5c: link Execution → Defect (with step execution if available)
136
135
  const execDefectValues = `provar__Defect__c="${defectId}" ` +
137
136
  `provar__Test_Execution__c="${executionId}"` +
138
137
  (stepExecutionId ? ` provar__Test_Step_Execution__c="${stepExecutionId}"` : '');
139
- const execDefectId = createRecord('provar__Test_Execution_Defect__c', execDefectValues, targetOrg);
138
+ const execDefectId = createRecord('provar__Test_Execution_Defect__c', execDefectValues, targetOrg, sfPath);
140
139
  log('info', 'defect created', { defectId, tcDefectId, execDefectId, executionId });
141
140
  created.push({ defectId, tcDefectId, execDefectId, executionId, testCaseId });
142
141
  }
@@ -149,26 +148,38 @@ export function createDefectsForRun(runId, targetOrg, failedTestFilter) {
149
148
  }
150
149
  // ── Tool registration ──────────────────────────────────────────────────────────
151
150
  export function registerQualityHubDefectCreate(server) {
152
- server.tool('provar.qualityhub.defect.create', [
153
- 'Create Defect__c records in Quality Hub for failed test executions in a given run.',
154
- 'Queries the run by Tracking_Id__c, finds failed Test_Execution__c records, creates a',
155
- 'Defect__c per failure (with description, step, browser, environment, tester), and links',
156
- 'it via Test_Case_Defect__c and Test_Execution_Defect__c junction records.',
157
- 'If Jira or ADO sync is configured in Quality Hub, defects sync to those systems automatically.',
158
- ].join(' '), {
159
- run_id: z
160
- .string()
161
- .describe('Test run Tracking_Id__c value returned by provar.qualityhub.testrun'),
162
- target_org: z.string().describe('SF org alias or username for the Quality Hub org'),
163
- failed_tests: z
164
- .array(z.string())
165
- .optional()
166
- .describe('Optional filter — list of Test_Case__c record ID substrings to restrict defect creation to specific failures'),
167
- }, ({ run_id, target_org, failed_tests }) => {
151
+ server.registerTool('provar_qualityhub_defect_create', {
152
+ title: 'Create Defects',
153
+ description: desc([
154
+ 'Create Defect__c records in Quality Hub for failed test executions in a given run.',
155
+ 'Queries the run by Tracking_Id__c, finds failed Test_Execution__c records, creates a',
156
+ 'Defect__c per failure (with description, step, browser, environment, tester), and links',
157
+ 'it via Test_Case_Defect__c and Test_Execution_Defect__c junction records.',
158
+ 'If Jira or ADO sync is configured in Quality Hub, defects sync to those systems automatically.',
159
+ ].join(' '), 'Create Defect__c records for failed Quality Hub test executions.'),
160
+ inputSchema: {
161
+ run_id: z
162
+ .string()
163
+ .describe(desc('Test run Tracking_Id__c value returned by provar_qualityhub_testrun', 'string, tracking ID from qualityhub_testrun')),
164
+ target_org: z
165
+ .string()
166
+ .describe(desc('SF org alias or username for the Quality Hub org', 'string, SF org alias or username')),
167
+ failed_tests: z
168
+ .array(z.string())
169
+ .optional()
170
+ .describe(desc('Optional filter — list of Test_Case__c record ID substrings to restrict defect creation to specific failures', 'array of strings, optional; filter by TC ID substring')),
171
+ sf_path: z
172
+ .string()
173
+ .optional()
174
+ .describe(desc('Path to the sf CLI executable when not in PATH ' +
175
+ '(e.g. "C:\\\\Program Files\\\\sf\\\\bin\\\\sf.cmd" for the Windows standalone installer). ' +
176
+ 'Leave unset to use auto-discovery.', 'string, optional; path to sf CLI executable')),
177
+ },
178
+ }, ({ run_id, target_org, failed_tests, sf_path }) => {
168
179
  const requestId = makeRequestId();
169
- log('info', 'provar.qualityhub.defect.create', { requestId, run_id, target_org });
180
+ log('info', 'provar_qualityhub_defect_create', { requestId, run_id, target_org });
170
181
  try {
171
- const result = createDefectsForRun(run_id, target_org, failed_tests);
182
+ const result = createDefectsForRun(run_id, target_org, failed_tests, sf_path);
172
183
  const response = { requestId, ...result };
173
184
  return {
174
185
  content: [{ type: 'text', text: JSON.stringify(response) }],
@@ -177,7 +188,7 @@ export function registerQualityHubDefectCreate(server) {
177
188
  }
178
189
  catch (err) {
179
190
  const error = err;
180
- log('error', 'provar.qualityhub.defect.create failed', {
191
+ log('error', 'provar_qualityhub_defect_create failed', {
181
192
  requestId,
182
193
  error: error.message,
183
194
  });
@@ -1 +1 @@
1
- {"version":3,"file":"defectTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/defectTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defectTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/defectTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Returns `compact` when PROVAR_MCP_SCHEMA_MODE=compact, otherwise `standard`.
3
+ * Reads the env var on each call so tests can set it without resetting module cache.
4
+ */
5
+ export declare function desc(standard: string, compact: string): string;
@@ -0,0 +1,14 @@
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
+ /**
8
+ * Returns `compact` when PROVAR_MCP_SCHEMA_MODE=compact, otherwise `standard`.
9
+ * Reads the env var on each call so tests can set it without resetting module cache.
10
+ */
11
+ export function desc(standard, compact) {
12
+ return process.env['PROVAR_MCP_SCHEMA_MODE'] === 'compact' ? compact : standard;
13
+ }
14
+ //# sourceMappingURL=descHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descHelper.js","sourceRoot":"","sources":["../../../src/mcp/tools/descHelper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,QAAgB,EAAE,OAAe;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClF,CAAC"}
@@ -36,7 +36,7 @@ export interface ProjectContext {
36
36
  secretsPasswordSet?: boolean;
37
37
  /**
38
38
  * Number of keys in the .secrets file whose values are NOT wrapped in ENC1().
39
- * Populated by provar.project.inspect → secrets_validation.unencrypted_key_count.
39
+ * Populated by provar_project_inspect → secrets_validation.unencrypted_key_count.
40
40
  * Any value > 0 triggers PROJ-ENC-001.
41
41
  */
42
42
  unencrypted_secret_count?: number;