@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.
- package/README.md +292 -8
- package/lib/commands/provar/automation/config/validate.js.map +1 -1
- package/lib/commands/provar/automation/project/validate.d.ts +14 -0
- package/lib/commands/provar/automation/project/validate.js +69 -0
- package/lib/commands/provar/automation/project/validate.js.map +1 -0
- package/lib/commands/provar/mcp/start.d.ts +16 -0
- package/lib/commands/provar/mcp/start.js +62 -0
- package/lib/commands/provar/mcp/start.js.map +1 -0
- package/lib/commands/provar/quality-hub/connect.d.ts +5 -0
- package/lib/commands/provar/quality-hub/connect.js +12 -0
- package/lib/commands/provar/quality-hub/connect.js.map +1 -0
- package/lib/commands/provar/quality-hub/display.d.ts +5 -0
- package/lib/commands/provar/quality-hub/display.js +12 -0
- package/lib/commands/provar/quality-hub/display.js.map +1 -0
- package/lib/commands/provar/quality-hub/open.d.ts +5 -0
- package/lib/commands/provar/quality-hub/open.js +12 -0
- package/lib/commands/provar/quality-hub/open.js.map +1 -0
- package/lib/commands/provar/quality-hub/test/run/abort.d.ts +5 -0
- package/lib/commands/provar/quality-hub/test/run/abort.js +12 -0
- package/lib/commands/provar/quality-hub/test/run/abort.js.map +1 -0
- package/lib/commands/provar/quality-hub/test/run/report.d.ts +5 -0
- package/lib/commands/provar/quality-hub/test/run/report.js +12 -0
- package/lib/commands/provar/quality-hub/test/run/report.js.map +1 -0
- package/lib/commands/provar/quality-hub/test/run.d.ts +5 -0
- package/lib/commands/provar/quality-hub/test/run.js +12 -0
- package/lib/commands/provar/quality-hub/test/run.js.map +1 -0
- package/lib/commands/provar/quality-hub/testcase/retrieve.d.ts +5 -0
- package/lib/commands/provar/quality-hub/testcase/retrieve.js +12 -0
- package/lib/commands/provar/quality-hub/testcase/retrieve.js.map +1 -0
- package/lib/mcp/licensing/algasClient.d.ts +19 -0
- package/lib/mcp/licensing/algasClient.js +144 -0
- package/lib/mcp/licensing/algasClient.js.map +1 -0
- package/lib/mcp/licensing/ideDetection.d.ts +34 -0
- package/lib/mcp/licensing/ideDetection.js +179 -0
- package/lib/mcp/licensing/ideDetection.js.map +1 -0
- package/lib/mcp/licensing/index.d.ts +5 -0
- package/lib/mcp/licensing/index.js +10 -0
- package/lib/mcp/licensing/index.js.map +1 -0
- package/lib/mcp/licensing/licenseCache.d.ts +20 -0
- package/lib/mcp/licensing/licenseCache.js +79 -0
- package/lib/mcp/licensing/licenseCache.js.map +1 -0
- package/lib/mcp/licensing/licenseError.d.ts +4 -0
- package/lib/mcp/licensing/licenseError.js +15 -0
- package/lib/mcp/licensing/licenseError.js.map +1 -0
- package/lib/mcp/licensing/licenseValidator.d.ts +33 -0
- package/lib/mcp/licensing/licenseValidator.js +103 -0
- package/lib/mcp/licensing/licenseValidator.js.map +1 -0
- package/lib/mcp/logging/logger.d.ts +7 -0
- package/lib/mcp/logging/logger.js +22 -0
- package/lib/mcp/logging/logger.js.map +1 -0
- package/lib/mcp/rules/page_object_validation_rules.json +344 -0
- package/lib/mcp/rules/provar_best_practices_rules.json +3192 -0
- package/lib/mcp/schemas/common.d.ts +20 -0
- package/lib/mcp/schemas/common.js +16 -0
- package/lib/mcp/schemas/common.js.map +1 -0
- package/lib/mcp/security/pathPolicy.d.ts +14 -0
- package/lib/mcp/security/pathPolicy.js +38 -0
- package/lib/mcp/security/pathPolicy.js.map +1 -0
- package/lib/mcp/server.d.ts +5 -0
- package/lib/mcp/server.js +59 -0
- package/lib/mcp/server.js.map +1 -0
- package/lib/mcp/tools/antTools.d.ts +21 -0
- package/lib/mcp/tools/antTools.js +602 -0
- package/lib/mcp/tools/antTools.js.map +1 -0
- package/lib/mcp/tools/automationTools.d.ts +14 -0
- package/lib/mcp/tools/automationTools.js +386 -0
- package/lib/mcp/tools/automationTools.js.map +1 -0
- package/lib/mcp/tools/bestPracticesEngine.d.ts +30 -0
- package/lib/mcp/tools/bestPracticesEngine.js +632 -0
- package/lib/mcp/tools/bestPracticesEngine.js.map +1 -0
- package/lib/mcp/tools/defectTools.d.ts +15 -0
- package/lib/mcp/tools/defectTools.js +199 -0
- package/lib/mcp/tools/defectTools.js.map +1 -0
- package/lib/mcp/tools/hierarchyValidate.d.ts +139 -0
- package/lib/mcp/tools/hierarchyValidate.js +540 -0
- package/lib/mcp/tools/hierarchyValidate.js.map +1 -0
- package/lib/mcp/tools/pageObjectGenerate.d.ts +3 -0
- package/lib/mcp/tools/pageObjectGenerate.js +153 -0
- package/lib/mcp/tools/pageObjectGenerate.js.map +1 -0
- package/lib/mcp/tools/pageObjectValidate.d.ts +18 -0
- package/lib/mcp/tools/pageObjectValidate.js +420 -0
- package/lib/mcp/tools/pageObjectValidate.js.map +1 -0
- package/lib/mcp/tools/projectInspect.d.ts +3 -0
- package/lib/mcp/tools/projectInspect.js +694 -0
- package/lib/mcp/tools/projectInspect.js.map +1 -0
- package/lib/mcp/tools/projectValidateFromPath.d.ts +3 -0
- package/lib/mcp/tools/projectValidateFromPath.js +153 -0
- package/lib/mcp/tools/projectValidateFromPath.js.map +1 -0
- package/lib/mcp/tools/propertiesTools.d.ts +7 -0
- package/lib/mcp/tools/propertiesTools.js +314 -0
- package/lib/mcp/tools/propertiesTools.js.map +1 -0
- package/lib/mcp/tools/qualityHubTools.d.ts +8 -0
- package/lib/mcp/tools/qualityHubTools.js +178 -0
- package/lib/mcp/tools/qualityHubTools.js.map +1 -0
- package/lib/mcp/tools/rcaTools.d.ts +4 -0
- package/lib/mcp/tools/rcaTools.js +620 -0
- package/lib/mcp/tools/rcaTools.js.map +1 -0
- package/lib/mcp/tools/sfSpawn.d.ts +28 -0
- package/lib/mcp/tools/sfSpawn.js +50 -0
- package/lib/mcp/tools/sfSpawn.js.map +1 -0
- package/lib/mcp/tools/testCaseGenerate.d.ts +3 -0
- package/lib/mcp/tools/testCaseGenerate.js +221 -0
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -0
- package/lib/mcp/tools/testCaseValidate.d.ts +20 -0
- package/lib/mcp/tools/testCaseValidate.js +227 -0
- package/lib/mcp/tools/testCaseValidate.js.map +1 -0
- package/lib/mcp/tools/testPlanTools.d.ts +6 -0
- package/lib/mcp/tools/testPlanTools.js +311 -0
- package/lib/mcp/tools/testPlanTools.js.map +1 -0
- package/lib/mcp/tools/testPlanValidate.d.ts +2 -0
- package/lib/mcp/tools/testPlanValidate.js +75 -0
- package/lib/mcp/tools/testPlanValidate.js.map +1 -0
- package/lib/mcp/tools/testSuiteValidate.d.ts +2 -0
- package/lib/mcp/tools/testSuiteValidate.js +63 -0
- package/lib/mcp/tools/testSuiteValidate.js.map +1 -0
- package/lib/services/projectValidation.d.ts +119 -0
- package/lib/services/projectValidation.js +678 -0
- package/lib/services/projectValidation.js.map +1 -0
- package/messages/sf.provar.automation.project.validate.md +52 -0
- package/messages/sf.provar.mcp.start.md +74 -0
- package/oclif.manifest.json +1298 -1
- package/package.json +29 -15
|
@@ -0,0 +1,632 @@
|
|
|
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
|
+
/**
|
|
9
|
+
* Provar Best Practices Engine — TypeScript port of quality-hub-agents/lambda/src/validator/best_practices_engine.py
|
|
10
|
+
*
|
|
11
|
+
* Loads rules from provar_best_practices_rules.json and validates XML test cases,
|
|
12
|
+
* producing violations and a quality score using the exact same weighted deduction
|
|
13
|
+
* formula as the Lambda service to guarantee score parity between API and MCP.
|
|
14
|
+
*
|
|
15
|
+
* Scoring formula (matching Lambda exactly):
|
|
16
|
+
* score = max(0, 100 − Σ(weight × severity_mult × effective_count))
|
|
17
|
+
* severity_mult = { critical:1.0, major:0.75, minor:0.5, info:0.25 }
|
|
18
|
+
* effective_count = count > 1 ? 1 + log2(count) : 1 (diminishing returns)
|
|
19
|
+
*/
|
|
20
|
+
import { readFileSync } from 'node:fs';
|
|
21
|
+
import { fileURLToPath } from 'node:url';
|
|
22
|
+
import { dirname, join } from 'node:path';
|
|
23
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
24
|
+
// ── Rules loading (lazy, module-level singleton) ──────────────────────────────
|
|
25
|
+
const dirPath = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
let rulesConfig = null;
|
|
27
|
+
function getRulesConfig() {
|
|
28
|
+
if (!rulesConfig) {
|
|
29
|
+
try {
|
|
30
|
+
const raw = readFileSync(join(dirPath, '..', 'rules', 'provar_best_practices_rules.json'), 'utf-8');
|
|
31
|
+
rulesConfig = JSON.parse(raw);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
rulesConfig = { schemaVersion: '1.0', rules: [], scoring: { defaultMaxScore: 100 } };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return rulesConfig;
|
|
38
|
+
}
|
|
39
|
+
// ── Valid Provar API IDs (extracted from provar_test_step_schema.json) ────────
|
|
40
|
+
const VALID_API_IDS = new Set([
|
|
41
|
+
// Bundled — assertions & control flow
|
|
42
|
+
'com.provar.plugins.bundled.apis.AssertValues',
|
|
43
|
+
'com.provar.plugins.bundled.apis.If',
|
|
44
|
+
'com.provar.plugins.bundled.apis.Switch',
|
|
45
|
+
'com.provar.plugins.bundled.apis.SwitchCase',
|
|
46
|
+
'com.provar.plugins.bundled.apis.control.Break',
|
|
47
|
+
'com.provar.plugins.bundled.apis.control.Fail',
|
|
48
|
+
'com.provar.plugins.bundled.apis.control.Finally',
|
|
49
|
+
'com.provar.plugins.bundled.apis.control.ForEach',
|
|
50
|
+
'com.provar.plugins.bundled.apis.control.StepGroup',
|
|
51
|
+
'com.provar.plugins.bundled.apis.control.SetValues',
|
|
52
|
+
'com.provar.plugins.bundled.apis.control.Sleep',
|
|
53
|
+
'com.provar.plugins.bundled.apis.control.WaitFor',
|
|
54
|
+
'com.provar.plugins.bundled.apis.control.DoWhile',
|
|
55
|
+
'com.provar.plugins.bundled.apis.control.ActualResult',
|
|
56
|
+
'com.provar.plugins.bundled.apis.control.DesignStep',
|
|
57
|
+
'com.provar.plugins.bundled.apis.control.CallTest',
|
|
58
|
+
'com.provar.plugins.bundled.apis.control.TryCatchFinally',
|
|
59
|
+
// Bundled — database
|
|
60
|
+
'com.provar.plugins.bundled.apis.db.DbConnect',
|
|
61
|
+
'com.provar.plugins.bundled.apis.db.DbDelete',
|
|
62
|
+
'com.provar.plugins.bundled.apis.db.DbInsert',
|
|
63
|
+
'com.provar.plugins.bundled.apis.db.DbRead',
|
|
64
|
+
'com.provar.plugins.bundled.apis.db.DbUpdate',
|
|
65
|
+
'com.provar.plugins.bundled.apis.db.SqlQuery',
|
|
66
|
+
// Bundled — REST / SOAP
|
|
67
|
+
'com.provar.plugins.bundled.apis.restservice.WebConnect',
|
|
68
|
+
'com.provar.plugins.bundled.apis.restservice.RestRequest',
|
|
69
|
+
'com.provar.plugins.bundled.apis.restservice.SoapRequest',
|
|
70
|
+
// Bundled — messaging
|
|
71
|
+
'com.provar.plugins.bundled.apis.messaging.PublishMessage',
|
|
72
|
+
'com.provar.plugins.bundled.apis.messaging.ReceiveMessage',
|
|
73
|
+
'com.provar.plugins.bundled.apis.messaging.SendMessage',
|
|
74
|
+
'com.provar.plugins.bundled.apis.messaging.Subscribe',
|
|
75
|
+
// Bundled — BDD
|
|
76
|
+
'com.provar.plugins.bundled.apis.bdd.Given',
|
|
77
|
+
'com.provar.plugins.bundled.apis.bdd.When',
|
|
78
|
+
'com.provar.plugins.bundled.apis.bdd.Then',
|
|
79
|
+
'com.provar.plugins.bundled.apis.bdd.And',
|
|
80
|
+
'com.provar.plugins.bundled.apis.bdd.But',
|
|
81
|
+
// Bundled — I/O, strings, lists
|
|
82
|
+
'com.provar.plugins.bundled.apis.io.Read',
|
|
83
|
+
'com.provar.plugins.bundled.apis.io.Write',
|
|
84
|
+
'com.provar.plugins.bundled.apis.string.Replace',
|
|
85
|
+
'com.provar.plugins.bundled.apis.string.Split',
|
|
86
|
+
'com.provar.plugins.bundled.apis.string.Match',
|
|
87
|
+
'com.provar.plugins.bundled.apis.list.ListCompare',
|
|
88
|
+
// Provar Labs
|
|
89
|
+
'com.provar.plugins.bundled.apis.provarlabs.PageObjectCleaner',
|
|
90
|
+
// Forcedotcom — AI / agent
|
|
91
|
+
'com.provar.plugins.forcedotcom.core.testapis.ai.AIAgentSession',
|
|
92
|
+
'com.provar.plugins.forcedotcom.core.testapis.ai.AIAgentConversation',
|
|
93
|
+
'com.provar.plugins.forcedotcom.core.testapis.ai.GenerateUtterance',
|
|
94
|
+
'com.provar.plugins.forcedotcom.core.testapis.ai.IntentValidator',
|
|
95
|
+
'com.provar.plugins.forcedotcom.core.testapis.ai.ImageValidator',
|
|
96
|
+
'com.provar.plugins.forcedotcom.core.testapis.generate.GenerateTestData',
|
|
97
|
+
'com.provar.plugins.forcedotcom.core.testapis.GenerateTestCase',
|
|
98
|
+
// Forcedotcom — Apex / API
|
|
99
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexConnect',
|
|
100
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexCreateObject',
|
|
101
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexReadObject',
|
|
102
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexUpdateObject',
|
|
103
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexDeleteObject',
|
|
104
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexSoqlQuery',
|
|
105
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexSoqlBuilder',
|
|
106
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexExecute',
|
|
107
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexBulk',
|
|
108
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexApproveWorkItem',
|
|
109
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexSubmitForApproval',
|
|
110
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexConvertLead',
|
|
111
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexExtractLayout',
|
|
112
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexAssertLayout',
|
|
113
|
+
'com.provar.plugins.forcedotcom.core.testapis.ApexLogForCleanup',
|
|
114
|
+
// Forcedotcom — UI
|
|
115
|
+
'com.provar.plugins.forcedotcom.core.ui.UiConnect',
|
|
116
|
+
'com.provar.plugins.forcedotcom.core.ui.UiWithScreen',
|
|
117
|
+
'com.provar.plugins.forcedotcom.core.ui.UiDoAction',
|
|
118
|
+
'com.provar.plugins.forcedotcom.core.ui.UiAssert',
|
|
119
|
+
'com.provar.plugins.forcedotcom.core.ui.UiNavigate',
|
|
120
|
+
'com.provar.plugins.forcedotcom.core.ui.UiFill',
|
|
121
|
+
'com.provar.plugins.forcedotcom.core.ui.UiWithRow',
|
|
122
|
+
'com.provar.plugins.forcedotcom.core.ui.UiHandleAlert',
|
|
123
|
+
]);
|
|
124
|
+
/** Normalise a possibly-singular value to an array. */
|
|
125
|
+
function toArr(v) {
|
|
126
|
+
if (v == null)
|
|
127
|
+
return [];
|
|
128
|
+
return Array.isArray(v) ? v : [v];
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Recursively collect every <apiCall> element in the parsed tree.
|
|
132
|
+
* Works for flat and deeply nested structures (StepGroup, BDD, TryCatch…).
|
|
133
|
+
*/
|
|
134
|
+
function getAllApiCalls(node) {
|
|
135
|
+
const results = [];
|
|
136
|
+
function collect(obj) {
|
|
137
|
+
if (!obj || typeof obj !== 'object')
|
|
138
|
+
return;
|
|
139
|
+
if (Array.isArray(obj)) {
|
|
140
|
+
for (const item of obj)
|
|
141
|
+
collect(item);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const n = obj;
|
|
145
|
+
for (const [key, val] of Object.entries(n)) {
|
|
146
|
+
if (key === 'apiCall') {
|
|
147
|
+
for (const call of toArr(val)) {
|
|
148
|
+
if (call && typeof call === 'object')
|
|
149
|
+
results.push(call);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (val && typeof val === 'object')
|
|
153
|
+
collect(val);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
collect(node);
|
|
157
|
+
return results;
|
|
158
|
+
}
|
|
159
|
+
/** Return the DIRECT <apiCall> children of <steps> (not nested). */
|
|
160
|
+
function getDirectSteps(tc) {
|
|
161
|
+
const steps = tc['steps'];
|
|
162
|
+
if (!steps || typeof steps !== 'object')
|
|
163
|
+
return [];
|
|
164
|
+
return toArr(steps['apiCall']).filter((c) => c && typeof c === 'object');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get the text value for a named argument from an apiCall.
|
|
168
|
+
* Handles simple (class="value"), variable (class="variable"), and compound values.
|
|
169
|
+
*/
|
|
170
|
+
function getArgValue(call, argId) {
|
|
171
|
+
for (const arg of toArr(call['argument'])) {
|
|
172
|
+
if (!arg || typeof arg !== 'object')
|
|
173
|
+
continue;
|
|
174
|
+
const a = arg;
|
|
175
|
+
if (a['@_id'] !== argId)
|
|
176
|
+
continue;
|
|
177
|
+
const valElem = a['value'];
|
|
178
|
+
if (!valElem || typeof valElem !== 'object')
|
|
179
|
+
continue;
|
|
180
|
+
const vClass = valElem['@_class'];
|
|
181
|
+
if (vClass === 'variable') {
|
|
182
|
+
const firstPath = toArr(valElem['path'])[0];
|
|
183
|
+
return firstPath?.['@_element'];
|
|
184
|
+
}
|
|
185
|
+
if (vClass === 'compound') {
|
|
186
|
+
const partsNode = valElem['parts']?.['value'];
|
|
187
|
+
const texts = toArr(partsNode)
|
|
188
|
+
.filter((p) => p && typeof p === 'object')
|
|
189
|
+
.map((p) => (p)['#text'])
|
|
190
|
+
.filter(Boolean);
|
|
191
|
+
return texts.join('') || undefined;
|
|
192
|
+
}
|
|
193
|
+
return valElem['#text'] ?? undefined;
|
|
194
|
+
}
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
/** Return all <argument> elements from an apiCall. */
|
|
198
|
+
function getArguments(call) {
|
|
199
|
+
return toArr(call['argument']).filter((a) => a && typeof a === 'object');
|
|
200
|
+
}
|
|
201
|
+
/** Return true if the apiCall has a <tags><string>disabled</string></tags>. */
|
|
202
|
+
function isDisabledCall(call) {
|
|
203
|
+
const tags = call['tags'];
|
|
204
|
+
if (!tags || typeof tags !== 'object')
|
|
205
|
+
return false;
|
|
206
|
+
const strings = toArr(tags['string']);
|
|
207
|
+
return strings.some((s) => typeof s === 'string' && s.trim().toLowerCase() === 'disabled');
|
|
208
|
+
}
|
|
209
|
+
// ── Scoring formula (exact Lambda match) ─────────────────────────────────────
|
|
210
|
+
const SEVERITY_MULT = {
|
|
211
|
+
critical: 1.0, major: 0.75, minor: 0.5, info: 0.25,
|
|
212
|
+
};
|
|
213
|
+
export function calculateBPScore(violations) {
|
|
214
|
+
let total = 0;
|
|
215
|
+
for (const v of violations) {
|
|
216
|
+
const mult = SEVERITY_MULT[v.severity] ?? 0.5;
|
|
217
|
+
const rawCount = v.count ?? 1;
|
|
218
|
+
const effectiveCount = rawCount > 1 ? 1 + Math.log2(rawCount) : 1;
|
|
219
|
+
total += v.weight * mult * effectiveCount;
|
|
220
|
+
}
|
|
221
|
+
return Math.max(0, Math.round((100 - total) * 100) / 100);
|
|
222
|
+
}
|
|
223
|
+
// ── Violation factory ─────────────────────────────────────────────────────────
|
|
224
|
+
function makeViolation(rule, message, count) {
|
|
225
|
+
const v = {
|
|
226
|
+
rule_id: rule.id,
|
|
227
|
+
name: rule.name,
|
|
228
|
+
description: rule.description,
|
|
229
|
+
category: rule.category,
|
|
230
|
+
severity: rule.severity,
|
|
231
|
+
weight: rule.weight,
|
|
232
|
+
message,
|
|
233
|
+
recommendation: rule.recommendation,
|
|
234
|
+
applies_to: rule.appliesTo ?? [],
|
|
235
|
+
};
|
|
236
|
+
if (count !== undefined && count > 1)
|
|
237
|
+
v.count = count;
|
|
238
|
+
return v;
|
|
239
|
+
}
|
|
240
|
+
// ── Validator implementations ─────────────────────────────────────────────────
|
|
241
|
+
/** API-UNKNOWN-001 — check all apiCall apiId values against the known-valid set. */
|
|
242
|
+
function validateUnknownApiId(tc, rule) {
|
|
243
|
+
const calls = getAllApiCalls(tc);
|
|
244
|
+
const unknowns = [];
|
|
245
|
+
for (const call of calls) {
|
|
246
|
+
const apiId = call['@_apiId'];
|
|
247
|
+
if (!apiId)
|
|
248
|
+
continue;
|
|
249
|
+
// Custom and third-party APIs are always allowed
|
|
250
|
+
if (apiId.startsWith('customapis.') || apiId.includes('.customapis.'))
|
|
251
|
+
continue;
|
|
252
|
+
if (!VALID_API_IDS.has(apiId)) {
|
|
253
|
+
unknowns.push({ apiId, tid: call['@_testItemId'] });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (!unknowns.length)
|
|
257
|
+
return null;
|
|
258
|
+
const MAX = 5;
|
|
259
|
+
const msgs = unknowns.slice(0, 3).map((v) => `'${v.apiId}'${v.tid ? ` (testItemId=${v.tid})` : ''}`);
|
|
260
|
+
let message = `Unknown apiId(s) detected — these APIs do not exist in Provar: ${msgs.join('; ')}`;
|
|
261
|
+
if (unknowns.length > 3)
|
|
262
|
+
message += ` (+${unknowns.length - 3} more)`;
|
|
263
|
+
return makeViolation(rule, message, Math.min(unknowns.length, MAX));
|
|
264
|
+
}
|
|
265
|
+
/** VALID-GUID-001 — test case must have at least one valid identifier. */
|
|
266
|
+
function validateValidIdentifier(tc, rule) {
|
|
267
|
+
const guid = tc['@_guid'];
|
|
268
|
+
const id = tc['@_id'];
|
|
269
|
+
const rid = tc['@_registryId'];
|
|
270
|
+
if (!guid && !id && !rid) {
|
|
271
|
+
return makeViolation(rule, 'Test case missing valid identifier (guid, id, or registryId)');
|
|
272
|
+
}
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
/** VALID-STEPS-001 / mustExist — element must exist (and not be empty). */
|
|
276
|
+
function validateMustExist(tc, rule) {
|
|
277
|
+
const target = rule.check['target'] ?? '';
|
|
278
|
+
const elementName = target.split('.').pop() ?? target;
|
|
279
|
+
const elem = tc[elementName];
|
|
280
|
+
if (elem === undefined || elem === null) {
|
|
281
|
+
return makeViolation(rule, `${target} is missing`);
|
|
282
|
+
}
|
|
283
|
+
if (typeof elem === 'object' && !Array.isArray(elem)) {
|
|
284
|
+
const obj = elem;
|
|
285
|
+
const hasText = typeof obj['#text'] === 'string' && obj['#text'].trim().length > 0;
|
|
286
|
+
const hasChildren = Object.keys(obj).some((k) => !k.startsWith('@_') && k !== '#text');
|
|
287
|
+
if (!hasText && !hasChildren) {
|
|
288
|
+
return makeViolation(rule, `${target} exists but is empty`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else if (typeof elem === 'string' && !elem.trim()) {
|
|
292
|
+
return makeViolation(rule, `${target} exists but is empty`);
|
|
293
|
+
}
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
/** STRUCT-SUMMARY-001 / mustExistAndNotEmpty — same as mustExist. */
|
|
297
|
+
const validateMustExistAndNotEmpty = validateMustExist;
|
|
298
|
+
/** STEP-ITEMID-001 — all testItemId attributes must be positive integers. */
|
|
299
|
+
function validateWholeNumberTestItemId(tc, rule) {
|
|
300
|
+
const calls = getAllApiCalls(tc);
|
|
301
|
+
const invalid = [];
|
|
302
|
+
for (const call of calls) {
|
|
303
|
+
const tid = call['@_testItemId'];
|
|
304
|
+
if (!tid)
|
|
305
|
+
continue;
|
|
306
|
+
const n = parseInt(tid, 10);
|
|
307
|
+
if (isNaN(n) || n <= 0 || String(n) !== tid.trim()) {
|
|
308
|
+
invalid.push(tid);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (!invalid.length)
|
|
312
|
+
return null;
|
|
313
|
+
return makeViolation(rule, `Invalid testItemId values: ${invalid.slice(0, 3).join(', ')}`, invalid.length);
|
|
314
|
+
}
|
|
315
|
+
/** VAR-NAMING-001 — variable names must match the identifier pattern. */
|
|
316
|
+
function validateVariableNaming(tc, rule) {
|
|
317
|
+
const patternStr = rule.check['pattern'] ?? '^[A-Za-z_][A-Za-z0-9_]*$';
|
|
318
|
+
const re = new RegExp(patternStr);
|
|
319
|
+
const violations = [];
|
|
320
|
+
function checkName(name, label) {
|
|
321
|
+
if (name && !re.test(name) && violations.length < 7) {
|
|
322
|
+
violations.push(`${label} '${name}'`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const calls = getAllApiCalls(tc);
|
|
326
|
+
for (const call of calls) {
|
|
327
|
+
const apiId = call['@_apiId'];
|
|
328
|
+
// Result name attributes on the apiCall element itself
|
|
329
|
+
for (const attr of ['@_resultName', '@_resultIdName', '@_sfUiTargetResultName']) {
|
|
330
|
+
const v = call[attr];
|
|
331
|
+
if (v)
|
|
332
|
+
checkName(v, attr.slice(2));
|
|
333
|
+
}
|
|
334
|
+
// SetValues variable names
|
|
335
|
+
if (apiId === 'com.provar.plugins.bundled.apis.control.SetValues') {
|
|
336
|
+
const nvContainer = call['namedValues'];
|
|
337
|
+
if (nvContainer && typeof nvContainer === 'object') {
|
|
338
|
+
for (const nv of toArr(nvContainer['namedValue'])) {
|
|
339
|
+
if (!nv || typeof nv !== 'object')
|
|
340
|
+
continue;
|
|
341
|
+
const name = (nv)['@_name'];
|
|
342
|
+
if (name && !['valuePath', 'value', 'valueScope'].includes(name)) {
|
|
343
|
+
checkName(name, 'SetValues variable');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (!violations.length)
|
|
350
|
+
return null;
|
|
351
|
+
const shown = violations.slice(0, 3);
|
|
352
|
+
let msg = shown.join('; ');
|
|
353
|
+
if (violations.length > 3)
|
|
354
|
+
msg += ` (+${violations.length - 3} more)`;
|
|
355
|
+
return makeViolation(rule, msg, violations.length);
|
|
356
|
+
}
|
|
357
|
+
/** STRUCT-GROUP-001 — direct steps should be wrapped in grouping elements. */
|
|
358
|
+
function validateMustAllBeInGroups(tc, rule) {
|
|
359
|
+
const check = rule.check;
|
|
360
|
+
const acceptBdd = check['acceptBddSteps'] ?? true;
|
|
361
|
+
const acceptFinally = check['acceptFinallyBlocks'] ?? true;
|
|
362
|
+
const GROUPING_IDS = new Set(['com.provar.plugins.bundled.apis.control.StepGroup']);
|
|
363
|
+
if (acceptBdd) {
|
|
364
|
+
for (const id of [
|
|
365
|
+
'com.provar.plugins.bundled.apis.bdd.Given',
|
|
366
|
+
'com.provar.plugins.bundled.apis.bdd.When',
|
|
367
|
+
'com.provar.plugins.bundled.apis.bdd.Then',
|
|
368
|
+
'com.provar.plugins.bundled.apis.bdd.And',
|
|
369
|
+
'com.provar.plugins.bundled.apis.bdd.But',
|
|
370
|
+
])
|
|
371
|
+
GROUPING_IDS.add(id);
|
|
372
|
+
}
|
|
373
|
+
if (acceptFinally)
|
|
374
|
+
GROUPING_IDS.add('com.provar.plugins.bundled.apis.control.Finally');
|
|
375
|
+
const directSteps = getDirectSteps(tc);
|
|
376
|
+
if (directSteps.length < 5)
|
|
377
|
+
return null; // exemption: tiny tests
|
|
378
|
+
let apiCallCount = 0;
|
|
379
|
+
const ungrouped = [];
|
|
380
|
+
for (const step of directSteps) {
|
|
381
|
+
const apiId = step['@_apiId'] ?? '';
|
|
382
|
+
if (/\.apex[a-z]|\.soql[a-z]|\.rest[a-z]|\.db[A-Z]|\.web[A-Z]/i.test(apiId))
|
|
383
|
+
apiCallCount++;
|
|
384
|
+
if (!GROUPING_IDS.has(apiId)) {
|
|
385
|
+
const title = step['@_title'] ??
|
|
386
|
+
step['@_name'] ??
|
|
387
|
+
apiId.split('.').pop() ?? '';
|
|
388
|
+
ungrouped.push(title.substring(0, 30));
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// Exemption: API-heavy tests (≥80% are API calls)
|
|
392
|
+
if (directSteps.length > 0 && apiCallCount / directSteps.length >= 0.8)
|
|
393
|
+
return null;
|
|
394
|
+
if (ungrouped.length > 3) {
|
|
395
|
+
return makeViolation(rule, `${ungrouped.length} steps not in groups: ${ungrouped.slice(0, 3).join(', ')}...`);
|
|
396
|
+
}
|
|
397
|
+
return null;
|
|
398
|
+
}
|
|
399
|
+
/** STEP-DISABLED-001 — flag any apiCall tagged as disabled. */
|
|
400
|
+
function validateDisabledStep(tc, rule) {
|
|
401
|
+
for (const call of getAllApiCalls(tc)) {
|
|
402
|
+
if (!isDisabledCall(call))
|
|
403
|
+
continue;
|
|
404
|
+
const tid = call['@_testItemId'];
|
|
405
|
+
const apiId = call['@_apiId'] ?? 'unknown';
|
|
406
|
+
const name = call['@_name'] ??
|
|
407
|
+
call['@_title'] ??
|
|
408
|
+
apiId.split('.').pop() ?? 'unnamed';
|
|
409
|
+
return makeViolation(rule, `Disabled step found: "${name}"${tid ? ` (testItemId=${tid})` : ''}`);
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
// Arguments that should NOT be checked for duplicate literals
|
|
414
|
+
const LITERAL_EXCLUDE_ARGS = new Set([
|
|
415
|
+
'uiConnectionName', 'apexConnectionName', 'resultScope', 'resultName',
|
|
416
|
+
'sfUiTargetResultScope', 'sfUiTargetResultName', 'objectType', 'connectionId',
|
|
417
|
+
'connectionName', 'comparisonType', 'assertionType', 'httpMethod', 'controlType',
|
|
418
|
+
'loopType', 'navigate', 'windowSelection', 'windowSize', 'alreadyOpenBehaviour',
|
|
419
|
+
'captureBefore', 'captureAfter', 'interactionDescription', 'targetDescription', 'title',
|
|
420
|
+
]);
|
|
421
|
+
const METADATA_FIELDS = new Set([
|
|
422
|
+
'status', 'stage', 'recordtype', 'recordtypeid', 'type', 'subtype', 'category',
|
|
423
|
+
'priority', 'source', 'origin', 'reason', 'result', 'state', 'severity',
|
|
424
|
+
'casestatus', 'leadstatus', 'opportunitystage', 'accounttype', 'industry',
|
|
425
|
+
]);
|
|
426
|
+
const DEFAULT_LITERAL_VALUES = new Set([
|
|
427
|
+
'0', '1', '0.0', '1.0', '', 'N/A', 'n/a', 'NA', 'None', 'Default', 'default',
|
|
428
|
+
'Test', 'Global', 'Local', 'Folder', 'GroupStep',
|
|
429
|
+
]);
|
|
430
|
+
/** DDT-VAR-001 — detect hardcoded literal values repeated ≥2 times. */
|
|
431
|
+
// eslint-disable-next-line complexity
|
|
432
|
+
function validateDetectDuplicatesLiterals(tc, rule) {
|
|
433
|
+
const literals = [];
|
|
434
|
+
for (const call of getAllApiCalls(tc)) {
|
|
435
|
+
for (const arg of getArguments(call)) {
|
|
436
|
+
const argId = arg['@_id'] ?? '';
|
|
437
|
+
if (LITERAL_EXCLUDE_ARGS.has(argId))
|
|
438
|
+
continue;
|
|
439
|
+
if (METADATA_FIELDS.has(argId.toLowerCase()))
|
|
440
|
+
continue;
|
|
441
|
+
const valElem = arg['value'];
|
|
442
|
+
if (!valElem || typeof valElem !== 'object')
|
|
443
|
+
continue;
|
|
444
|
+
if (valElem['@_class'] !== 'value')
|
|
445
|
+
continue; // skip variables/compounds
|
|
446
|
+
const text = (valElem['#text'] ?? '').trim();
|
|
447
|
+
if (!text || text.length <= 3)
|
|
448
|
+
continue;
|
|
449
|
+
if (DEFAULT_LITERAL_VALUES.has(text))
|
|
450
|
+
continue;
|
|
451
|
+
if (text.toLowerCase() === 'true' || text.toLowerCase() === 'false')
|
|
452
|
+
continue;
|
|
453
|
+
if (text.startsWith('{') && text.endsWith('}'))
|
|
454
|
+
continue; // inline variable ref
|
|
455
|
+
literals.push(text);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
const counts = new Map();
|
|
459
|
+
for (const lit of literals)
|
|
460
|
+
counts.set(lit, (counts.get(lit) ?? 0) + 1);
|
|
461
|
+
const dups = [...counts.entries()].filter(([, c]) => c >= 2);
|
|
462
|
+
if (!dups.length)
|
|
463
|
+
return null;
|
|
464
|
+
const MAX = 3;
|
|
465
|
+
const examples = dups.slice(0, MAX).map(([v, c]) => `'${v}' (×${c})`);
|
|
466
|
+
const msg = dups.length > MAX
|
|
467
|
+
? `Found ${dups.length} hardcoded values used multiple times (showing ${MAX}): ${examples.join(', ')}`
|
|
468
|
+
: `Found ${dups.length} hardcoded value(s) used multiple times: ${examples.join(', ')}`;
|
|
469
|
+
return makeViolation(rule, msg, Math.min(dups.length, MAX));
|
|
470
|
+
}
|
|
471
|
+
/** NC-FOLDER-001 / NC-PARAM-001 — regex check on target value. */
|
|
472
|
+
function validateRegex(tc, rule, metadata) {
|
|
473
|
+
const check = rule.check;
|
|
474
|
+
const target = check['target'] ?? '';
|
|
475
|
+
const pattern = check['pattern'] ?? '';
|
|
476
|
+
if (!pattern)
|
|
477
|
+
return null;
|
|
478
|
+
const targetType = target.split('.')[0];
|
|
479
|
+
let value;
|
|
480
|
+
if (targetType === 'testCase') {
|
|
481
|
+
value = metadata.testName;
|
|
482
|
+
}
|
|
483
|
+
// folder.name requires filesystem paths — not available in MCP context, skip silently
|
|
484
|
+
// parameter.name — check first argument ID found
|
|
485
|
+
else if (targetType === 'parameter') {
|
|
486
|
+
outer: for (const call of getAllApiCalls(tc)) {
|
|
487
|
+
for (const arg of getArguments(call)) {
|
|
488
|
+
const argId = arg['@_id'];
|
|
489
|
+
if (argId) {
|
|
490
|
+
value = argId;
|
|
491
|
+
break outer;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (!value)
|
|
497
|
+
return null;
|
|
498
|
+
try {
|
|
499
|
+
if (!new RegExp(pattern).test(value)) {
|
|
500
|
+
return makeViolation(rule, `${target} '${value}' does not match expected naming pattern`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
// invalid regex in rules — silently skip
|
|
505
|
+
}
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
// Steps that WRITE to resultName (not just read)
|
|
509
|
+
const RESULT_WRITE_STEPS = new Set([
|
|
510
|
+
'ApexConnect', 'UiConnect', 'DbConnect', 'WebConnect',
|
|
511
|
+
'ApexCreateObject', 'ApexUpdateObject', 'ApexReadObject',
|
|
512
|
+
'ApexSoqlQuery', 'ApexSoqlBuilder',
|
|
513
|
+
'RestRequest', 'SoapRequest',
|
|
514
|
+
'SqlQuery', 'DbInsert', 'DbRead', 'DbUpdate',
|
|
515
|
+
'UiWithScreen', 'UiWithRow',
|
|
516
|
+
]);
|
|
517
|
+
// Patterns to exclude from result-name tracking
|
|
518
|
+
const RESULT_EXCLUDE_PATTERNS = [
|
|
519
|
+
'StepGroup', 'control.If', 'control.While', 'control.ForEach',
|
|
520
|
+
'control.Try', 'control.Finally', 'control.SetValues',
|
|
521
|
+
];
|
|
522
|
+
/** APEX-RESULTNAME-001 — detect duplicate resultNames within the same scope. */
|
|
523
|
+
function validateUniqueResultNames(tc, rule) {
|
|
524
|
+
// scope → resultName → list of step types that wrote it
|
|
525
|
+
const byScope = new Map();
|
|
526
|
+
for (const call of getAllApiCalls(tc)) {
|
|
527
|
+
if (isDisabledCall(call))
|
|
528
|
+
continue;
|
|
529
|
+
const apiId = call['@_apiId'] ?? '';
|
|
530
|
+
if (RESULT_EXCLUDE_PATTERNS.some((p) => apiId.includes(p)))
|
|
531
|
+
continue;
|
|
532
|
+
const resultName = (getArgValue(call, 'resultName') ?? '').trim();
|
|
533
|
+
if (!resultName)
|
|
534
|
+
continue;
|
|
535
|
+
const scope = (getArgValue(call, 'resultScope') ?? 'Test').trim() || 'Test';
|
|
536
|
+
const stepType = apiId.split('.').pop() ?? 'Unknown';
|
|
537
|
+
if (!RESULT_WRITE_STEPS.has(stepType))
|
|
538
|
+
continue;
|
|
539
|
+
if (!byScope.has(scope))
|
|
540
|
+
byScope.set(scope, new Map());
|
|
541
|
+
const names = byScope.get(scope);
|
|
542
|
+
if (!names.has(resultName))
|
|
543
|
+
names.set(resultName, []);
|
|
544
|
+
names.get(resultName).push(stepType);
|
|
545
|
+
}
|
|
546
|
+
const violations = [];
|
|
547
|
+
for (const [scope, names] of byScope) {
|
|
548
|
+
for (const [name, steps] of names) {
|
|
549
|
+
if (steps.length > 1) {
|
|
550
|
+
violations.push(`'${name}' in ${scope} scope: written ${steps.length} times (${steps.slice(0, 2).join(', ')})`);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
if (!violations.length)
|
|
555
|
+
return null;
|
|
556
|
+
const MAX = 3;
|
|
557
|
+
let msg = violations.slice(0, 2).join('; ');
|
|
558
|
+
if (violations.length > 2)
|
|
559
|
+
msg += ` (and ${violations.length - 2} more)`;
|
|
560
|
+
return makeViolation(rule, msg, Math.min(violations.length, MAX));
|
|
561
|
+
}
|
|
562
|
+
const VALIDATOR_REGISTRY = {
|
|
563
|
+
unknownApiId: validateUnknownApiId,
|
|
564
|
+
validIdentifier: validateValidIdentifier,
|
|
565
|
+
mustExist: validateMustExist,
|
|
566
|
+
mustExistAndNotEmpty: validateMustExistAndNotEmpty,
|
|
567
|
+
wholeNumberTestItemId: validateWholeNumberTestItemId,
|
|
568
|
+
variableNaming: validateVariableNaming,
|
|
569
|
+
mustAllBeInGroups: validateMustAllBeInGroups,
|
|
570
|
+
disabledStep: validateDisabledStep,
|
|
571
|
+
detectDuplicatesLiterals: validateDetectDuplicatesLiterals,
|
|
572
|
+
uniqueResultNames: validateUniqueResultNames,
|
|
573
|
+
// 'regex' is dispatched separately (needs metadata)
|
|
574
|
+
};
|
|
575
|
+
// ── XML parser (shared settings) ─────────────────────────────────────────────
|
|
576
|
+
const XML_PARSER = new XMLParser({
|
|
577
|
+
ignoreAttributes: false,
|
|
578
|
+
attributeNamePrefix: '@_',
|
|
579
|
+
parseAttributeValue: false,
|
|
580
|
+
});
|
|
581
|
+
// ── Main entry point ──────────────────────────────────────────────────────────
|
|
582
|
+
/**
|
|
583
|
+
* Run all active best-practice rules against a single test case XML string.
|
|
584
|
+
*
|
|
585
|
+
* @param xmlContent Raw XML of the test case file.
|
|
586
|
+
* @param metadata Optional context (testName used for regex rules).
|
|
587
|
+
* @returns Quality score (0–100) + list of violations.
|
|
588
|
+
*/
|
|
589
|
+
export function runBestPractices(xmlContent, metadata = {}) {
|
|
590
|
+
let parsed;
|
|
591
|
+
try {
|
|
592
|
+
parsed = XML_PARSER.parse(xmlContent);
|
|
593
|
+
}
|
|
594
|
+
catch {
|
|
595
|
+
return { quality_score: 0, violations: [], rules_evaluated: 0 };
|
|
596
|
+
}
|
|
597
|
+
const tc = parsed['testCase'];
|
|
598
|
+
if (!tc || typeof tc !== 'object') {
|
|
599
|
+
return { quality_score: 0, violations: [], rules_evaluated: 0 };
|
|
600
|
+
}
|
|
601
|
+
const config = getRulesConfig();
|
|
602
|
+
const violations = [];
|
|
603
|
+
let rulesEvaluated = 0;
|
|
604
|
+
for (const rule of config.rules) {
|
|
605
|
+
const checkType = rule.check?.type;
|
|
606
|
+
if (!checkType)
|
|
607
|
+
continue;
|
|
608
|
+
// Schema-compliance rules are handled by testCaseValidate.ts — skip here
|
|
609
|
+
if (checkType === 'disabled')
|
|
610
|
+
continue;
|
|
611
|
+
// Weight-0 rules are purely informational — skip from scoring
|
|
612
|
+
if (rule.weight === 0)
|
|
613
|
+
continue;
|
|
614
|
+
let violation;
|
|
615
|
+
if (checkType === 'regex') {
|
|
616
|
+
rulesEvaluated++;
|
|
617
|
+
violation = validateRegex(tc, rule, metadata);
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
const fn = VALIDATOR_REGISTRY[checkType];
|
|
621
|
+
if (!fn)
|
|
622
|
+
continue; // unimplemented validator → silently pass
|
|
623
|
+
rulesEvaluated++;
|
|
624
|
+
violation = fn(tc, rule);
|
|
625
|
+
}
|
|
626
|
+
if (violation)
|
|
627
|
+
violations.push(violation);
|
|
628
|
+
}
|
|
629
|
+
const quality_score = calculateBPScore(violations);
|
|
630
|
+
return { quality_score, violations, rules_evaluated: rulesEvaluated };
|
|
631
|
+
}
|
|
632
|
+
//# sourceMappingURL=bestPracticesEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bestPracticesEngine.js","sourceRoot":"","sources":["../../../src/mcp/tools/bestPracticesEngine.ts"],"names":[],"mappings":"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"}
|