@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
|
@@ -12,6 +12,8 @@ import { z } from 'zod';
|
|
|
12
12
|
import { assertPathAllowed, PathPolicyError } from '../security/pathPolicy.js';
|
|
13
13
|
import { makeError, makeRequestId } from '../schemas/common.js';
|
|
14
14
|
import { log } from '../logging/logger.js';
|
|
15
|
+
import { maskFields, parseFieldsParam } from '../utils/fieldMask.js';
|
|
16
|
+
import { desc } from './descHelper.js';
|
|
15
17
|
// ── Class → human-readable type mapping ──────────────────────────────────────
|
|
16
18
|
const CLASS_TO_TYPE = {
|
|
17
19
|
sf: 'Salesforce',
|
|
@@ -34,7 +36,11 @@ const TP_PARSER = new XMLParser({
|
|
|
34
36
|
ignoreAttributes: false,
|
|
35
37
|
attributeNamePrefix: '@_',
|
|
36
38
|
parseAttributeValue: false,
|
|
37
|
-
isArray: (name) => name === 'connectionClass' ||
|
|
39
|
+
isArray: (name) => name === 'connectionClass' ||
|
|
40
|
+
name === 'connection' ||
|
|
41
|
+
name === 'environment' ||
|
|
42
|
+
name === 'connectionUrl' ||
|
|
43
|
+
name === 'association',
|
|
38
44
|
});
|
|
39
45
|
class XmlParseError extends Error {
|
|
40
46
|
code = 'CONNECTION_XML_PARSE_ERROR';
|
|
@@ -50,36 +56,71 @@ function parseTestProjectXml(content) {
|
|
|
50
56
|
const raw = parsed['testProject'];
|
|
51
57
|
return raw !== null && typeof raw === 'object' ? raw : {};
|
|
52
58
|
}
|
|
53
|
-
function
|
|
54
|
-
const
|
|
59
|
+
function buildConnectionMap(tp) {
|
|
60
|
+
const map = new Map();
|
|
55
61
|
const cc = tp['connectionClasses'];
|
|
56
62
|
if (!cc || typeof cc !== 'object')
|
|
57
|
-
return
|
|
63
|
+
return map;
|
|
58
64
|
const classesRaw = cc['connectionClass'];
|
|
59
|
-
if (!classesRaw)
|
|
60
|
-
return
|
|
61
|
-
const
|
|
62
|
-
const connections = [];
|
|
63
|
-
for (const cls of classes) {
|
|
65
|
+
if (!Array.isArray(classesRaw))
|
|
66
|
+
return map;
|
|
67
|
+
for (const cls of classesRaw) {
|
|
64
68
|
const className = cls['@_name'];
|
|
65
69
|
if (!className)
|
|
66
70
|
continue;
|
|
67
|
-
|
|
68
|
-
|
|
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))
|
|
69
75
|
continue;
|
|
70
76
|
for (const conn of connsRaw) {
|
|
71
|
-
const
|
|
72
|
-
|
|
77
|
+
const id = conn['@_id'];
|
|
78
|
+
const name = conn['@_name'];
|
|
79
|
+
if (!name)
|
|
73
80
|
continue;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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);
|
|
81
104
|
}
|
|
82
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
|
+
}
|
|
83
124
|
return connections;
|
|
84
125
|
}
|
|
85
126
|
function parseEnvironmentList(content) {
|
|
@@ -88,19 +129,38 @@ function parseEnvironmentList(content) {
|
|
|
88
129
|
if (!envSection || typeof envSection !== 'object')
|
|
89
130
|
return [];
|
|
90
131
|
const envsRaw = envSection['environment'];
|
|
91
|
-
if (!envsRaw)
|
|
132
|
+
if (!Array.isArray(envsRaw))
|
|
92
133
|
return [];
|
|
134
|
+
const connectionMap = buildConnectionMap(tp);
|
|
93
135
|
const environments = [];
|
|
94
136
|
for (const env of envsRaw) {
|
|
95
137
|
const name = env['@_name'];
|
|
96
138
|
if (!name)
|
|
97
139
|
continue;
|
|
98
|
-
const
|
|
99
|
-
|
|
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
|
+
}
|
|
100
160
|
environments.push({
|
|
101
161
|
name,
|
|
102
|
-
connection:
|
|
103
|
-
...(
|
|
162
|
+
connection: connectionName,
|
|
163
|
+
...(envUrl ? { url: envUrl } : {}),
|
|
104
164
|
});
|
|
105
165
|
}
|
|
106
166
|
return environments;
|
|
@@ -109,19 +169,25 @@ function parseEnvironmentList(content) {
|
|
|
109
169
|
export function registerConnectionList(server, config) {
|
|
110
170
|
server.registerTool('provar_connection_list', {
|
|
111
171
|
title: 'List Connections',
|
|
112
|
-
description: [
|
|
172
|
+
description: desc([
|
|
113
173
|
'List all connections and named environments defined in the .testproject file.',
|
|
114
174
|
'Use this before generating test cases or page objects to get the correct connection names.',
|
|
115
175
|
'Returns connections (name, type, url, sso_configured) and environments (name, connection, url).',
|
|
116
176
|
'Prerequisite: the project must have a .testproject file — run provar_project_validate first if unsure.',
|
|
117
177
|
'Security: only connection names, types, and URLs are returned — credential values from .secrets are never included.',
|
|
118
|
-
].join(' '),
|
|
178
|
+
].join(' '), 'List connections and environments from the .testproject file.'),
|
|
119
179
|
inputSchema: {
|
|
120
180
|
project_path: z
|
|
121
181
|
.string()
|
|
122
|
-
.describe('Absolute or relative path to the Provar project root directory (must be within --allowed-paths)'),
|
|
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)')),
|
|
123
189
|
},
|
|
124
|
-
}, ({ project_path }) => {
|
|
190
|
+
}, ({ project_path, fields }) => {
|
|
125
191
|
const requestId = makeRequestId();
|
|
126
192
|
log('info', 'provar_connection_list', { requestId, project_path });
|
|
127
193
|
try {
|
|
@@ -143,7 +209,7 @@ export function registerConnectionList(server, config) {
|
|
|
143
209
|
}
|
|
144
210
|
const connections = parseConnectionList(content);
|
|
145
211
|
const environments = parseEnvironmentList(content);
|
|
146
|
-
|
|
212
|
+
let result = {
|
|
147
213
|
requestId,
|
|
148
214
|
project_path: resolvedPath,
|
|
149
215
|
connections,
|
|
@@ -153,6 +219,10 @@ export function registerConnectionList(server, config) {
|
|
|
153
219
|
environment_count: environments.length,
|
|
154
220
|
},
|
|
155
221
|
};
|
|
222
|
+
const fieldList = parseFieldsParam(fields);
|
|
223
|
+
if (fieldList) {
|
|
224
|
+
result = maskFields(result, fieldList);
|
|
225
|
+
}
|
|
156
226
|
return {
|
|
157
227
|
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
158
228
|
structuredContent: result,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectionTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/connectionTools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"connectionTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/connectionTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ 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
14
|
function runSfArgs(args, sfPath) {
|
|
14
15
|
const { stdout, stderr, exitCode } = runSfCommand(args, sfPath);
|
|
@@ -149,26 +150,30 @@ export function createDefectsForRun(runId, targetOrg, failedTestFilter, sfPath)
|
|
|
149
150
|
export function registerQualityHubDefectCreate(server) {
|
|
150
151
|
server.registerTool('provar_qualityhub_defect_create', {
|
|
151
152
|
title: 'Create Defects',
|
|
152
|
-
description: [
|
|
153
|
+
description: desc([
|
|
153
154
|
'Create Defect__c records in Quality Hub for failed test executions in a given run.',
|
|
154
155
|
'Queries the run by Tracking_Id__c, finds failed Test_Execution__c records, creates a',
|
|
155
156
|
'Defect__c per failure (with description, step, browser, environment, tester), and links',
|
|
156
157
|
'it via Test_Case_Defect__c and Test_Execution_Defect__c junction records.',
|
|
157
158
|
'If Jira or ADO sync is configured in Quality Hub, defects sync to those systems automatically.',
|
|
158
|
-
].join(' '),
|
|
159
|
+
].join(' '), 'Create Defect__c records for failed Quality Hub test executions.'),
|
|
159
160
|
inputSchema: {
|
|
160
|
-
run_id: z
|
|
161
|
-
|
|
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')),
|
|
162
167
|
failed_tests: z
|
|
163
168
|
.array(z.string())
|
|
164
169
|
.optional()
|
|
165
|
-
.describe('Optional filter — list of Test_Case__c record ID substrings to restrict defect creation to specific failures'),
|
|
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')),
|
|
166
171
|
sf_path: z
|
|
167
172
|
.string()
|
|
168
173
|
.optional()
|
|
169
|
-
.describe('Path to the sf CLI executable when not in PATH ' +
|
|
174
|
+
.describe(desc('Path to the sf CLI executable when not in PATH ' +
|
|
170
175
|
'(e.g. "C:\\\\Program Files\\\\sf\\\\bin\\\\sf.cmd" for the Windows standalone installer). ' +
|
|
171
|
-
'Leave unset to use auto-discovery.'),
|
|
176
|
+
'Leave unset to use auto-discovery.', 'string, optional; path to sf CLI executable')),
|
|
172
177
|
},
|
|
173
178
|
}, ({ run_id, target_org, failed_tests, sf_path }) => {
|
|
174
179
|
const requestId = makeRequestId();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defectTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/defectTools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"defectTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/defectTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -15,6 +15,7 @@ import { z } from 'zod';
|
|
|
15
15
|
import { assertPathAllowed, PathPolicyError } from '../security/pathPolicy.js';
|
|
16
16
|
import { makeError, makeRequestId } from '../schemas/common.js';
|
|
17
17
|
import { log } from '../logging/logger.js';
|
|
18
|
+
import { desc } from './descHelper.js';
|
|
18
19
|
function isObj(v) {
|
|
19
20
|
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
20
21
|
}
|
|
@@ -413,29 +414,29 @@ function applyMergePatch(target, patch) {
|
|
|
413
414
|
export function registerNitroXDiscover(server) {
|
|
414
415
|
server.registerTool('provar_nitrox_discover', {
|
|
415
416
|
title: 'Discover NitroX Components',
|
|
416
|
-
description: [
|
|
417
|
+
description: desc([
|
|
417
418
|
'Discover Provar projects containing NitroX (Hybrid Model) page objects.',
|
|
418
419
|
'Scans directories for .testproject marker files, then inventories nitroX/ and nitroXPackages/ directories.',
|
|
419
420
|
"NitroX is Provar's Hybrid Model for locators — component-based page objects for LWC,",
|
|
420
421
|
'Screen Flow, Industry Components, Experience Cloud, and HTML5 components.',
|
|
421
422
|
'Results provide file paths and package info for use with provar_nitrox_read, validate, and generate.',
|
|
422
|
-
].join(' '),
|
|
423
|
+
].join(' '), 'Discover Provar projects with NitroX Hybrid Model page objects.'),
|
|
423
424
|
inputSchema: {
|
|
424
425
|
search_roots: z
|
|
425
426
|
.array(z.string())
|
|
426
427
|
.optional()
|
|
427
|
-
.describe('Directories to scan (default: cwd; if empty, falls back to ~/git and ~/Provar)'),
|
|
428
|
+
.describe(desc('Directories to scan (default: cwd; if empty, falls back to ~/git and ~/Provar)', 'array of strings, optional; dirs to scan')),
|
|
428
429
|
max_depth: z
|
|
429
430
|
.number()
|
|
430
431
|
.int()
|
|
431
432
|
.min(1)
|
|
432
433
|
.max(20)
|
|
433
434
|
.default(6)
|
|
434
|
-
.describe('Maximum directory depth for .testproject search'),
|
|
435
|
+
.describe(desc('Maximum directory depth for .testproject search', 'int 1–20, optional; max scan depth')),
|
|
435
436
|
include_packages: z
|
|
436
437
|
.boolean()
|
|
437
438
|
.default(true)
|
|
438
|
-
.describe('Include nitroXPackages/ package.json metadata in results'),
|
|
439
|
+
.describe(desc('Include nitroXPackages/ package.json metadata in results', 'bool, optional; include package metadata')),
|
|
439
440
|
},
|
|
440
441
|
}, ({ search_roots, max_depth, include_packages }) => {
|
|
441
442
|
const requestId = makeRequestId();
|
|
@@ -508,24 +509,27 @@ export function registerNitroXDiscover(server) {
|
|
|
508
509
|
export function registerNitroXRead(server, config) {
|
|
509
510
|
server.registerTool('provar_nitrox_read', {
|
|
510
511
|
title: 'Read NitroX Files',
|
|
511
|
-
description: [
|
|
512
|
+
description: desc([
|
|
512
513
|
'Read one or more NitroX .po.json (Hybrid Model page object) files and return their parsed content.',
|
|
513
514
|
'Use this to load examples before generating or validating.',
|
|
514
515
|
"Provide file_paths for specific files, or project_path to read all .po.json files from a project's nitroX/ directory.",
|
|
515
|
-
].join(' '),
|
|
516
|
+
].join(' '), 'Read NitroX .po.json files and return parsed content.'),
|
|
516
517
|
inputSchema: {
|
|
517
|
-
file_paths: z
|
|
518
|
+
file_paths: z
|
|
519
|
+
.array(z.string())
|
|
520
|
+
.optional()
|
|
521
|
+
.describe(desc('Specific .po.json file paths to read', 'array of strings, optional; specific .po.json paths')),
|
|
518
522
|
project_path: z
|
|
519
523
|
.string()
|
|
520
524
|
.optional()
|
|
521
|
-
.describe('Provar project path — reads all .po.json files from nitroX/ directory'),
|
|
525
|
+
.describe(desc('Provar project path — reads all .po.json files from nitroX/ directory', 'string, optional; project path to read all nitroX files')),
|
|
522
526
|
max_files: z
|
|
523
527
|
.number()
|
|
524
528
|
.int()
|
|
525
529
|
.min(1)
|
|
526
530
|
.max(100)
|
|
527
531
|
.default(20)
|
|
528
|
-
.describe('Maximum number of files to return (prevents context overflow)'),
|
|
532
|
+
.describe(desc('Maximum number of files to return (prevents context overflow)', 'int 1–100, optional; max files returned')),
|
|
529
533
|
},
|
|
530
534
|
}, ({ file_paths, project_path, max_files }) => {
|
|
531
535
|
const requestId = makeRequestId();
|
|
@@ -597,17 +601,23 @@ export function registerNitroXRead(server, config) {
|
|
|
597
601
|
export function registerNitroXValidate(server, config) {
|
|
598
602
|
server.registerTool('provar_nitrox_validate', {
|
|
599
603
|
title: 'Validate NitroX Component',
|
|
600
|
-
description: [
|
|
604
|
+
description: desc([
|
|
601
605
|
'Validate a NitroX .po.json (Hybrid Model component page object) against schema rules.',
|
|
602
606
|
'Works for any NitroX-mapped component type: LWC, Screen Flow, Industry Components, Experience Cloud, HTML5.',
|
|
603
607
|
'Runs two validation passes sequentially: hardcoded semantic rules (NX001–NX010) then JSON schema validation (NX_SCHEMA_* rule IDs).',
|
|
604
608
|
'Schema issues catch structural errors not covered by NX rules: wrong property types, extra properties, enum violations.',
|
|
605
609
|
'Returns a quality score (0–100) and a combined list of issues with rule IDs, severity, and suggestions.',
|
|
606
610
|
'Score formula: 100 − (20 × errors) − (5 × warnings) − (1 × infos).',
|
|
607
|
-
].join(' '),
|
|
611
|
+
].join(' '), 'Validate a NitroX .po.json against NX001–NX010 and JSON schema rules.'),
|
|
608
612
|
inputSchema: {
|
|
609
|
-
content: z
|
|
610
|
-
|
|
613
|
+
content: z
|
|
614
|
+
.string()
|
|
615
|
+
.optional()
|
|
616
|
+
.describe(desc('JSON string of the .po.json content to validate', 'string, optional; JSON content to validate')),
|
|
617
|
+
file_path: z
|
|
618
|
+
.string()
|
|
619
|
+
.optional()
|
|
620
|
+
.describe(desc('Path to a .po.json file to validate', 'string, optional; path to .po.json file')),
|
|
611
621
|
},
|
|
612
622
|
}, ({ content, file_path }) => {
|
|
613
623
|
const requestId = makeRequestId();
|
|
@@ -670,7 +680,7 @@ const ElementInputSchema = z.object({
|
|
|
670
680
|
export function registerNitroXGenerate(server, config) {
|
|
671
681
|
server.registerTool('provar_nitrox_generate', {
|
|
672
682
|
title: 'Generate NitroX Components',
|
|
673
|
-
description: [
|
|
683
|
+
description: desc([
|
|
674
684
|
'Generate a new NitroX .po.json (Hybrid Model page object) from a component description.',
|
|
675
685
|
"Applicable to any component type supported by Provar's Hybrid Model:",
|
|
676
686
|
'LWC, Screen Flow, Industry Components, Experience Cloud, HTML5.',
|
|
@@ -678,18 +688,43 @@ export function registerNitroXGenerate(server, config) {
|
|
|
678
688
|
'tagName conventions, interaction titles, and attribute patterns from shipped base packages.',
|
|
679
689
|
'All componentId fields are assigned fresh UUIDs. Returns JSON content;',
|
|
680
690
|
'writes to disk only when dry_run=false.',
|
|
681
|
-
].join(' '),
|
|
691
|
+
].join(' '), 'Generate a NitroX .po.json Hybrid Model page object with fresh UUIDs.'),
|
|
682
692
|
inputSchema: {
|
|
683
|
-
name: z
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
+
name: z
|
|
694
|
+
.string()
|
|
695
|
+
.describe(desc('Path-like component name, e.g. /com/force/myapp/ButtonComponent', 'string, path-like component name')),
|
|
696
|
+
tag_name: z
|
|
697
|
+
.string()
|
|
698
|
+
.describe(desc('LWC or HTML tag name, e.g. lightning-button or c-my-component', 'string, LWC or HTML tag name')),
|
|
699
|
+
type: z.enum(['Block', 'Page']).default('Block').describe(desc('Component type', 'enum Block|Page')),
|
|
700
|
+
page_structure_element: z
|
|
701
|
+
.boolean()
|
|
702
|
+
.default(true)
|
|
703
|
+
.describe(desc('Whether this is a page structure element', 'bool, optional; default true')),
|
|
704
|
+
field_details_element: z
|
|
705
|
+
.boolean()
|
|
706
|
+
.default(false)
|
|
707
|
+
.describe(desc('Whether this is a field details element', 'bool, optional; default false')),
|
|
708
|
+
parameters: z
|
|
709
|
+
.array(ParameterInputSchema)
|
|
710
|
+
.optional()
|
|
711
|
+
.describe(desc('Component parameters/qualifiers', 'array, optional; component parameters')),
|
|
712
|
+
elements: z
|
|
713
|
+
.array(ElementInputSchema)
|
|
714
|
+
.optional()
|
|
715
|
+
.describe(desc('Child elements', 'array, optional; child elements')),
|
|
716
|
+
output_path: z
|
|
717
|
+
.string()
|
|
718
|
+
.optional()
|
|
719
|
+
.describe(desc('File path to write (requires dry_run=false)', 'string, optional; output file path')),
|
|
720
|
+
overwrite: z
|
|
721
|
+
.boolean()
|
|
722
|
+
.default(false)
|
|
723
|
+
.describe(desc('Overwrite if output_path already exists', 'bool, optional; overwrite if exists')),
|
|
724
|
+
dry_run: z
|
|
725
|
+
.boolean()
|
|
726
|
+
.default(true)
|
|
727
|
+
.describe(desc('Return JSON without writing to disk (default)', 'bool, optional; default true, skip write')),
|
|
693
728
|
},
|
|
694
729
|
}, (input) => {
|
|
695
730
|
const requestId = makeRequestId();
|
|
@@ -736,22 +771,27 @@ export function registerNitroXGenerate(server, config) {
|
|
|
736
771
|
export function registerNitroXPatch(server, config) {
|
|
737
772
|
server.registerTool('provar_nitrox_patch', {
|
|
738
773
|
title: 'Patch NitroX Component',
|
|
739
|
-
description: [
|
|
774
|
+
description: desc([
|
|
740
775
|
'Apply a JSON merge-patch (RFC 7396) to an existing NitroX .po.json file.',
|
|
741
776
|
'Reads the file, merges the patch (null values remove keys, other values replace or recurse into objects),',
|
|
742
777
|
'optionally validates the merged result, and writes back.',
|
|
743
778
|
'Use dry_run=true (default) to preview the merged output without writing.',
|
|
744
|
-
].join(' '),
|
|
779
|
+
].join(' '), 'Apply a JSON merge-patch (RFC 7396) to an existing NitroX .po.json file.'),
|
|
745
780
|
inputSchema: {
|
|
746
|
-
file_path: z
|
|
781
|
+
file_path: z
|
|
782
|
+
.string()
|
|
783
|
+
.describe(desc('Path to the existing .po.json file to patch', 'string, absolute path to .po.json file')),
|
|
747
784
|
patch: z
|
|
748
785
|
.record(z.unknown())
|
|
749
|
-
.describe('JSON merge-patch to apply (RFC 7396: null removes key, any other value replaces)'),
|
|
750
|
-
dry_run: z
|
|
786
|
+
.describe(desc('JSON merge-patch to apply (RFC 7396: null removes key, any other value replaces)', 'object, RFC 7396 merge-patch')),
|
|
787
|
+
dry_run: z
|
|
788
|
+
.boolean()
|
|
789
|
+
.default(true)
|
|
790
|
+
.describe(desc('Return merged result without writing to disk (default)', 'bool, optional; default true, skip write')),
|
|
751
791
|
validate_after: z
|
|
752
792
|
.boolean()
|
|
753
793
|
.default(true)
|
|
754
|
-
.describe('Run NX validation on merged result; blocks write if errors found'),
|
|
794
|
+
.describe(desc('Run NX validation on merged result; blocks write if errors found', 'bool, optional; default true, validate before write')),
|
|
755
795
|
},
|
|
756
796
|
}, ({ file_path, patch, dry_run, validate_after }) => {
|
|
757
797
|
const requestId = makeRequestId();
|