@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.
Files changed (129) hide show
  1. package/README.md +163 -13
  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 +175 -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 +324 -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 +17 -0
  49. package/lib/mcp/server.js +151 -6
  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 +347 -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 +332 -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 +172 -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 +56 -50
  64. package/lib/mcp/tools/defectTools.js.map +1 -1
  65. package/lib/mcp/tools/hierarchyValidate.d.ts +1 -1
  66. package/lib/mcp/tools/hierarchyValidate.js +127 -42
  67. package/lib/mcp/tools/hierarchyValidate.js.map +1 -1
  68. package/lib/mcp/tools/nitroXTools.d.ts +23 -0
  69. package/lib/mcp/tools/nitroXTools.js +823 -0
  70. package/lib/mcp/tools/nitroXTools.js.map +1 -0
  71. package/lib/mcp/tools/pageObjectGenerate.js +132 -57
  72. package/lib/mcp/tools/pageObjectGenerate.js.map +1 -1
  73. package/lib/mcp/tools/pageObjectValidate.js +136 -46
  74. package/lib/mcp/tools/pageObjectValidate.js.map +1 -1
  75. package/lib/mcp/tools/projectInspect.js +51 -30
  76. package/lib/mcp/tools/projectInspect.js.map +1 -1
  77. package/lib/mcp/tools/projectValidateFromPath.js +70 -49
  78. package/lib/mcp/tools/projectValidateFromPath.js.map +1 -1
  79. package/lib/mcp/tools/propertiesTools.d.ts +2 -0
  80. package/lib/mcp/tools/propertiesTools.js +332 -78
  81. package/lib/mcp/tools/propertiesTools.js.map +1 -1
  82. package/lib/mcp/tools/qualityHubApiTools.d.ts +3 -0
  83. package/lib/mcp/tools/qualityHubApiTools.js +138 -0
  84. package/lib/mcp/tools/qualityHubApiTools.js.map +1 -0
  85. package/lib/mcp/tools/qualityHubTools.js +219 -70
  86. package/lib/mcp/tools/qualityHubTools.js.map +1 -1
  87. package/lib/mcp/tools/rcaTools.d.ts +3 -2
  88. package/lib/mcp/tools/rcaTools.js +189 -56
  89. package/lib/mcp/tools/rcaTools.js.map +1 -1
  90. package/lib/mcp/tools/sfSpawn.d.ts +25 -3
  91. package/lib/mcp/tools/sfSpawn.js +154 -6
  92. package/lib/mcp/tools/sfSpawn.js.map +1 -1
  93. package/lib/mcp/tools/testCaseGenerate.js +226 -78
  94. package/lib/mcp/tools/testCaseGenerate.js.map +1 -1
  95. package/lib/mcp/tools/testCaseStepTools.d.ts +4 -0
  96. package/lib/mcp/tools/testCaseStepTools.js +226 -0
  97. package/lib/mcp/tools/testCaseStepTools.js.map +1 -0
  98. package/lib/mcp/tools/testCaseValidate.d.ts +11 -0
  99. package/lib/mcp/tools/testCaseValidate.js +307 -46
  100. package/lib/mcp/tools/testCaseValidate.js.map +1 -1
  101. package/lib/mcp/tools/testPlanTools.d.ts +1 -0
  102. package/lib/mcp/tools/testPlanTools.js +299 -59
  103. package/lib/mcp/tools/testPlanTools.js.map +1 -1
  104. package/lib/mcp/tools/testPlanValidate.js +56 -18
  105. package/lib/mcp/tools/testPlanValidate.js.map +1 -1
  106. package/lib/mcp/tools/testSuiteValidate.js +37 -11
  107. package/lib/mcp/tools/testSuiteValidate.js.map +1 -1
  108. package/lib/mcp/update/updateChecker.d.ts +14 -0
  109. package/lib/mcp/update/updateChecker.js +228 -0
  110. package/lib/mcp/update/updateChecker.js.map +1 -0
  111. package/lib/services/auth/credentials.d.ts +21 -0
  112. package/lib/services/auth/credentials.js +75 -0
  113. package/lib/services/auth/credentials.js.map +1 -0
  114. package/lib/services/auth/loginFlow.d.ts +68 -0
  115. package/lib/services/auth/loginFlow.js +216 -0
  116. package/lib/services/auth/loginFlow.js.map +1 -0
  117. package/lib/services/projectValidation.d.ts +5 -2
  118. package/lib/services/projectValidation.js +83 -31
  119. package/lib/services/projectValidation.js.map +1 -1
  120. package/lib/services/qualityHub/client.d.ts +161 -0
  121. package/lib/services/qualityHub/client.js +226 -0
  122. package/lib/services/qualityHub/client.js.map +1 -0
  123. package/messages/sf.provar.auth.clear.md +16 -0
  124. package/messages/sf.provar.auth.login.md +31 -0
  125. package/messages/sf.provar.auth.rotate.md +23 -0
  126. package/messages/sf.provar.auth.status.md +16 -0
  127. package/messages/sf.provar.mcp.start.md +83 -48
  128. package/oclif.manifest.json +299 -2
  129. package/package.json +23 -12
@@ -10,11 +10,15 @@ import { makeError, makeRequestId } from '../schemas/common.js';
10
10
  import { log } from '../logging/logger.js';
11
11
  import { validatePlan, buildHierarchySummary } from './hierarchyValidate.js';
12
12
  // ── Zod schemas ───────────────────────────────────────────────────────────────
13
- const testCaseSchema = z.object({
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
- }).refine((d) => d.xml_content !== undefined || d.xml !== undefined, { message: 'Either xml_content or xml must be provided' });
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('Suite name'),
20
24
  test_cases: z.array(testCaseSchema).optional().describe('Test cases in this suite'),
@@ -26,27 +30,61 @@ const suiteSchema = z.object({
26
30
  test_suites: z.array(innerSuiteSchema).optional().describe('Child suites (one level deep)'),
27
31
  test_case_count: z.number().int().min(0).optional().describe('Explicit test case count for size check'),
28
32
  });
29
- const metadataSchema = z.object({
33
+ const metadataSchema = z
34
+ .object({
30
35
  objectives: z.string().optional().describe('Testing objectives for this plan (configured in Provar Quality Hub)'),
31
36
  in_scope: z.string().optional().describe('Features and areas in scope (configured in Provar Quality Hub)'),
32
- testing_methodology: z.string().optional().describe('Testing approach, e.g. risk-based, regression, exploratory (configured in Provar Quality Hub)'),
33
- acceptance_criteria: z.string().optional().describe('Criteria to determine when testing is complete (configured in Provar Quality Hub)'),
34
- acceptable_pass_rate: z.number().min(0).max(100).optional().describe('Minimum pass rate 0-100 for the plan to be considered successful (configured in Provar Quality Hub)'),
35
- environments: z.array(z.string()).optional().describe('Target environments, e.g. ["QA", "Staging", "UAT"] (configured in Provar Quality Hub)'),
36
- test_data_strategy: z.string().optional().describe('How test data will be prepared and cleaned up (configured in Provar Quality Hub)'),
37
+ testing_methodology: z
38
+ .string()
39
+ .optional()
40
+ .describe('Testing approach, e.g. risk-based, regression, exploratory (configured in Provar Quality Hub)'),
41
+ acceptance_criteria: z
42
+ .string()
43
+ .optional()
44
+ .describe('Criteria to determine when testing is complete (configured in Provar Quality Hub)'),
45
+ acceptable_pass_rate: z
46
+ .number()
47
+ .min(0)
48
+ .max(100)
49
+ .optional()
50
+ .describe('Minimum pass rate 0-100 for the plan to be considered successful (configured in Provar Quality Hub)'),
51
+ environments: z
52
+ .array(z.string())
53
+ .optional()
54
+ .describe('Target environments, e.g. ["QA", "Staging", "UAT"] (configured in Provar Quality Hub)'),
55
+ test_data_strategy: z
56
+ .string()
57
+ .optional()
58
+ .describe('How test data will be prepared and cleaned up (configured in Provar Quality Hub)'),
37
59
  risks: z.string().optional().describe('Identified risks and mitigations (configured in Provar Quality Hub)'),
38
- }).optional().describe('Plan completeness metadata — these fields are configured in the Provar Quality Hub app, not in local project files');
60
+ })
61
+ .optional()
62
+ .describe('Plan completeness metadata — these fields are configured in the Provar Quality Hub app, not in local project files');
39
63
  export function registerTestPlanValidate(server) {
40
- server.tool('provar.testplan.validate', 'Validate a Provar test plan: checks for empty plans, duplicate suite names, oversized plans (>20 suites), plan completeness (objectives, scope, methodology, environments, acceptance criteria, test data strategy, risk assessment), and naming consistency. Recursively validates child suites and test cases. Returns quality score, plan-level violations, and full hierarchy results.', {
41
- plan_name: z.string().describe('Name of the test plan'),
42
- test_suites: z.array(suiteSchema).optional().describe('Test suites belonging to this plan'),
43
- test_cases: z.array(testCaseSchema).optional().describe('Test cases directly in this plan (not in a suite)'),
44
- test_suite_count: z.number().int().min(0).optional().describe('Explicit suite count for size check (overrides counting test_suites)'),
45
- metadata: metadataSchema,
46
- quality_threshold: z.number().min(0).max(100).optional().describe('Minimum quality score for a test case to be considered valid (default: 80)'),
64
+ server.registerTool('provar_testplan_validate', {
65
+ title: 'Validate Test Plan',
66
+ description: 'Validate a Provar test plan: checks for empty plans, duplicate suite names, oversized plans (>20 suites), plan completeness (objectives, scope, methodology, environments, acceptance criteria, test data strategy, risk assessment), and naming consistency. Recursively validates child suites and test cases. Returns quality score, plan-level violations, and full hierarchy results.',
67
+ inputSchema: {
68
+ plan_name: z.string().describe('Name of the test plan'),
69
+ test_suites: z.array(suiteSchema).optional().describe('Test suites belonging to this plan'),
70
+ test_cases: z.array(testCaseSchema).optional().describe('Test cases directly in this plan (not in a suite)'),
71
+ test_suite_count: z
72
+ .number()
73
+ .int()
74
+ .min(0)
75
+ .optional()
76
+ .describe('Explicit suite count for size check (overrides counting test_suites)'),
77
+ metadata: metadataSchema,
78
+ quality_threshold: z
79
+ .number()
80
+ .min(0)
81
+ .max(100)
82
+ .optional()
83
+ .describe('Minimum quality score for a test case to be considered valid (default: 80)'),
84
+ },
47
85
  }, ({ plan_name, test_suites, test_cases, test_suite_count, metadata, quality_threshold }) => {
48
86
  const requestId = makeRequestId();
49
- log('info', 'provar.testplan.validate', { requestId, plan_name });
87
+ log('info', 'provar_testplan_validate', { requestId, plan_name });
50
88
  try {
51
89
  const threshold = quality_threshold ?? 80;
52
90
  const input = {
@@ -67,7 +105,7 @@ export function registerTestPlanValidate(server) {
67
105
  catch (err) {
68
106
  const error = err;
69
107
  const errResult = makeError('VALIDATE_ERROR', error.message, requestId, false);
70
- log('error', 'provar.testplan.validate failed', { requestId, error: error.message });
108
+ log('error', 'provar_testplan_validate failed', { requestId, error: error.message });
71
109
  return { isError: true, content: [{ type: 'text', text: JSON.stringify(errResult) }] };
72
110
  }
73
111
  });
@@ -1 +1 @@
1
- {"version":3,"file":"testPlanValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testPlanValidate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testPlanValidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/testPlanValidate.ts"],"names":[],"mappings":"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"}
@@ -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.object({
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
- }).refine((d) => d.xml_content !== undefined || d.xml !== undefined, { message: 'Either xml_content or xml must be provided' });
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.number().int().min(0).optional().describe('Explicit test case count (overrides counting test_cases)'),
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.tool('provar.testsuite.validate', '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.', {
31
- suite_name: z.string().describe('Name of the test suite'),
32
- test_cases: z.array(testCaseSchema).optional().describe('Test cases directly in this suite'),
33
- child_suites: z.array(childSuiteSchema).optional().describe('Child test suites (supports up to 2 levels of nesting)'),
34
- test_case_count: z.number().int().min(0).optional().describe('Explicit total test case count for size check (overrides counting test_cases)'),
35
- quality_threshold: z.number().min(0).max(100).optional().describe('Minimum quality score for a test case to be considered valid (default: 80)'),
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', 'provar.testsuite.validate', { requestId, suite_name });
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', 'provar.testsuite.validate failed', { requestId, error: error.message });
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":"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"}
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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"}
@@ -0,0 +1,21 @@
1
+ export interface StoredCredentials {
2
+ api_key: string;
3
+ prefix: string;
4
+ set_at: string;
5
+ source: 'manual' | 'cognito' | 'salesforce';
6
+ username?: string;
7
+ tier?: string;
8
+ expires_at?: string;
9
+ }
10
+ export declare function getCredentialsPath(): string;
11
+ export declare function readStoredCredentials(): StoredCredentials | null;
12
+ export declare function writeCredentials(key: string, prefix: string, source: StoredCredentials['source'], extra?: {
13
+ username?: string;
14
+ tier?: string;
15
+ expires_at?: string;
16
+ }): void;
17
+ export declare function clearCredentials(): void;
18
+ export declare function resolveApiKey(): string | null;
19
+ export declare const credentialsService: {
20
+ resolveApiKey: typeof resolveApiKey;
21
+ };
@@ -0,0 +1,75 @@
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
+ import fs from 'node:fs';
9
+ import os from 'node:os';
10
+ import path from 'node:path';
11
+ const KEY_PREFIX = 'pv_k_';
12
+ export function getCredentialsPath() {
13
+ return path.join(os.homedir(), '.provar', 'credentials.json');
14
+ }
15
+ export function readStoredCredentials() {
16
+ try {
17
+ const p = getCredentialsPath();
18
+ if (!fs.existsSync(p))
19
+ return null;
20
+ const raw = fs.readFileSync(p, 'utf-8');
21
+ return JSON.parse(raw);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ export function writeCredentials(key, prefix, source, extra) {
28
+ if (!key.startsWith(KEY_PREFIX)) {
29
+ throw new Error(`Invalid API key format. Keys must start with "${KEY_PREFIX}".`);
30
+ }
31
+ const p = getCredentialsPath();
32
+ fs.mkdirSync(path.dirname(p), { recursive: true });
33
+ const data = {
34
+ api_key: key,
35
+ prefix,
36
+ set_at: new Date().toISOString(),
37
+ source,
38
+ ...(extra?.username ? { username: extra.username } : {}),
39
+ ...(extra?.tier ? { tier: extra.tier } : {}),
40
+ ...(extra?.expires_at ? { expires_at: extra.expires_at } : {}),
41
+ };
42
+ // mode: 0o600 sets permissions atomically on file creation (POSIX).
43
+ // chmodSync handles re-runs on existing files. Both are no-ops on Windows.
44
+ fs.writeFileSync(p, JSON.stringify(data, null, 2), { encoding: 'utf-8', mode: 0o600 });
45
+ try {
46
+ fs.chmodSync(p, 0o600);
47
+ }
48
+ catch {
49
+ /* Windows: no file permission model */
50
+ }
51
+ }
52
+ export function clearCredentials() {
53
+ const p = getCredentialsPath();
54
+ try {
55
+ fs.rmSync(p);
56
+ }
57
+ catch (err) {
58
+ const e = err;
59
+ if (e.code !== 'ENOENT')
60
+ throw err;
61
+ // file did not exist — nothing to clear, not an error
62
+ }
63
+ }
64
+ export function resolveApiKey() {
65
+ const envKey = process.env.PROVAR_API_KEY?.trim();
66
+ if (envKey?.startsWith(KEY_PREFIX))
67
+ return envKey;
68
+ const creds = readStoredCredentials();
69
+ const storedKey = typeof creds?.api_key === 'string' ? creds.api_key.trim() : null;
70
+ if (storedKey?.startsWith(KEY_PREFIX))
71
+ return storedKey;
72
+ return null;
73
+ }
74
+ export const credentialsService = { resolveApiKey };
75
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/services/auth/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAa7B,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,MAAc,EACd,MAAmC,EACnC,KAAiE;IAEjE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,iDAAiD,UAAU,IAAI,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;IAC/B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAsB;QAC9B,OAAO,EAAE,GAAG;QACZ,MAAM;QACN,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAChC,MAAM;QACN,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;IACF,oEAAoE;IACpE,2EAA2E;IAC3E,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;QACnC,sDAAsD;IACxD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,MAAM,CAAC;IAClD,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,IAAI,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,aAAa,EAAE,CAAC"}