@provartesting/provardx-cli 1.5.0-dev.1 → 1.5.0
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 +163 -13
- package/bin/mcp-start.js +74 -0
- package/lib/commands/provar/auth/clear.d.ts +7 -0
- package/lib/commands/provar/auth/clear.js +36 -0
- package/lib/commands/provar/auth/clear.js.map +1 -0
- package/lib/commands/provar/auth/login.d.ts +10 -0
- package/lib/commands/provar/auth/login.js +90 -0
- package/lib/commands/provar/auth/login.js.map +1 -0
- package/lib/commands/provar/auth/rotate.d.ts +7 -0
- package/lib/commands/provar/auth/rotate.js +42 -0
- package/lib/commands/provar/auth/rotate.js.map +1 -0
- package/lib/commands/provar/auth/status.d.ts +7 -0
- package/lib/commands/provar/auth/status.js +107 -0
- package/lib/commands/provar/auth/status.js.map +1 -0
- package/lib/commands/provar/mcp/start.d.ts +2 -0
- package/lib/commands/provar/mcp/start.js +14 -1
- package/lib/commands/provar/mcp/start.js.map +1 -1
- package/lib/mcp/docs/NITROX_CATALOG_SOURCE.json +6 -0
- package/lib/mcp/docs/NITROX_COMPONENT_CATALOG.md +2001 -0
- package/lib/mcp/docs/PROVAR_TEST_STEP_REFERENCE.md +1430 -0
- package/lib/mcp/docs/PROVAR_TOOL_GUIDE.md +175 -0
- package/lib/mcp/licensing/algasClient.js +14 -5
- package/lib/mcp/licensing/algasClient.js.map +1 -1
- package/lib/mcp/licensing/ideDetection.d.ts +0 -12
- package/lib/mcp/licensing/ideDetection.js +1 -73
- package/lib/mcp/licensing/ideDetection.js.map +1 -1
- package/lib/mcp/licensing/licenseCache.js +7 -1
- package/lib/mcp/licensing/licenseCache.js.map +1 -1
- package/lib/mcp/licensing/licenseValidator.d.ts +3 -3
- package/lib/mcp/licensing/licenseValidator.js +11 -4
- package/lib/mcp/licensing/licenseValidator.js.map +1 -1
- package/lib/mcp/prompts/guidePrompts.d.ts +4 -0
- package/lib/mcp/prompts/guidePrompts.js +324 -0
- package/lib/mcp/prompts/guidePrompts.js.map +1 -0
- package/lib/mcp/prompts/index.d.ts +2 -0
- package/lib/mcp/prompts/index.js +23 -0
- package/lib/mcp/prompts/index.js.map +1 -0
- package/lib/mcp/prompts/loopPrompts.d.ts +6 -0
- package/lib/mcp/prompts/loopPrompts.js +435 -0
- package/lib/mcp/prompts/loopPrompts.js.map +1 -0
- package/lib/mcp/prompts/migrationPrompts.d.ts +4 -0
- package/lib/mcp/prompts/migrationPrompts.js +207 -0
- package/lib/mcp/prompts/migrationPrompts.js.map +1 -0
- package/lib/mcp/rules/provar_best_practices_rules.json +256 -544
- package/lib/mcp/security/pathPolicy.d.ts +5 -0
- package/lib/mcp/security/pathPolicy.js +58 -3
- package/lib/mcp/security/pathPolicy.js.map +1 -1
- package/lib/mcp/server.d.ts +17 -0
- package/lib/mcp/server.js +151 -6
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/tools/antTools.d.ts +15 -0
- package/lib/mcp/tools/antTools.js +347 -170
- package/lib/mcp/tools/antTools.js.map +1 -1
- package/lib/mcp/tools/automationTools.d.ts +18 -8
- package/lib/mcp/tools/automationTools.js +332 -176
- package/lib/mcp/tools/automationTools.js.map +1 -1
- package/lib/mcp/tools/bestPracticesEngine.js +161 -23
- package/lib/mcp/tools/bestPracticesEngine.js.map +1 -1
- package/lib/mcp/tools/connectionTools.d.ts +4 -0
- package/lib/mcp/tools/connectionTools.js +172 -0
- package/lib/mcp/tools/connectionTools.js.map +1 -0
- package/lib/mcp/tools/defectTools.d.ts +1 -1
- package/lib/mcp/tools/defectTools.js +56 -50
- package/lib/mcp/tools/defectTools.js.map +1 -1
- package/lib/mcp/tools/hierarchyValidate.d.ts +1 -1
- package/lib/mcp/tools/hierarchyValidate.js +127 -42
- package/lib/mcp/tools/hierarchyValidate.js.map +1 -1
- package/lib/mcp/tools/nitroXTools.d.ts +23 -0
- package/lib/mcp/tools/nitroXTools.js +823 -0
- package/lib/mcp/tools/nitroXTools.js.map +1 -0
- package/lib/mcp/tools/pageObjectGenerate.js +132 -57
- package/lib/mcp/tools/pageObjectGenerate.js.map +1 -1
- package/lib/mcp/tools/pageObjectValidate.js +136 -46
- package/lib/mcp/tools/pageObjectValidate.js.map +1 -1
- package/lib/mcp/tools/projectInspect.js +51 -30
- package/lib/mcp/tools/projectInspect.js.map +1 -1
- package/lib/mcp/tools/projectValidateFromPath.js +70 -49
- package/lib/mcp/tools/projectValidateFromPath.js.map +1 -1
- package/lib/mcp/tools/propertiesTools.d.ts +2 -0
- package/lib/mcp/tools/propertiesTools.js +332 -78
- package/lib/mcp/tools/propertiesTools.js.map +1 -1
- package/lib/mcp/tools/qualityHubApiTools.d.ts +3 -0
- package/lib/mcp/tools/qualityHubApiTools.js +138 -0
- package/lib/mcp/tools/qualityHubApiTools.js.map +1 -0
- package/lib/mcp/tools/qualityHubTools.js +219 -70
- package/lib/mcp/tools/qualityHubTools.js.map +1 -1
- package/lib/mcp/tools/rcaTools.d.ts +3 -2
- package/lib/mcp/tools/rcaTools.js +189 -56
- package/lib/mcp/tools/rcaTools.js.map +1 -1
- package/lib/mcp/tools/sfSpawn.d.ts +25 -3
- package/lib/mcp/tools/sfSpawn.js +154 -6
- package/lib/mcp/tools/sfSpawn.js.map +1 -1
- package/lib/mcp/tools/testCaseGenerate.js +226 -78
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
- package/lib/mcp/tools/testCaseStepTools.d.ts +4 -0
- package/lib/mcp/tools/testCaseStepTools.js +226 -0
- package/lib/mcp/tools/testCaseStepTools.js.map +1 -0
- package/lib/mcp/tools/testCaseValidate.d.ts +11 -0
- package/lib/mcp/tools/testCaseValidate.js +307 -46
- package/lib/mcp/tools/testCaseValidate.js.map +1 -1
- package/lib/mcp/tools/testPlanTools.d.ts +1 -0
- package/lib/mcp/tools/testPlanTools.js +299 -59
- package/lib/mcp/tools/testPlanTools.js.map +1 -1
- package/lib/mcp/tools/testPlanValidate.js +56 -18
- package/lib/mcp/tools/testPlanValidate.js.map +1 -1
- package/lib/mcp/tools/testSuiteValidate.js +37 -11
- package/lib/mcp/tools/testSuiteValidate.js.map +1 -1
- package/lib/mcp/update/updateChecker.d.ts +14 -0
- package/lib/mcp/update/updateChecker.js +228 -0
- package/lib/mcp/update/updateChecker.js.map +1 -0
- package/lib/services/auth/credentials.d.ts +21 -0
- package/lib/services/auth/credentials.js +75 -0
- package/lib/services/auth/credentials.js.map +1 -0
- package/lib/services/auth/loginFlow.d.ts +68 -0
- package/lib/services/auth/loginFlow.js +216 -0
- package/lib/services/auth/loginFlow.js.map +1 -0
- package/lib/services/projectValidation.d.ts +5 -2
- package/lib/services/projectValidation.js +83 -31
- package/lib/services/projectValidation.js.map +1 -1
- package/lib/services/qualityHub/client.d.ts +161 -0
- package/lib/services/qualityHub/client.js +226 -0
- package/lib/services/qualityHub/client.js.map +1 -0
- package/messages/sf.provar.auth.clear.md +16 -0
- package/messages/sf.provar.auth.login.md +31 -0
- package/messages/sf.provar.auth.rotate.md +23 -0
- package/messages/sf.provar.auth.status.md +16 -0
- package/messages/sf.provar.mcp.start.md +83 -48
- package/oclif.manifest.json +299 -2
- package/package.json +23 -12
|
@@ -10,5 +10,10 @@ export declare class PathPolicyError extends Error {
|
|
|
10
10
|
* - PATH_NOT_ALLOWED — resolved path is outside all allowed roots
|
|
11
11
|
*
|
|
12
12
|
* When allowedPaths is empty, all paths are permitted (unrestricted mode).
|
|
13
|
+
*
|
|
14
|
+
* Symlinks are resolved via fs.realpathSync so that a symlink inside an allowed
|
|
15
|
+
* directory pointing to a location outside it cannot bypass containment.
|
|
16
|
+
* If the path does not yet exist (e.g. an output file to be created), the parent
|
|
17
|
+
* directory is resolved instead and the basename re-attached.
|
|
13
18
|
*/
|
|
14
19
|
export declare function assertPathAllowed(filePath: string, allowedPaths: string[]): void;
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Licensed under the BSD 3-Clause license.
|
|
5
5
|
* For full license text, see LICENSE.md file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
6
6
|
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
7
8
|
import path from 'node:path';
|
|
8
9
|
export class PathPolicyError extends Error {
|
|
9
10
|
code;
|
|
@@ -21,6 +22,11 @@ export class PathPolicyError extends Error {
|
|
|
21
22
|
* - PATH_NOT_ALLOWED — resolved path is outside all allowed roots
|
|
22
23
|
*
|
|
23
24
|
* When allowedPaths is empty, all paths are permitted (unrestricted mode).
|
|
25
|
+
*
|
|
26
|
+
* Symlinks are resolved via fs.realpathSync so that a symlink inside an allowed
|
|
27
|
+
* directory pointing to a location outside it cannot bypass containment.
|
|
28
|
+
* If the path does not yet exist (e.g. an output file to be created), the parent
|
|
29
|
+
* directory is resolved instead and the basename re-attached.
|
|
24
30
|
*/
|
|
25
31
|
export function assertPathAllowed(filePath, allowedPaths) {
|
|
26
32
|
// Check the original path for `..` segments before any normalization resolves them away
|
|
@@ -28,10 +34,59 @@ export function assertPathAllowed(filePath, allowedPaths) {
|
|
|
28
34
|
if (rawSegments.some((s) => s === '..')) {
|
|
29
35
|
throw new PathPolicyError('PATH_TRAVERSAL', `Path traversal detected: ${filePath}`);
|
|
30
36
|
}
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
// Resolve symlinks so a symlink inside an allowed dir that points outside cannot bypass
|
|
38
|
+
// the containment check. Fall back to lexical resolution when the path doesn't exist yet.
|
|
39
|
+
let resolved;
|
|
40
|
+
try {
|
|
41
|
+
resolved = fs.realpathSync(filePath);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Path doesn't exist — walk up the ancestor hierarchy to find the deepest existing directory,
|
|
45
|
+
// resolve symlinks there, then re-attach the non-existent tail segments. This handles macOS
|
|
46
|
+
// where os.tmpdir() returns /var/... (a symlink to /private/var/...) and intermediate dirs
|
|
47
|
+
// for a new output path may not yet exist.
|
|
48
|
+
const full = path.resolve(filePath);
|
|
49
|
+
let cur = full;
|
|
50
|
+
const tail = [];
|
|
51
|
+
while (!fs.existsSync(cur) && cur !== path.dirname(cur)) {
|
|
52
|
+
tail.unshift(path.basename(cur));
|
|
53
|
+
cur = path.dirname(cur);
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
resolved = path.join(fs.realpathSync(cur), ...tail);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
resolved = full;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const resolvedAllowed = allowedPaths.map((p) => {
|
|
63
|
+
try {
|
|
64
|
+
return fs.realpathSync(p);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return path.resolve(path.normalize(p));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// Windows file paths are case-insensitive; fs.realpathSync does not always
|
|
71
|
+
// canonicalize drive-letter case (e.g. `c:\` vs `C:\`), so compare case-insensitively.
|
|
72
|
+
const isWindows = process.platform === 'win32';
|
|
73
|
+
const normalizeForCompare = (p) => (isWindows ? p.toLowerCase() : p);
|
|
74
|
+
const resolvedKey = normalizeForCompare(resolved);
|
|
33
75
|
if (resolvedAllowed.length > 0 &&
|
|
34
|
-
!resolvedAllowed.some((base) =>
|
|
76
|
+
!resolvedAllowed.some((base) => {
|
|
77
|
+
const rawBaseKey = normalizeForCompare(base);
|
|
78
|
+
// Strip trailing separator unless base is a filesystem root (/ on Unix, C:\ on Windows).
|
|
79
|
+
// A trailing sep from user input like "/tmp/" would otherwise cause double-sep prefix
|
|
80
|
+
// checks ("startsWith('/tmp//')") and equality mismatches ("/tmp" !== "/tmp/").
|
|
81
|
+
const isRoot = rawBaseKey === path.sep || (isWindows && /^[a-z]:[/\\]$/.test(rawBaseKey));
|
|
82
|
+
if (isRoot) {
|
|
83
|
+
// Root path already ends with its own separator (/ or C:\).
|
|
84
|
+
// Appending path.sep would produce // or C:\\, breaking startsWith for all children.
|
|
85
|
+
return resolvedKey.startsWith(rawBaseKey);
|
|
86
|
+
}
|
|
87
|
+
const baseKey = rawBaseKey.endsWith(path.sep) ? rawBaseKey.slice(0, -1) : rawBaseKey;
|
|
88
|
+
return resolvedKey === baseKey || resolvedKey.startsWith(baseKey + path.sep);
|
|
89
|
+
})) {
|
|
35
90
|
throw new PathPolicyError('PATH_NOT_ALLOWED', `Path "${resolved}" is not within allowed paths: [${resolvedAllowed.join(', ')}]`);
|
|
36
91
|
}
|
|
37
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pathPolicy.js","sourceRoot":"","sources":["../../../src/mcp/security/pathPolicy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxB,IAAI,CAAS;IAC7B,YAAmB,IAAY,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED
|
|
1
|
+
{"version":3,"file":"pathPolicy.js","sourceRoot":"","sources":["../../../src/mcp/security/pathPolicy.ts"],"names":[],"mappings":"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"}
|
package/lib/mcp/server.d.ts
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
export interface ServerConfig {
|
|
3
3
|
allowedPaths: string[];
|
|
4
|
+
updateResult?: {
|
|
5
|
+
updateAvailable: boolean;
|
|
6
|
+
latestVersion: string | null;
|
|
7
|
+
updateCommand: string | null;
|
|
8
|
+
};
|
|
4
9
|
}
|
|
5
10
|
export declare function createProvarMcpServer(config: ServerConfig): McpServer;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the docs directory for bundled MCP Markdown resources.
|
|
13
|
+
* In compiled output (lib/mcp/) the sibling docs/ dir exists; in dev/ts-node
|
|
14
|
+
* mode (src/mcp/) it doesn't, so fall back two levels to the repo-root docs/.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveDocsDir(currentDir: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Read NITROX_CATALOG_SOURCE.json from the docs directory and return it as
|
|
19
|
+
* a formatted JSON string. Returns a fallback object string if the file is
|
|
20
|
+
* absent or unreadable.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readCatalogSource(docsDir: string): string;
|
package/lib/mcp/server.js
CHANGED
|
@@ -4,9 +4,15 @@
|
|
|
4
4
|
* Licensed under the BSD 3-Clause license.
|
|
5
5
|
* For full license text, see LICENSE.md file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
6
6
|
*/
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import { dirname, join } from 'node:path';
|
|
7
11
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
12
|
import { z } from 'zod';
|
|
9
13
|
import { log } from './logging/logger.js';
|
|
14
|
+
const requireJson = createRequire(import.meta.url);
|
|
15
|
+
const SERVER_VERSION = requireJson('../../package.json').version;
|
|
10
16
|
import { registerProjectInspect } from './tools/projectInspect.js';
|
|
11
17
|
import { registerPageObjectGenerate } from './tools/pageObjectGenerate.js';
|
|
12
18
|
import { registerPageObjectValidate } from './tools/pageObjectValidate.js';
|
|
@@ -17,22 +23,38 @@ import { registerTestPlanValidate } from './tools/testPlanValidate.js';
|
|
|
17
23
|
import { registerProjectValidateFromPath } from './tools/projectValidateFromPath.js';
|
|
18
24
|
import { registerAllPropertiesTools } from './tools/propertiesTools.js';
|
|
19
25
|
import { registerAllQualityHubTools } from './tools/qualityHubTools.js';
|
|
26
|
+
import { registerAllQualityHubApiTools } from './tools/qualityHubApiTools.js';
|
|
20
27
|
import { registerAllAutomationTools } from './tools/automationTools.js';
|
|
21
28
|
import { registerAllDefectTools } from './tools/defectTools.js';
|
|
22
29
|
import { registerAllAntTools } from './tools/antTools.js';
|
|
23
30
|
import { registerAllRcaTools } from './tools/rcaTools.js';
|
|
24
31
|
import { registerAllTestPlanTools } from './tools/testPlanTools.js';
|
|
32
|
+
import { registerAllNitroXTools } from './tools/nitroXTools.js';
|
|
33
|
+
import { registerAllTestCaseStepTools } from './tools/testCaseStepTools.js';
|
|
34
|
+
import { registerAllConnectionTools } from './tools/connectionTools.js';
|
|
35
|
+
import { registerAllPrompts } from './prompts/index.js';
|
|
25
36
|
export function createProvarMcpServer(config) {
|
|
26
37
|
log('info', 'Creating Provar MCP server', { allowedPaths: config.allowedPaths });
|
|
27
38
|
const server = new McpServer({
|
|
28
39
|
name: 'provar-mcp',
|
|
29
|
-
version:
|
|
40
|
+
version: SERVER_VERSION,
|
|
30
41
|
});
|
|
31
42
|
// ── Sanity-check tool ────────────────────────────────────────────────────────
|
|
32
|
-
server.
|
|
33
|
-
|
|
43
|
+
server.registerTool('provardx_ping', {
|
|
44
|
+
title: 'Ping MCP Server',
|
|
45
|
+
description: 'Sanity-check tool. Echoes back a message with a timestamp. Use this to verify the MCP server is reachable before calling other tools.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
message: z.string().optional().default('ping').describe('Optional message to echo back'),
|
|
48
|
+
},
|
|
34
49
|
}, ({ message }) => {
|
|
35
|
-
const result = {
|
|
50
|
+
const result = {
|
|
51
|
+
pong: message,
|
|
52
|
+
ts: new Date().toISOString(),
|
|
53
|
+
server: `provar-mcp@${SERVER_VERSION}`,
|
|
54
|
+
updateAvailable: config.updateResult?.updateAvailable ?? false,
|
|
55
|
+
latestVersion: config.updateResult?.latestVersion ?? null,
|
|
56
|
+
updateCommand: config.updateResult?.updateCommand ?? null,
|
|
57
|
+
};
|
|
36
58
|
return {
|
|
37
59
|
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
38
60
|
structuredContent: result,
|
|
@@ -49,11 +71,134 @@ export function createProvarMcpServer(config) {
|
|
|
49
71
|
registerProjectValidateFromPath(server, config);
|
|
50
72
|
registerAllPropertiesTools(server, config);
|
|
51
73
|
registerAllQualityHubTools(server);
|
|
52
|
-
|
|
74
|
+
registerAllQualityHubApiTools(server);
|
|
75
|
+
registerAllAutomationTools(server, config);
|
|
53
76
|
registerAllDefectTools(server);
|
|
54
77
|
registerAllAntTools(server, config);
|
|
55
|
-
registerAllRcaTools(server);
|
|
78
|
+
registerAllRcaTools(server, config);
|
|
56
79
|
registerAllTestPlanTools(server, config);
|
|
80
|
+
registerAllNitroXTools(server, config);
|
|
81
|
+
registerAllTestCaseStepTools(server, config);
|
|
82
|
+
registerAllConnectionTools(server, config);
|
|
83
|
+
// ── Provar prompts ───────────────────────────────────────────────────────────
|
|
84
|
+
registerAllPrompts(server);
|
|
85
|
+
// ── Documentation resources ──────────────────────────────────────────────────
|
|
86
|
+
const docsDir = resolveDocsDir(dirname(fileURLToPath(import.meta.url)));
|
|
87
|
+
server.resource('provar-nitrox-component-catalog', 'provar://nitrox/component-catalog', {
|
|
88
|
+
description: 'Catalog of all shipped NitroX (Hybrid Model) base component packages. Lists every package with its components, types, tagNames, interactions, and attributes. Read this before calling provar_nitrox_generate to understand available component patterns and naming conventions.',
|
|
89
|
+
mimeType: 'text/markdown',
|
|
90
|
+
}, () => {
|
|
91
|
+
try {
|
|
92
|
+
const text = readFileSync(join(docsDir, 'NITROX_COMPONENT_CATALOG.md'), 'utf-8');
|
|
93
|
+
return {
|
|
94
|
+
contents: [{ uri: 'provar://nitrox/component-catalog', mimeType: 'text/markdown', text }],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return {
|
|
99
|
+
contents: [
|
|
100
|
+
{
|
|
101
|
+
uri: 'provar://nitrox/component-catalog',
|
|
102
|
+
mimeType: 'text/markdown',
|
|
103
|
+
text: '# NitroX Component Catalog\n\nCatalog not found. If you are developing from source, rebuild the package. Otherwise, reinstall or upgrade the plugin/package and try again.',
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
server.resource('provar-nitrox-catalog-source', 'provar://nitrox/catalog-source', {
|
|
110
|
+
description: 'Version metadata for the bundled NitroX component catalog. Returns the factPackages commit SHA and fetch timestamp from the last successful release build. Use this to verify which version of the ProvarTesting/factPackages repo is bundled in the running MCP server.',
|
|
111
|
+
mimeType: 'application/json',
|
|
112
|
+
}, () => {
|
|
113
|
+
const text = readCatalogSource(docsDir);
|
|
114
|
+
return {
|
|
115
|
+
contents: [{ uri: 'provar://nitrox/catalog-source', mimeType: 'application/json', text }],
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
server.resource('provar-step-reference', 'provar://docs/step-reference', {
|
|
119
|
+
description: 'Canonical reference for all Provar XML test step API IDs, argument formats, validation rules, and corpus-verified examples. Use this to understand correct step structure when generating or reviewing test cases.',
|
|
120
|
+
mimeType: 'text/markdown',
|
|
121
|
+
}, () => {
|
|
122
|
+
try {
|
|
123
|
+
const content = readFileSync(join(docsDir, 'PROVAR_TEST_STEP_REFERENCE.md'), 'utf-8');
|
|
124
|
+
return {
|
|
125
|
+
contents: [
|
|
126
|
+
{
|
|
127
|
+
uri: 'provar://docs/step-reference',
|
|
128
|
+
mimeType: 'text/markdown',
|
|
129
|
+
text: content,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return {
|
|
136
|
+
contents: [
|
|
137
|
+
{
|
|
138
|
+
uri: 'provar://docs/step-reference',
|
|
139
|
+
mimeType: 'text/markdown',
|
|
140
|
+
text: '# Provar Test Step Reference\n\nReference doc not found. If you are developing from source, rebuild the package. Otherwise, reinstall or upgrade the plugin/package and try again.',
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
server.resource('provar-tool-guide', 'provar://docs/tool-guide', {
|
|
147
|
+
description: 'Tool selection guide for ProvarDX MCP. Organised by what you want to accomplish (run tests, author tests, debug failures, manage config, etc.) rather than by tool name. Read this to choose the right tool and understand correct sequencing before calling tools.',
|
|
148
|
+
mimeType: 'text/markdown',
|
|
149
|
+
}, () => {
|
|
150
|
+
try {
|
|
151
|
+
const text = readFileSync(join(docsDir, 'PROVAR_TOOL_GUIDE.md'), 'utf-8');
|
|
152
|
+
return {
|
|
153
|
+
contents: [{ uri: 'provar://docs/tool-guide', mimeType: 'text/markdown', text }],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return {
|
|
158
|
+
contents: [
|
|
159
|
+
{
|
|
160
|
+
uri: 'provar://docs/tool-guide',
|
|
161
|
+
mimeType: 'text/markdown',
|
|
162
|
+
text: '# ProvarDX Tool Guide\n\nGuide not found. Reinstall or upgrade the plugin and try again.',
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
});
|
|
57
168
|
return server;
|
|
58
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Resolve the docs directory for bundled MCP Markdown resources.
|
|
172
|
+
* In compiled output (lib/mcp/) the sibling docs/ dir exists; in dev/ts-node
|
|
173
|
+
* mode (src/mcp/) it doesn't, so fall back two levels to the repo-root docs/.
|
|
174
|
+
*/
|
|
175
|
+
export function resolveDocsDir(currentDir) {
|
|
176
|
+
const sibling = join(currentDir, 'docs');
|
|
177
|
+
return existsSync(sibling) ? sibling : join(currentDir, '..', '..', 'docs');
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Read NITROX_CATALOG_SOURCE.json from the docs directory and return it as
|
|
181
|
+
* a formatted JSON string. Returns a fallback object string if the file is
|
|
182
|
+
* absent or unreadable.
|
|
183
|
+
*/
|
|
184
|
+
export function readCatalogSource(docsDir) {
|
|
185
|
+
try {
|
|
186
|
+
const raw = readFileSync(join(docsDir, 'NITROX_CATALOG_SOURCE.json'), 'utf-8');
|
|
187
|
+
const parsed = JSON.parse(raw);
|
|
188
|
+
// Normalise schemasUpdated so older build artifacts (which lack this field)
|
|
189
|
+
// return a stable shape rather than omitting the key entirely.
|
|
190
|
+
if (!('schemasUpdated' in parsed)) {
|
|
191
|
+
parsed['schemasUpdated'] = null;
|
|
192
|
+
}
|
|
193
|
+
return JSON.stringify(parsed, null, 2);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return JSON.stringify({
|
|
197
|
+
branch: 'main',
|
|
198
|
+
commitSha: null,
|
|
199
|
+
fetchedAt: null,
|
|
200
|
+
schemasUpdated: null,
|
|
201
|
+
}, null, 2);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
59
204
|
//# sourceMappingURL=server.js.map
|
package/lib/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,4 +18,19 @@ export interface AntValidationResult {
|
|
|
18
18
|
}
|
|
19
19
|
/** Pure function — exported for unit testing */
|
|
20
20
|
export declare function validateAntXml(xmlContent: string): AntValidationResult;
|
|
21
|
+
export interface JUnitStepResult {
|
|
22
|
+
testItemId: string;
|
|
23
|
+
title: string;
|
|
24
|
+
status: 'pass' | 'fail' | 'skip';
|
|
25
|
+
errorMessage?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface JUnitParseResult {
|
|
28
|
+
steps: JUnitStepResult[];
|
|
29
|
+
warning?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Scan a Provar results directory for JUnit XML files and return structured step results.
|
|
33
|
+
* Returns an empty steps array (+ optional warning) when no XML is found or parsing fails.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseJUnitResults(resultsDir: string): JUnitParseResult;
|
|
21
36
|
export declare function registerAllAntTools(server: McpServer, config: ServerConfig): void;
|