@provartesting/provardx-cli 1.5.0-beta.13 → 1.5.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/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/PROVAR_TEST_STEP_REFERENCE.md +2 -2
- package/lib/mcp/prompts/loopPrompts.js +18 -18
- package/lib/mcp/prompts/migrationPrompts.js +10 -10
- package/lib/mcp/server.d.ts +5 -0
- package/lib/mcp/server.js +14 -3
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/tools/antTools.js +140 -129
- package/lib/mcp/tools/antTools.js.map +1 -1
- package/lib/mcp/tools/automationTools.js +125 -103
- package/lib/mcp/tools/automationTools.js.map +1 -1
- package/lib/mcp/tools/connectionTools.js +17 -13
- package/lib/mcp/tools/connectionTools.js.map +1 -1
- package/lib/mcp/tools/defectTools.js +35 -28
- 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.js +161 -142
- package/lib/mcp/tools/nitroXTools.js.map +1 -1
- package/lib/mcp/tools/pageObjectGenerate.js +47 -40
- 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.js +64 -48
- package/lib/mcp/tools/propertiesTools.js.map +1 -1
- package/lib/mcp/tools/qualityHubApiTools.js +48 -44
- package/lib/mcp/tools/qualityHubApiTools.js.map +1 -1
- package/lib/mcp/tools/qualityHubTools.js +76 -52
- package/lib/mcp/tools/qualityHubTools.js.map +1 -1
- package/lib/mcp/tools/rcaTools.js +63 -55
- package/lib/mcp/tools/rcaTools.js.map +1 -1
- package/lib/mcp/tools/testCaseGenerate.js +46 -35
- package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
- package/lib/mcp/tools/testCaseStepTools.js +38 -34
- package/lib/mcp/tools/testCaseStepTools.js.map +1 -1
- package/lib/mcp/tools/testCaseValidate.js +60 -41
- package/lib/mcp/tools/testCaseValidate.js.map +1 -1
- package/lib/mcp/tools/testPlanTools.js +198 -76
- 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/projectValidation.d.ts +5 -2
- package/lib/services/projectValidation.js +83 -31
- package/lib/services/projectValidation.js.map +1 -1
- package/messages/sf.provar.auth.clear.md +1 -1
- package/messages/sf.provar.mcp.start.md +83 -48
- package/oclif.manifest.json +224 -212
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testPlanValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testPlanValidate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAsB,MAAM,wBAAwB,CAAC;AAEjG,iFAAiF;AAEjF,MAAM,cAAc,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"testPlanValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testPlanValidate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAsB,MAAM,wBAAwB,CAAC;AAEjG,iFAAiF;AAEjF,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC7E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACrF,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CAC/F,CAAC;KACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,EAAE;IACjE,OAAO,EAAE,4CAA4C;CACtD,CAAC,CAAC;AAEL,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACnF,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CACxG,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC5F,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC3F,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CACxG,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;IACjH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;IAC1G,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+FAA+F,CAAC;IAC5G,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mFAAmF,CAAC;IAChG,oBAAoB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qGAAqG,CAAC;IAClH,YAAY,EAAE,CAAC;SACZ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,uFAAuF,CAAC;IACpG,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kFAAkF,CAAC;IAC/F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;CAC7G,CAAC;KACD,QAAQ,EAAE;KACV,QAAQ,CACP,oHAAoH,CACrH,CAAC;AAEJ,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,4XAA4X;QAC9X,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACvD,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAC3F,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;YAC5G,gBAAgB,EAAE,CAAC;iBAChB,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,EAAE;iBACV,QAAQ,CAAC,sEAAsE,CAAC;YACnF,QAAQ,EAAE,cAAc;YACxB,iBAAiB,EAAE,CAAC;iBACjB,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4EAA4E,CAAC;SAC1F;KACF,EACD,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE;QACxF,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;QAClC,GAAG,CAAC,MAAM,EAAE,0BAA0B,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,iBAAiB,IAAI,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAkB;gBAC3B,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,WAAW,IAAI,EAAE;gBAC9B,UAAU,EAAE,UAAU,IAAI,EAAE;gBAC5B,gBAAgB;gBAChB,QAAQ,EAAE,QAAQ,IAAI,EAAE;aACzB,CAAC;YAEF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;YAEnD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpE,iBAAiB,EAAE,QAAQ;aAC5B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAY,CAAC;YAC3B,MAAM,SAAS,GAAG,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC/E,GAAG,CAAC,OAAO,EAAE,iCAAiC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QAClG,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -10,15 +10,24 @@ import { makeError, makeRequestId } from '../schemas/common.js';
|
|
|
10
10
|
import { log } from '../logging/logger.js';
|
|
11
11
|
import { validateSuite, buildHierarchySummary } from './hierarchyValidate.js';
|
|
12
12
|
// ── Zod schemas ───────────────────────────────────────────────────────────────
|
|
13
|
-
const testCaseSchema = z
|
|
13
|
+
const testCaseSchema = z
|
|
14
|
+
.object({
|
|
14
15
|
name: z.string().describe('Test case filename (e.g. CreateAccount.testcase)'),
|
|
15
16
|
xml_content: z.string().optional().describe('Full XML content of the test case file'),
|
|
16
17
|
xml: z.string().optional().describe('Full XML content (API-compatible alias for xml_content)'),
|
|
17
|
-
})
|
|
18
|
+
})
|
|
19
|
+
.refine((d) => d.xml_content !== undefined || d.xml !== undefined, {
|
|
20
|
+
message: 'Either xml_content or xml must be provided',
|
|
21
|
+
});
|
|
18
22
|
const innerSuiteSchema = z.object({
|
|
19
23
|
name: z.string().describe('Child suite name'),
|
|
20
24
|
test_cases: z.array(testCaseSchema).optional().describe('Test cases in this child suite'),
|
|
21
|
-
test_case_count: z
|
|
25
|
+
test_case_count: z
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(0)
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Explicit test case count (overrides counting test_cases)'),
|
|
22
31
|
});
|
|
23
32
|
const childSuiteSchema = z.object({
|
|
24
33
|
name: z.string().describe('Child suite name'),
|
|
@@ -27,15 +36,32 @@ const childSuiteSchema = z.object({
|
|
|
27
36
|
test_case_count: z.number().int().min(0).optional().describe('Explicit test case count for size check'),
|
|
28
37
|
});
|
|
29
38
|
export function registerTestSuiteValidate(server) {
|
|
30
|
-
server.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
server.registerTool('provar_testsuite_validate', {
|
|
40
|
+
title: 'Validate Test Suite',
|
|
41
|
+
description: 'Validate a Provar test suite: checks for empty suites, duplicate names, oversized suites (>75 tests), and naming convention consistency. Recursively validates child suites and individual test case XML. Returns quality score, suite-level violations, and per-test-case results.',
|
|
42
|
+
inputSchema: {
|
|
43
|
+
suite_name: z.string().describe('Name of the test suite'),
|
|
44
|
+
test_cases: z.array(testCaseSchema).optional().describe('Test cases directly in this suite'),
|
|
45
|
+
child_suites: z
|
|
46
|
+
.array(childSuiteSchema)
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('Child test suites (supports up to 2 levels of nesting)'),
|
|
49
|
+
test_case_count: z
|
|
50
|
+
.number()
|
|
51
|
+
.int()
|
|
52
|
+
.min(0)
|
|
53
|
+
.optional()
|
|
54
|
+
.describe('Explicit total test case count for size check (overrides counting test_cases)'),
|
|
55
|
+
quality_threshold: z
|
|
56
|
+
.number()
|
|
57
|
+
.min(0)
|
|
58
|
+
.max(100)
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('Minimum quality score for a test case to be considered valid (default: 80)'),
|
|
61
|
+
},
|
|
36
62
|
}, ({ suite_name, test_cases, child_suites, test_case_count, quality_threshold }) => {
|
|
37
63
|
const requestId = makeRequestId();
|
|
38
|
-
log('info', '
|
|
64
|
+
log('info', 'provar_testsuite_validate', { requestId, suite_name });
|
|
39
65
|
try {
|
|
40
66
|
const threshold = quality_threshold ?? 80;
|
|
41
67
|
const input = {
|
|
@@ -55,7 +81,7 @@ export function registerTestSuiteValidate(server) {
|
|
|
55
81
|
catch (err) {
|
|
56
82
|
const error = err;
|
|
57
83
|
const errResult = makeError('VALIDATE_ERROR', error.message, requestId, false);
|
|
58
|
-
log('error', '
|
|
84
|
+
log('error', 'provar_testsuite_validate failed', { requestId, error: error.message });
|
|
59
85
|
return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
|
|
60
86
|
}
|
|
61
87
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testSuiteValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testSuiteValidate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAuB,MAAM,wBAAwB,CAAC;AAEnG,iFAAiF;AAEjF,MAAM,cAAc,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"testSuiteValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testSuiteValidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface CheckForUpdateResult {
|
|
2
|
+
currentVersion: string;
|
|
3
|
+
latestVersion: string | null;
|
|
4
|
+
updateAvailable: boolean;
|
|
5
|
+
updateCommand: string | null;
|
|
6
|
+
fromCache: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function deriveChannel(version: string): string;
|
|
9
|
+
export declare function isNewer(current: string, latest: string): boolean;
|
|
10
|
+
export declare function detectInstallMethod(): 'sf-plugin' | 'npm-global' | 'linked';
|
|
11
|
+
export declare function checkForUpdate(opts: {
|
|
12
|
+
noUpdateCheck: boolean;
|
|
13
|
+
autoUpdate: boolean;
|
|
14
|
+
}): Promise<CheckForUpdateResult>;
|
|
@@ -0,0 +1,228 @@
|
|
|
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
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { spawnSync } from 'node:child_process';
|
|
12
|
+
import { createRequire } from 'node:module';
|
|
13
|
+
import { log } from '../logging/logger.js';
|
|
14
|
+
const requireJson = createRequire(import.meta.url);
|
|
15
|
+
const CURRENT_SERVER_VERSION = requireJson('../../../package.json').version;
|
|
16
|
+
const UPDATE_TTL_MS = 4 * 60 * 60 * 1000;
|
|
17
|
+
const UPDATE_GRACE_MS = 48 * 60 * 60 * 1000;
|
|
18
|
+
const SPAWN_OPTS = {
|
|
19
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
20
|
+
timeout: 30000,
|
|
21
|
+
shell: process.platform === 'win32',
|
|
22
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
23
|
+
};
|
|
24
|
+
const SEMVER_RE = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?$/;
|
|
25
|
+
function cacheDir() {
|
|
26
|
+
const provarHome = process.env['PROVAR_HOME'] ?? path.join(os.homedir(), 'Provar');
|
|
27
|
+
return path.join(provarHome, '.cache');
|
|
28
|
+
}
|
|
29
|
+
function cacheFile() {
|
|
30
|
+
return path.join(cacheDir(), '.mcp-update-cache.json');
|
|
31
|
+
}
|
|
32
|
+
// Derives the dist-tag channel from the current version's prerelease identifier.
|
|
33
|
+
// '1.5.0-beta.10' → 'beta', '1.5.0' → 'latest'
|
|
34
|
+
// Same-channel assumption: we fetch dist-tags.{channel} and compare within that channel.
|
|
35
|
+
// Cross-label comparison (e.g. beta vs rc) is explicitly out of scope.
|
|
36
|
+
export function deriveChannel(version) {
|
|
37
|
+
const hyphen = version.indexOf('-');
|
|
38
|
+
if (hyphen === -1)
|
|
39
|
+
return 'latest';
|
|
40
|
+
return version.slice(hyphen + 1).split('.')[0] ?? 'latest';
|
|
41
|
+
}
|
|
42
|
+
export function isNewer(current, latest) {
|
|
43
|
+
if (current === latest)
|
|
44
|
+
return false;
|
|
45
|
+
if (!SEMVER_RE.test(latest))
|
|
46
|
+
return false;
|
|
47
|
+
const split = (v) => {
|
|
48
|
+
const [main, pre = ''] = v.split('-');
|
|
49
|
+
const [major, minor, patch] = (main ?? '').split('.').map(Number);
|
|
50
|
+
// Infinity for stable versions so stable is always newer than any prerelease
|
|
51
|
+
const preN = pre ? parseInt(pre.split('.').pop() ?? '0', 10) : Infinity;
|
|
52
|
+
return [major, minor, patch, preN];
|
|
53
|
+
};
|
|
54
|
+
const [cm, cn, cp, cpN] = split(current);
|
|
55
|
+
const [lm, ln, lp, lpN] = split(latest);
|
|
56
|
+
for (const [c, l] of [
|
|
57
|
+
[cm, lm],
|
|
58
|
+
[cn, ln],
|
|
59
|
+
[cp, lp],
|
|
60
|
+
[cpN, lpN],
|
|
61
|
+
]) {
|
|
62
|
+
if (l > c)
|
|
63
|
+
return true;
|
|
64
|
+
if (l < c)
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
export function detectInstallMethod() {
|
|
70
|
+
const modulePath = fileURLToPath(import.meta.url);
|
|
71
|
+
const sfDataDirs = [
|
|
72
|
+
path.join('.local', 'share', 'sf'),
|
|
73
|
+
path.join('AppData', 'Local', 'sf'),
|
|
74
|
+
path.join('AppData', 'Roaming', 'sf'),
|
|
75
|
+
path.join('.local', 'share', 'sfdx'),
|
|
76
|
+
];
|
|
77
|
+
if (sfDataDirs.some((d) => modulePath.includes(d)))
|
|
78
|
+
return 'sf-plugin';
|
|
79
|
+
if (modulePath.includes('node_modules'))
|
|
80
|
+
return 'npm-global';
|
|
81
|
+
return 'linked';
|
|
82
|
+
}
|
|
83
|
+
function readUpdateCache() {
|
|
84
|
+
try {
|
|
85
|
+
const raw = fs.readFileSync(cacheFile(), 'utf-8');
|
|
86
|
+
return JSON.parse(raw);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function writeUpdateCache(entry) {
|
|
93
|
+
try {
|
|
94
|
+
fs.mkdirSync(cacheDir(), { recursive: true });
|
|
95
|
+
const file = cacheFile();
|
|
96
|
+
fs.writeFileSync(file, JSON.stringify(entry, null, 2), { encoding: 'utf-8', mode: 0o600 });
|
|
97
|
+
try {
|
|
98
|
+
fs.chmodSync(file, 0o600);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// best effort
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
log('warn', 'updateChecker: failed to write cache', { error: String(err) });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function buildUpdateCommand(latestVersion) {
|
|
109
|
+
const method = detectInstallMethod();
|
|
110
|
+
if (method === 'npm-global') {
|
|
111
|
+
return 'npm install -g @provartesting/provardx-cli@' + latestVersion;
|
|
112
|
+
}
|
|
113
|
+
return 'sf plugins install @provartesting/provardx-cli@' + latestVersion;
|
|
114
|
+
}
|
|
115
|
+
function resultFromCache(cached, currentVersion) {
|
|
116
|
+
const updateAvailable = cached.latestVersion ? isNewer(currentVersion, cached.latestVersion) : false;
|
|
117
|
+
const updateCommand = updateAvailable && cached.latestVersion ? buildUpdateCommand(cached.latestVersion) : null;
|
|
118
|
+
return { currentVersion, latestVersion: cached.latestVersion, updateAvailable, updateCommand, fromCache: true };
|
|
119
|
+
}
|
|
120
|
+
async function fetchLatestVersion(channel) {
|
|
121
|
+
const controller = new AbortController();
|
|
122
|
+
const timer = setTimeout(() => controller.abort(), 5000);
|
|
123
|
+
try {
|
|
124
|
+
const resp = await fetch('https://registry.npmjs.org/@provartesting/provardx-cli', {
|
|
125
|
+
signal: controller.signal,
|
|
126
|
+
headers: { Accept: 'application/json' },
|
|
127
|
+
});
|
|
128
|
+
if (!resp.ok) {
|
|
129
|
+
log('warn', 'updateChecker: registry returned non-200', { status: resp.status });
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const data = (await resp.json());
|
|
133
|
+
const distTags = data['dist-tags'];
|
|
134
|
+
const candidate = distTags?.[channel];
|
|
135
|
+
if (!candidate) {
|
|
136
|
+
log('warn', 'updateChecker: dist-tag not found in registry', { channel });
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
if (!SEMVER_RE.test(candidate)) {
|
|
140
|
+
log('warn', 'updateChecker: registry returned invalid semver', { candidate });
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
return candidate;
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
clearTimeout(timer);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function applyAutoUpdate(latestVersion) {
|
|
150
|
+
const method = detectInstallMethod();
|
|
151
|
+
if (method === 'linked') {
|
|
152
|
+
process.stderr.write('[provar-mcp] Auto-update skipped: running from development link. Install manually:\n' +
|
|
153
|
+
' sf plugins install @provartesting/provardx-cli@' +
|
|
154
|
+
latestVersion +
|
|
155
|
+
'\n');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const args = method === 'sf-plugin'
|
|
159
|
+
? ['plugins', 'install', '@provartesting/provardx-cli@' + latestVersion]
|
|
160
|
+
: ['install', '-g', '@provartesting/provardx-cli@' + latestVersion];
|
|
161
|
+
const cmd = method === 'sf-plugin' ? 'sf' : 'npm';
|
|
162
|
+
log('info', 'updateChecker: running auto-update', { cmd, args });
|
|
163
|
+
const result = spawnSync(cmd, args, SPAWN_OPTS);
|
|
164
|
+
if (result.error != null || result.status !== 0 || result.signal != null) {
|
|
165
|
+
const detail = result.stderr?.toString().trim() ?? '';
|
|
166
|
+
log('error', 'updateChecker: auto-update failed', { status: result.status, signal: result.signal, detail });
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
process.stderr.write('[provar-mcp] Updated to ' + latestVersion + '. Restart your MCP connection to use the new version.\n');
|
|
170
|
+
process.exit(0);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
export async function checkForUpdate(opts) {
|
|
174
|
+
const currentVersion = CURRENT_SERVER_VERSION;
|
|
175
|
+
const earlyExit = {
|
|
176
|
+
currentVersion,
|
|
177
|
+
latestVersion: null,
|
|
178
|
+
updateAvailable: false,
|
|
179
|
+
updateCommand: null,
|
|
180
|
+
fromCache: false,
|
|
181
|
+
};
|
|
182
|
+
if (process.env.NODE_ENV === 'test')
|
|
183
|
+
return earlyExit;
|
|
184
|
+
if (process.env['PROVAR_NO_UPDATE_CHECK'])
|
|
185
|
+
return earlyExit;
|
|
186
|
+
if (opts.noUpdateCheck)
|
|
187
|
+
return earlyExit;
|
|
188
|
+
const channel = deriveChannel(currentVersion);
|
|
189
|
+
const cached = readUpdateCache();
|
|
190
|
+
if (cached != null &&
|
|
191
|
+
cached.channel === channel &&
|
|
192
|
+
cached.currentVersion === currentVersion &&
|
|
193
|
+
Date.now() - cached.checkedAt < UPDATE_TTL_MS) {
|
|
194
|
+
log('info', 'updateChecker: cache hit', { channel, latestVersion: cached.latestVersion, fromCache: true });
|
|
195
|
+
return resultFromCache(cached, currentVersion);
|
|
196
|
+
}
|
|
197
|
+
let latestVersion = null;
|
|
198
|
+
try {
|
|
199
|
+
latestVersion = await fetchLatestVersion(channel);
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
203
|
+
log('warn', 'updateChecker: registry fetch failed', { error: errMsg });
|
|
204
|
+
if (cached != null && Date.now() - cached.checkedAt < UPDATE_GRACE_MS) {
|
|
205
|
+
return resultFromCache(cached, currentVersion);
|
|
206
|
+
}
|
|
207
|
+
return earlyExit;
|
|
208
|
+
}
|
|
209
|
+
writeUpdateCache({ checkedAt: Date.now(), currentVersion, latestVersion, channel });
|
|
210
|
+
const updateAvailable = latestVersion ? isNewer(currentVersion, latestVersion) : false;
|
|
211
|
+
const updateCommand = updateAvailable && latestVersion ? buildUpdateCommand(latestVersion) : null;
|
|
212
|
+
if (updateAvailable && latestVersion) {
|
|
213
|
+
process.stderr.write('[provar-mcp] Update available: ' +
|
|
214
|
+
latestVersion +
|
|
215
|
+
' (current: ' +
|
|
216
|
+
currentVersion +
|
|
217
|
+
')\n' +
|
|
218
|
+
' Run: ' +
|
|
219
|
+
(updateCommand ?? '') +
|
|
220
|
+
'\n');
|
|
221
|
+
log('info', 'updateChecker: update available', { currentVersion, latestVersion, updateCommand });
|
|
222
|
+
if (opts.autoUpdate) {
|
|
223
|
+
applyAutoUpdate(latestVersion);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return { currentVersion, latestVersion, updateAvailable, updateCommand, fromCache: false };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=updateChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateChecker.js","sourceRoot":"","sources":["../../../src/mcp/update/updateChecker.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,8 @@ export interface ProjectValidationResult {
|
|
|
62
62
|
uncovered_test_cases: string[];
|
|
63
63
|
};
|
|
64
64
|
saved_to: string | null;
|
|
65
|
+
/** Directories within plans/ that are missing a .planitem file and will be silently ignored by the Provar runner. */
|
|
66
|
+
plan_integrity_warnings?: string[];
|
|
65
67
|
/** Set when save_results was requested but the write failed (disk full, permissions, etc.). */
|
|
66
68
|
save_error?: string;
|
|
67
69
|
}
|
|
@@ -88,11 +90,12 @@ export declare function readProjectContext(projectPath: string): {
|
|
|
88
90
|
context: ProjectContext;
|
|
89
91
|
};
|
|
90
92
|
export declare function resolveTestInstance(instancePath: string, projectPath: string): TestCaseInput | null;
|
|
91
|
-
export declare function readSuiteDirectory(dirPath: string, name: string, projectPath: string, depth?: number, coveredPaths?: Set<string>, idMap?: Map<string, string
|
|
92
|
-
export declare function readPlanDirectory(planPath: string, name: string, projectPath: string, coveredPaths?: Set<string>, idMap?: Map<string, string
|
|
93
|
+
export declare function readSuiteDirectory(dirPath: string, name: string, projectPath: string, depth?: number, coveredPaths?: Set<string>, idMap?: Map<string, string>, planIntegrityWarnings?: string[]): TestSuiteInput;
|
|
94
|
+
export declare function readPlanDirectory(planPath: string, name: string, projectPath: string, coveredPaths?: Set<string>, idMap?: Map<string, string>, planIntegrityWarnings?: string[]): TestPlanInput;
|
|
93
95
|
export declare function readPlansDir(projectPath: string): {
|
|
94
96
|
plans: TestPlanInput[];
|
|
95
97
|
coveredPaths: Set<string>;
|
|
98
|
+
planIntegrityWarnings: string[];
|
|
96
99
|
};
|
|
97
100
|
/**
|
|
98
101
|
* Collects all .testcase file basenames (without extension) found under tests/.
|