@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
@@ -13,6 +13,7 @@ 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
15
  import { validateTestCase } from './testCaseValidate.js';
16
+ import { desc } from './descHelper.js';
16
17
  // ── Shorthand → fully-qualified API ID map ────────────────────────────────────
17
18
  // Provar runtime requires fully-qualified IDs. Shorthand forms are accepted here
18
19
  // and expanded automatically before writing XML.
@@ -54,6 +55,14 @@ function buildStepWarnings(steps) {
54
55
  'To assert SOQL results use either: (a) a ForEach loop over the result list with AssertValues inside, ' +
55
56
  'or (b) a SetValues step to extract a specific field into a named variable, then assert that variable.');
56
57
  }
58
+ // D7: Cleanup steps placed after a potential failure point are skipped when stopOnError=false.
59
+ if (resolvedIds.includes(SHORTHAND_TO_FQID['ApexDeleteObject'] ?? '')) {
60
+ warnings.push('ApexDeleteObject detected (likely cleanup): with stopOnError=false Provar skips all steps after ' +
61
+ 'the first failure, so cleanup steps placed at the end of the test will NOT run when an earlier ' +
62
+ 'step fails — leaving orphaned records in the org. ' +
63
+ 'Wrap cleanup in a Provar TearDown callable, or place create/delete inside the same UiWithScreen ' +
64
+ 'clause so both run as a unit regardless of failure.');
65
+ }
57
66
  return warnings;
58
67
  }
59
68
  // ── Schema ────────────────────────────────────────────────────────────────────
@@ -69,58 +78,150 @@ const StepSchema = z.object({
69
78
  attributes: z
70
79
  .record(z.string())
71
80
  .default({})
72
- .describe('Step argument values as key/value pairs. Written as <arguments><argument id="key"><value .../></argument></arguments> ' +
73
- 'inside the <apiCall> element — the format Provar runtime requires. ' +
81
+ .describe('Step argument values as key/value pairs. Written as <arguments><argument id="key"><value .../></argument></arguments>. ' +
74
82
  'Do NOT rely on XML attributes on <apiCall>; the runtime silently ignores them. ' +
75
- 'Example: { "connectionName": "MyOrg", "objectApiName": "Opportunity" }'),
83
+ 'Special value conventions (applied automatically by the generator): ' +
84
+ '(1) Variable references: wrap the name in braces, e.g. "{MyVar}" → emitted as class="variable" <path element="MyVar"/>. ' +
85
+ ' Dotted paths are also supported: "{Obj.Field}" → two <path> elements. ' +
86
+ '(2) SetValues: pass each variable name and its value as a flat key/value pair; ' +
87
+ ' the generator wraps them in <value class="valueList"><namedValues>...</namedValues></value> automatically. ' +
88
+ ' Example: { "testCaseName": "TC_New", "testType": "Acceptance testing" } ' +
89
+ '(3) AssertValues: pass assertion arguments as flat key/value pairs; emitted as flat <argument> elements, NOT wrapped in valueList/namedValues. ' +
90
+ '(4) target argument (UiWithScreen / UiWithRow): pass the sf:ui:target or ui:pageobject:target URI; ' +
91
+ ' emitted as class="uiTarget" uri="...". ' +
92
+ '(5) locator argument (UiDoAction / UiAssert): pass the locator URI; emitted as class="uiLocator" uri="...". ' +
93
+ 'All other string values use class="value" valueClass="string".'),
76
94
  });
77
95
  const TOOL_DESCRIPTION = [
96
+ // ── Construction contract (READ FIRST — PDX-482) ──────────────────────────────
97
+ // The PDX-479 regression happened when authoring guidance steered agents toward
98
+ // a per-step construction pattern via repeated step_edit calls. These three
99
+ // lines make the single-call contract authoritative at the call site so it
100
+ // outweighs any conflicting prompt/resource guidance and survives doc drift.
101
+ 'Construction pattern: pass the FULL step tree in a single call via the steps[] array.',
102
+ 'Do NOT call this tool with an empty steps[] and then append via provar_testcase_step_edit — that pattern drops scenarios, flattens nesting, and produces inconsistent step types.',
103
+ 'provar_testcase_step_edit is for AMENDING an existing validated test case (single-step add, attribute fix, debug edit), not for CONSTRUCTING one from scratch. If you find yourself about to call this tool with steps=[] intending to add steps in subsequent tool calls, stop and assemble the full step list first.',
104
+ // ── Existing description (unchanged below) ───────────────────────────────────
78
105
  'Generate a Provar XML test case skeleton with proper UUID v4 guids, sequential testItemId values, and <steps> structure.',
79
106
  'Returns XML content. Writes to disk only when dry_run=false.',
107
+ 'Generated structure: <?xml version="1.0" encoding="UTF-8" standalone="no"?> with <testCase guid="..." id="1" registryId="..."> (id is always the integer literal "1" as required by the Provar runtime), a <summary/> child, then <steps>.',
108
+ 'URI-aware generation: use target_uri to control the XML nesting structure.',
109
+ ' - sf:ui:target (or omit target_uri) → flat Salesforce XML structure (existing behaviour).',
110
+ ' - ui:pageobject:target?pageId=pageobjects.PageClass → wraps all steps in a UiWithScreen element targeting that non-SF page object.',
80
111
  'API IDs: shorthand forms (e.g. UiConnect, ApexSoqlQuery) are automatically expanded to fully-qualified IDs required by the Provar runtime.',
81
112
  'Step arguments: attributes are emitted as <arguments><argument id="..."><value .../></argument></arguments> — the only format the Provar runtime processes.',
82
113
  'Shorthand XML attributes on <apiCall> are silently ignored at runtime; always supply arguments via the attributes map.',
114
+ 'ApexSoqlQuery argument IDs: soqlQuery (the SOQL SELECT statement), resultListName (binds result list to a variable), apexConnectionName (named connection), resultScope (optional).',
83
115
  'Data-driven note: <dataTable> only iterates rows when the test case runs via a test plan instance (.testinstance).',
84
116
  'Running directly via the provardx testCase property resolves all data table variables as null.',
85
- 'Use provar.testplan.add-instance to wire into a plan for data-driven execution.',
117
+ 'Use provar_testplan_add-instance to wire into a plan for data-driven execution.',
86
118
  'ApexReadObject requires field names in attributes; omitting them produces MALFORMED_QUERY. Prefer ApexSoqlQuery.',
87
119
  'AssertValues on SOQL results: index paths like "ResultList[0].Field" are not supported.',
88
120
  'Use ForEach to iterate the result list, or SetValues to extract a field into a variable first.',
89
- 'Validation: the response always includes a validation field with is_valid, validity_score, quality_score, and any structural issues — check this before attempting to run the test case.',
121
+ 'SetValues: pass named variable values as flat key/value pairs in attributes; ' +
122
+ 'the generator wraps them in <value class="valueList"><namedValues>...</namedValues></value> automatically.',
123
+ 'AssertValues: pass assertion values as flat key/value argument pairs; emitted as flat arguments, NOT wrapped in namedValues. ' +
124
+ 'If AssertValues uses namedValues-shaped content, validation reports warning ASSERT-001.',
125
+ 'Variable references: pass values as "{VarName}" (braces); emitted as class="variable" <path element="VarName"/>.',
126
+ 'target argument (UiWithScreen/UiWithRow): pass the URI value; emitted as class="uiTarget" uri="...".',
127
+ 'locator argument (UiDoAction/UiAssert): pass the URI value; emitted as class="uiLocator" uri="...".',
128
+ 'Edit page objects: action=Edit targets require a compiled page object for the SF object. ' +
129
+ 'If none exists in the project page-objects directory, the locator binding will fail at runtime. ' +
130
+ 'For objects without a compiled Edit page object, use inline edit instead: sfIleActivate to activate the field, ' +
131
+ 'set the value, then SaveEdit binding on the Record view screen.',
132
+ 'Provar IDE warning: opening a generated test case in Provar IDE injects empty <argument id="..."/> elements for known parameter IDs. ' +
133
+ 'If the empty element appears after a populated one, the empty version wins at runtime. ' +
134
+ 'Always check for and remove duplicate empty arguments after any IDE open/save cycle before re-running.',
135
+ 'Cleanup warning: ApexDeleteObject steps near end of test will be skipped if an earlier step fails (stopOnError=false). Use a TearDown callable.',
136
+ 'Validation: when validate_after_edit=true (default) the response includes a validation field and returns TESTCASE_INVALID if the generated XML fails structural checks.',
137
+ 'Grounding: call provar_qualityhub_examples_retrieve before generating to get corpus examples for the scenario — correct XML structure for the step types you need.',
138
+ 'If the response has count: 0 with a warning field (API unavailable or not configured), fall back: read the provar://docs/step-reference MCP resource for step types and attribute formats, then continue.',
90
139
  ].join(' ');
91
140
  export function registerTestCaseGenerate(server, config) {
92
- server.tool('provar.testcase.generate', TOOL_DESCRIPTION, {
93
- test_case_name: z.string().describe('Test case name (human-readable label)'),
94
- test_case_id: z
95
- .string()
96
- .optional()
97
- .describe('Explicit test case id; auto-generated UUID v4 if omitted'),
98
- steps: z.array(StepSchema).default([]).describe('Ordered list of test steps'),
99
- output_path: z
100
- .string()
101
- .optional()
102
- .describe('Suggested file path for the .xml file (returned in response)'),
103
- overwrite: z.boolean().default(false).describe('Overwrite if output_path file already exists'),
104
- dry_run: z
105
- .boolean()
106
- .default(true)
107
- .describe('true = return XML only (default); false = write to output_path'),
108
- idempotency_key: z
109
- .string()
110
- .optional()
111
- .describe('Caller-provided key echoed back for deduplication tracking'),
141
+ server.registerTool('provar_testcase_generate', {
142
+ // PDX-484: carry the construct-vs-amend contract into the `title:` field
143
+ // because many MCP clients (Claude Desktop tool-picker chips, Cursor audit
144
+ // pane, inline tool-call references in chat threads) render only the title.
145
+ // Without the "(full steps in one call)" suffix an agent that reads only
146
+ // the title surface gets zero PDX-479 protection. Length: 43 chars —
147
+ // well under the ~50 char comfort threshold for the clients we test.
148
+ title: 'Generate Test Case (full steps in one call)',
149
+ description: desc(TOOL_DESCRIPTION,
150
+ // PDX-482: the compact form must also carry the construction contract,
151
+ // otherwise PROVAR_MCP_SCHEMA_MODE=compact is a regression highway
152
+ // the LLM would see a contract-free one-liner and could fall back to
153
+ // the multi-call pattern that caused PDX-479.
154
+ 'Generate a Provar test case in ONE call with the FULL steps[] tree. ' +
155
+ 'Do NOT call with steps=[] then append via provar_testcase_step_edit ' +
156
+ '(step_edit is for AMENDING existing test cases, not for CONSTRUCTING new ones).'),
157
+ inputSchema: {
158
+ test_case_name: z.string().describe(desc('Test case name (human-readable label)', 'string, test case name')),
159
+ steps: z
160
+ .array(StepSchema)
161
+ .default([])
162
+ .describe(desc('Ordered list of test steps. Pass the COMPLETE step tree for the test case in a single call — ' +
163
+ 'do not call this tool with an empty array intending to append via provar_testcase_step_edit ' +
164
+ '(that pattern is for amendments only and produces structurally invalid test cases when used to construct).', 'array, optional; FULL ordered step tree in one call')),
165
+ target_uri: z
166
+ .string()
167
+ .optional()
168
+ .describe(desc('Page object URI that determines the XML nesting structure. ' +
169
+ 'Omit or use "sf:ui:target" for Salesforce targets (flat structure). ' +
170
+ 'Use "ui:pageobject:target?pageId=pageobjects.PageClass" for non-SF page objects — ' +
171
+ 'steps are wrapped in a UiWithScreen element targeting that class.', 'string, optional; sf:ui:target (SF) or ui:pageobject:target?pageId=... (non-SF)')),
172
+ output_path: z
173
+ .string()
174
+ .optional()
175
+ .describe(desc('Suggested file path for the .xml file (returned in response)', 'string, optional; output .xml file path')),
176
+ overwrite: z
177
+ .boolean()
178
+ .default(false)
179
+ .describe(desc('Overwrite if output_path file already exists', 'bool, optional; overwrite if exists')),
180
+ dry_run: z
181
+ .boolean()
182
+ .default(true)
183
+ .describe(desc('true = return XML only (default); false = write to output_path', 'bool, optional; default true, skip write')),
184
+ validate_after_edit: z
185
+ .boolean()
186
+ .default(true)
187
+ .describe(desc('Run structural validation after generation (default: true). ' +
188
+ 'Returns TESTCASE_INVALID error if the generated XML fails validation. ' +
189
+ 'Set false to skip validation and omit the validation field from the response.', 'bool, optional; default true, validate after generation')),
190
+ idempotency_key: z
191
+ .string()
192
+ .optional()
193
+ .describe(desc('Caller-provided key echoed back for deduplication tracking', 'string, optional; deduplication key echoed in response')),
194
+ },
112
195
  }, (input) => {
113
196
  const requestId = makeRequestId();
114
- log('info', 'provar.testcase.generate', {
197
+ log('info', 'provar_testcase_generate', {
115
198
  requestId,
116
199
  test_case_name: input.test_case_name,
117
200
  dry_run: input.dry_run,
201
+ target_uri: input.target_uri,
118
202
  });
203
+ // Runtime guard for the multi-call construction pattern: rejects the exact
204
+ // shape that produces a contract-violating skeleton on disk — empty steps[]
205
+ // + non-dry-run + persistence target. Other empty-steps shapes (dry-run
206
+ // preview, no output_path) remain allowed.
207
+ if (input.steps.length === 0 && !input.dry_run && input.output_path) {
208
+ const err = makeError('STEPS_REQUIRED', 'provar_testcase_generate was called with an empty steps[] array and a target output_path. ' +
209
+ 'Constructing a test case requires the full step tree in a single call; ' +
210
+ 'an empty payload on the write path would produce a skeleton-only file.', requestId, false, {
211
+ suggestion: 'Pass the FULL step tree to provar_testcase_generate in a single call. ' +
212
+ 'provar_testcase_step_edit is for amending an already-validated test case ' +
213
+ '(single-step add, attribute fix, debug edit), not for constructing one from scratch. ' +
214
+ 'If you genuinely want a skeleton for inspection, set dry_run=true.',
215
+ });
216
+ log('warn', 'provar_testcase_generate: STEPS_REQUIRED', {
217
+ requestId,
218
+ output_path: input.output_path,
219
+ });
220
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(err) }] };
221
+ }
119
222
  try {
120
223
  const xmlContent = buildTestCaseXml(input);
121
- const filePath = input.output_path
122
- ? path.resolve(input.output_path)
123
- : undefined;
224
+ const filePath = input.output_path ? path.resolve(input.output_path) : undefined;
124
225
  let written = false;
125
226
  if (filePath && !input.dry_run) {
126
227
  assertPathAllowed(filePath, config.allowedPaths);
@@ -131,19 +232,11 @@ export function registerTestCaseGenerate(server, config) {
131
232
  fs.mkdirSync(path.dirname(filePath), { recursive: true });
132
233
  fs.writeFileSync(filePath, xmlContent, 'utf-8');
133
234
  written = true;
134
- log('info', 'provar.testcase.generate: wrote file', { requestId, filePath });
235
+ log('info', 'provar_testcase_generate: wrote file', { requestId, filePath });
135
236
  }
136
237
  const warnings = buildStepWarnings(input.steps);
137
- const validationFull = validateTestCase(xmlContent, input.test_case_name);
138
- const validationSlim = {
139
- is_valid: validationFull.is_valid,
140
- validity_score: validationFull.validity_score,
141
- quality_score: validationFull.quality_score,
142
- error_count: validationFull.error_count,
143
- warning_count: validationFull.warning_count,
144
- issues: validationFull.issues,
145
- };
146
- const result = {
238
+ const runValidation = input.validate_after_edit !== false;
239
+ const baseResult = {
147
240
  requestId,
148
241
  xml_content: xmlContent,
149
242
  file_path: filePath,
@@ -151,71 +244,185 @@ export function registerTestCaseGenerate(server, config) {
151
244
  dry_run: input.dry_run,
152
245
  step_count: input.steps.length,
153
246
  idempotency_key: input.idempotency_key,
154
- validation: validationSlim,
155
247
  ...(warnings.length > 0 ? { warnings } : {}),
156
248
  };
249
+ if (runValidation) {
250
+ const validationFull = validateTestCase(xmlContent, input.test_case_name);
251
+ const validationSlim = {
252
+ is_valid: validationFull.is_valid,
253
+ validity_score: validationFull.validity_score,
254
+ quality_score: validationFull.quality_score,
255
+ error_count: validationFull.error_count,
256
+ warning_count: validationFull.warning_count,
257
+ issues: validationFull.issues,
258
+ };
259
+ if (!validationFull.is_valid) {
260
+ const errResult = makeError('TESTCASE_INVALID', `Generated test case failed structural validation (${validationFull.error_count} error(s)). See details.validation.`, requestId, false, { validation: validationSlim });
261
+ log('warn', 'provar_testcase_generate: TESTCASE_INVALID', { requestId });
262
+ return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
263
+ }
264
+ const result = { ...baseResult, validation: validationSlim };
265
+ return {
266
+ content: [{ type: 'text', text: JSON.stringify(result) }],
267
+ structuredContent: result,
268
+ };
269
+ }
157
270
  return {
158
- content: [{ type: 'text', text: JSON.stringify(result) }],
159
- structuredContent: result,
271
+ content: [{ type: 'text', text: JSON.stringify(baseResult) }],
272
+ structuredContent: baseResult,
160
273
  };
161
274
  }
162
275
  catch (err) {
163
276
  const error = err;
164
- const errResult = makeError(error instanceof PathPolicyError ? error.code : (error.code ?? 'GENERATE_ERROR'), error.message, requestId, false);
165
- log('error', 'provar.testcase.generate failed', { requestId, error: error.message });
277
+ const errResult = makeError(error instanceof PathPolicyError ? error.code : error.code ?? 'GENERATE_ERROR', error.message, requestId, false);
278
+ log('error', 'provar_testcase_generate failed', { requestId, error: error.message });
166
279
  return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
167
280
  }
168
281
  });
169
282
  }
170
283
  // ── XML builder ───────────────────────────────────────────────────────────────
171
- function buildArgumentsXml(attributes) {
284
+ // F1/F3: build class="compound" for strings that mix literal text with {VarName} tokens.
285
+ function buildCompoundValue(val, indent) {
286
+ const i = `${indent} `;
287
+ const parts = [];
288
+ const tokenRe = /\{([\w.]+)\}/g;
289
+ let last = 0;
290
+ let m;
291
+ while ((m = tokenRe.exec(val)) !== null) {
292
+ const before = val.slice(last, m.index);
293
+ if (before)
294
+ parts.push(`${i}<value valueClass="string">${escapeXmlContent(before)}</value>`);
295
+ const pathElements = m[1]
296
+ .split('.')
297
+ .map((p) => `${i} <path element="${escapeXmlAttr(p)}"/>`)
298
+ .join('\n');
299
+ parts.push(`${i}<variable>\n${pathElements}\n${i}</variable>`);
300
+ last = m.index + m[0].length;
301
+ }
302
+ const tail = val.slice(last);
303
+ if (tail)
304
+ parts.push(`${i}<value valueClass="string">${escapeXmlContent(tail)}</value>`);
305
+ return `${indent}<value class="compound">\n${i}<parts>\n${parts.join('\n')}\n${i}</parts>\n${indent}</value>`;
306
+ }
307
+ // Build the <value> element for a single argument (D2/D4/F1 aware).
308
+ // inNamedValues: when true (inside SetValues namedValues), skip uiTarget/uiLocator dispatch.
309
+ // apiId: resolved API ID used to restrict key-name dispatch to the correct UI APIs.
310
+ function buildArgumentValue(key, val, indent, inNamedValues = false, apiId = '') {
311
+ // D4: {VarName} or {Obj.Field} → class="variable" with <path> elements.
312
+ const varMatch = /^\{([\w.]+)\}$/.exec(val);
313
+ if (varMatch) {
314
+ const pathElements = varMatch[1]
315
+ .split('.')
316
+ .map((p) => `${indent} <path element="${escapeXmlAttr(p)}"/>`)
317
+ .join('\n');
318
+ return `${indent}<value class="variable">\n${pathElements}\n${indent}</value>`;
319
+ }
320
+ // F1/F3: {VarName} embedded in surrounding text → class="compound" with <parts>.
321
+ if (/\{[\w.]+\}/.test(val)) {
322
+ return buildCompoundValue(val, indent);
323
+ }
324
+ if (!inNamedValues) {
325
+ // D2: 'target' argument → class="uiTarget" (only for UiWithScreen / UiWithRow).
326
+ if (key === 'target' && (apiId.includes('UiWithScreen') || apiId.includes('UiWithRow'))) {
327
+ return `${indent}<value class="uiTarget" uri="${escapeXmlAttr(val)}"/>`;
328
+ }
329
+ // D2: 'locator' argument → class="uiLocator" (only for UiDoAction / UiAssert).
330
+ if (key === 'locator' && (apiId.includes('UiDoAction') || apiId.includes('UiAssert'))) {
331
+ return `${indent}<value class="uiLocator" uri="${escapeXmlAttr(val)}"/>`;
332
+ }
333
+ }
334
+ return `${indent}<value class="value" valueClass="string">${escapeXmlContent(val)}</value>`;
335
+ }
336
+ function buildArgumentsXml(attributes, baseIndent = ' ', apiId = '') {
172
337
  const entries = Object.entries(attributes);
173
338
  if (entries.length === 0)
174
339
  return '';
175
340
  const argLines = entries
176
- .map(([k, v]) => ` <argument id="${escapeXmlAttr(k)}">\n` +
177
- ` <value class="value" valueClass="String">${escapeXmlContent(v)}</value>\n` +
178
- ' </argument>')
341
+ .map(([k, v]) => {
342
+ const valueXml = buildArgumentValue(k, v, `${baseIndent} `, false, apiId);
343
+ return `${baseIndent}<argument id="${escapeXmlAttr(k)}">\n` + valueXml + '\n' + `${baseIndent}</argument>`;
344
+ })
179
345
  .join('\n');
180
- return `\n <arguments>\n${argLines}\n </arguments>\n `;
346
+ return `\n${baseIndent}<arguments>\n${argLines}\n${baseIndent}</arguments>\n${baseIndent.slice(0, -2)}`;
347
+ }
348
+ // D3: SetValues — all attributes become <namedValues> under a single 'values' argument.
349
+ function buildSetValuesXml(attributes, baseIndent) {
350
+ const entries = Object.entries(attributes);
351
+ if (entries.length === 0)
352
+ return '';
353
+ const i = (n) => baseIndent + ' '.repeat(n);
354
+ const namedValueLines = entries
355
+ .map(([name, val]) => {
356
+ const valueXml = buildArgumentValue(name, val, `${i(3)} `, true);
357
+ return `${i(3)}<namedValue name="${escapeXmlAttr(name)}">\n${valueXml}\n${i(3)}</namedValue>`;
358
+ })
359
+ .join('\n');
360
+ return (`\n${i(0)}<arguments>\n` +
361
+ `${i(0)}<argument id="values">\n` +
362
+ `${i(1)}<value class="valueList" mutable="Mutable">\n` +
363
+ `${i(2)}<namedValues>\n` +
364
+ namedValueLines +
365
+ '\n' +
366
+ `${i(2)}</namedValues>\n` +
367
+ `${i(1)}</value>\n` +
368
+ `${i(0)}</argument>\n` +
369
+ `${i(0)}</arguments>\n` +
370
+ `${baseIndent.slice(0, -2)}`);
371
+ }
372
+ function buildFlatStepXml(step, testItemId, indent) {
373
+ const guid = randomUUID();
374
+ const resolvedApiId = resolveApiId(step.api_id);
375
+ const baseIndent = indent + ' ';
376
+ // Use SetValues structure for any SetValues API (string-match mirrors the validator).
377
+ const argumentsXml = resolvedApiId.includes('SetValues')
378
+ ? buildSetValuesXml(step.attributes, baseIndent)
379
+ : buildArgumentsXml(step.attributes, baseIndent, resolvedApiId);
380
+ if (argumentsXml) {
381
+ return (`${indent}<apiCall guid="${guid}" apiId="${escapeXmlAttr(resolvedApiId)}"` +
382
+ ` name="${escapeXmlAttr(step.name)}" testItemId="${testItemId}">${argumentsXml}</apiCall>`);
383
+ }
384
+ return (`${indent}<apiCall guid="${guid}" apiId="${escapeXmlAttr(resolvedApiId)}"` +
385
+ ` name="${escapeXmlAttr(step.name)}" testItemId="${testItemId}"/>`);
181
386
  }
182
387
  function buildTestCaseXml(input) {
183
- const testCaseId = input.test_case_id ?? randomUUID();
184
388
  const testCaseGuid = randomUUID();
185
389
  const registryId = randomUUID();
186
- const stepLines = input.steps
187
- .map((step, i) => {
188
- const guid = randomUUID();
189
- const testItemId = i + 1;
190
- const resolvedApiId = resolveApiId(step.api_id);
191
- const argumentsXml = buildArgumentsXml(step.attributes);
192
- if (argumentsXml) {
193
- return (` <apiCall guid="${guid}" apiId="${escapeXmlAttr(resolvedApiId)}"` +
194
- ` name="${escapeXmlAttr(step.name)}" testItemId="${testItemId}">${argumentsXml}</apiCall>`);
195
- }
196
- return (` <apiCall guid="${guid}" apiId="${escapeXmlAttr(resolvedApiId)}"` +
197
- ` name="${escapeXmlAttr(step.name)}" testItemId="${testItemId}"/>`);
198
- })
199
- .join('\n');
200
- return ('<?xml version="1.0" encoding="UTF-8"?>\n' +
201
- `<testCase id="${testCaseId}" guid="${testCaseGuid}" registryId="${registryId}"` +
202
- ` name="${escapeXmlAttr(input.test_case_name)}">\n` +
390
+ let stepLines;
391
+ const isNonSf = !!input.target_uri && input.target_uri.startsWith('ui:');
392
+ if (isNonSf && input.target_uri) {
393
+ stepLines = buildUiWithScreenXml(input.steps, input.target_uri);
394
+ }
395
+ else {
396
+ const lines = input.steps.map((step, i) => buildFlatStepXml(step, i + 1, ' ')).join('\n');
397
+ stepLines = lines || ' <!-- TODO: Add test steps here -->';
398
+ }
399
+ // Provar requires: standalone="no", id="1" (integer literal), no name attr, <summary/> before <steps>.
400
+ return ('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' +
401
+ `<testCase guid="${testCaseGuid}" id="1" registryId="${registryId}">\n` +
402
+ ' <summary/>\n' +
203
403
  ' <steps>\n' +
204
- (stepLines || ' <!-- TODO: Add test steps here -->') +
404
+ stepLines +
205
405
  '\n </steps>\n' +
206
406
  '</testCase>\n');
207
407
  }
408
+ function buildUiWithScreenXml(steps, targetUri) {
409
+ const wrapperGuid = randomUUID();
410
+ const wrapperApiId = resolveApiId('UiWithScreen');
411
+ // Inner steps use testItemIds starting at 3; the substeps clause itself occupies testItemId=2
412
+ const innerLines = steps.map((step, i) => buildFlatStepXml(step, i + 3, ' ')).join('\n');
413
+ const stepsContent = innerLines ? `\n${innerLines}\n ` : '';
414
+ const clausesXml = '\n <clauses>\n' +
415
+ ' <clause name="substeps" testItemId="2">\n' +
416
+ ` <steps>${stepsContent}</steps>\n` +
417
+ ' </clause>\n' +
418
+ ' </clauses>\n ';
419
+ return (` <apiCall guid="${wrapperGuid}" apiId="${wrapperApiId}"` +
420
+ ` name="With page" testItemId="1">${buildArgumentsXml({ target: targetUri }, ' ', wrapperApiId).trimEnd()}${clausesXml}</apiCall>`);
421
+ }
208
422
  function escapeXmlAttr(value) {
209
- return value
210
- .replace(/&/g, '&amp;')
211
- .replace(/"/g, '&quot;')
212
- .replace(/</g, '&lt;')
213
- .replace(/>/g, '&gt;');
423
+ return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
214
424
  }
215
425
  function escapeXmlContent(value) {
216
- return value
217
- .replace(/&/g, '&amp;')
218
- .replace(/</g, '&lt;')
219
- .replace(/>/g, '&gt;');
426
+ return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
220
427
  }
221
428
  //# sourceMappingURL=testCaseGenerate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testCaseGenerate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testCaseGenerate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testCaseGenerate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testCaseGenerate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ServerConfig } from '../server.js';
3
+ export declare function registerTestCaseStepEdit(server: McpServer, config: ServerConfig): void;
4
+ export declare function registerAllTestCaseStepTools(server: McpServer, config: ServerConfig): void;