@nexusclawhq/cli 0.3.22 → 0.3.23

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.
@@ -9,6 +9,8 @@ const chalk_1 = __importDefault(require("chalk"));
9
9
  const api_client_1 = require("../../services/api-client");
10
10
  const spinner_1 = require("../../utils/spinner");
11
11
  const logger_1 = require("../../utils/logger");
12
+ const machine_result_1 = require("../../contracts/machine-result");
13
+ const command_options_1 = require("../../utils/command-options");
12
14
  const POLL_INTERVAL = 3000;
13
15
  async function waitForCompletion(jobId, spinner, rollbackOnError) {
14
16
  const apiClient = (0, api_client_1.createApiClient)();
@@ -38,7 +40,10 @@ exports.deployCommand = new commander_1.Command('deploy')
38
40
  .option('-p, --package <id>', 'Deprecated: use --change-set-id')
39
41
  .option('-w, --wait', '等待部署完成')
40
42
  .option('--rollback-on-error', '部署失败时回滚')
41
- .action(async (options) => {
43
+ .option('--dry-run', '验证并预览部署,不提交远程部署', false)
44
+ .option('--json', '输出单个机器可读 JSON 文档', false)
45
+ .action(async (options, command) => {
46
+ const json = (0, command_options_1.isJsonOutputRequested)(options, command);
42
47
  const changeSetId = options.changeSetId || options.package;
43
48
  if (!changeSetId) {
44
49
  logger_1.logger.error('请指定变更集 ID: --change-set-id <id>');
@@ -47,12 +52,23 @@ exports.deployCommand = new commander_1.Command('deploy')
47
52
  if (options.package && !options.changeSetId) {
48
53
  logger_1.logger.warn('`--package` 已弃用;metadata deploy 现在按 changeSetId 调用后端 contract。');
49
54
  }
50
- const spinner = (0, spinner_1.createSpinner)('正在验证部署包...').start();
55
+ const spinner = json ? null : (0, spinner_1.createSpinner)('正在验证部署包...').start();
51
56
  try {
52
57
  const apiClient = (0, api_client_1.createApiClient)();
53
58
  const validation = await apiClient.validate(changeSetId);
54
59
  if (!validation.success) {
55
- spinner.fail('部署包验证失败');
60
+ spinner?.fail('部署包验证失败');
61
+ if (json) {
62
+ (0, machine_result_1.emitCliResult)((0, machine_result_1.buildCliResult)({
63
+ command: 'metadata deploy',
64
+ phase: options.dryRun ? 'dry-run' : 'validate',
65
+ contractVersion: 'nexusclaw.cli-command-contract/v1',
66
+ ok: false,
67
+ data: { changeSetId, validation, remoteMutation: false },
68
+ }));
69
+ process.exitCode = 1;
70
+ return;
71
+ }
56
72
  if (validation.errors.length > 0) {
57
73
  console.log(chalk_1.default.red(`\n错误 (${validation.errors.length}):`));
58
74
  validation.errors.forEach((err) => {
@@ -67,25 +83,42 @@ exports.deployCommand = new commander_1.Command('deploy')
67
83
  }
68
84
  process.exit(1);
69
85
  }
70
- spinner.succeed('部署包验证通过');
86
+ spinner?.succeed('部署包验证通过');
87
+ if (options.dryRun) {
88
+ const data = { changeSetId, validation, rollbackOnError: !!options.rollbackOnError, remoteMutation: false };
89
+ if (json) {
90
+ (0, machine_result_1.emitCliResult)((0, machine_result_1.buildCliResult)({
91
+ command: 'metadata deploy',
92
+ phase: 'dry-run',
93
+ contractVersion: 'nexusclaw.cli-command-contract/v1',
94
+ ok: true,
95
+ data,
96
+ }));
97
+ }
98
+ else {
99
+ console.log(` changeSetId: ${changeSetId}`);
100
+ console.log(' remoteMutation: false');
101
+ }
102
+ return;
103
+ }
71
104
  if (validation.warnings.length > 0) {
72
105
  console.log(chalk_1.default.yellow(`\n警告 (${validation.warnings.length}):`));
73
106
  validation.warnings.forEach((warn) => {
74
107
  console.log(chalk_1.default.yellow(` ⚠ ${warn}`));
75
108
  });
76
109
  }
77
- spinner.start('正在提交部署请求...');
110
+ spinner?.start('正在提交部署请求...');
78
111
  const deployResult = await apiClient.deploy(changeSetId);
79
112
  logger_1.logger.info(`\n部署任务已创建: ${chalk_1.default.cyan(deployResult.jobId)}`);
80
113
  if (options.wait) {
81
- spinner.start('等待部署完成...');
82
- const finalStatus = await waitForCompletion(deployResult.jobId, spinner, !!options.rollbackOnError);
114
+ spinner?.start('等待部署完成...');
115
+ const finalStatus = await waitForCompletion(deployResult.jobId, spinner ?? (0, spinner_1.createSpinner)('等待部署完成...'), !!options.rollbackOnError);
83
116
  if (finalStatus.status === 'success') {
84
- spinner.succeed('部署完成');
117
+ spinner?.succeed('部署完成');
85
118
  logger_1.logger.success('\n部署成功!');
86
119
  }
87
120
  else {
88
- spinner.fail('部署失败');
121
+ spinner?.fail('部署失败');
89
122
  if (finalStatus.errors && finalStatus.errors.length > 0) {
90
123
  console.log(chalk_1.default.red(`\n错误 (${finalStatus.errors.length}):`));
91
124
  finalStatus.errors.forEach((err) => {
@@ -102,13 +135,13 @@ exports.deployCommand = new commander_1.Command('deploy')
102
135
  }
103
136
  }
104
137
  else {
105
- spinner.succeed('部署请求已提交');
138
+ spinner?.succeed('部署请求已提交');
106
139
  logger_1.logger.info(`\n使用以下命令查看部署状态:`);
107
140
  console.log(chalk_1.default.cyan(` nexus metadata deploy --wait --change-set-id ${changeSetId}`));
108
141
  }
109
142
  }
110
143
  catch (error) {
111
- spinner.fail('部署失败');
144
+ spinner?.fail('部署失败');
112
145
  const message = error instanceof Error ? error.message : String(error);
113
146
  logger_1.logger.error(message);
114
147
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../../src/commands/metadata/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../../../src/commands/metadata/deploy.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@ const chalk_1 = __importDefault(require("chalk"));
9
9
  const api_client_1 = require("../../services/api-client");
10
10
  const spinner_1 = require("../../utils/spinner");
11
11
  const logger_1 = require("../../utils/logger");
12
+ const machine_result_1 = require("../../contracts/machine-result");
13
+ const command_options_1 = require("../../utils/command-options");
12
14
  async function waitForPromotion(client, id, timeoutMs) {
13
15
  const startedAt = Date.now();
14
16
  while (Date.now() - startedAt < timeoutMs) {
@@ -28,16 +30,39 @@ exports.packagePromoteCommand = new commander_1.Command('promote')
28
30
  .requiredOption('--to <targetChannel>', '目标 channel')
29
31
  .option('--wait', '等待审批完成', false)
30
32
  .option('--timeout-ms <timeout>', '等待审批超时', '30000')
31
- .action(async (packageName, version, options) => {
33
+ .option('--dry-run', '预览 promotion 请求,不执行远程写入', false)
34
+ .option('--json', '输出单个机器可读 JSON 文档', false)
35
+ .action(async (packageName, version, options, command) => {
36
+ const json = (0, command_options_1.isJsonOutputRequested)(options, command);
37
+ const input = {
38
+ packageName,
39
+ version,
40
+ sourceChannel: options.from,
41
+ targetChannel: options.to,
42
+ };
43
+ if (options.dryRun) {
44
+ const data = { operation: 'package.promote', ...input, remoteMutation: false };
45
+ if (json) {
46
+ (0, machine_result_1.emitCliResult)((0, machine_result_1.buildCliResult)({
47
+ command: 'package promote',
48
+ phase: 'dry-run',
49
+ contractVersion: 'nexusclaw.cli-command-contract/v1',
50
+ ok: true,
51
+ data,
52
+ }));
53
+ }
54
+ else {
55
+ console.log(chalk_1.default.cyan(`${packageName}@${version}`));
56
+ console.log(` from: ${options.from}`);
57
+ console.log(` to: ${options.to}`);
58
+ console.log(' remoteMutation: false');
59
+ }
60
+ return;
61
+ }
32
62
  const spinner = (0, spinner_1.createSpinner)('正在创建 promotion...').start();
33
63
  try {
34
64
  const client = (0, api_client_1.createApiClient)();
35
- const promotion = await client.promotePackage({
36
- packageName,
37
- version,
38
- sourceChannel: options.from,
39
- targetChannel: options.to,
40
- });
65
+ const promotion = await client.promotePackage(input);
41
66
  let finalPromotion = promotion;
42
67
  if (options.wait && promotion.approvalStatus === 'pending') {
43
68
  spinner.text = '等待审批结果...';
@@ -1 +1 @@
1
- {"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../../../src/commands/package/promote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../../../src/commands/package/promote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_http_1 = __importDefault(require("node:http"));
8
+ const node_test_1 = __importDefault(require("node:test"));
9
+ const commander_1 = require("commander");
10
+ const package_1 = require("./package");
11
+ const sandbox_1 = require("./sandbox");
12
+ const index_1 = require("./index");
13
+ async function runDryRun(register, args) {
14
+ const logs = [];
15
+ const originalLog = console.log;
16
+ try {
17
+ console.log = (...values) => logs.push(values.map(String).join(' '));
18
+ const program = new commander_1.Command().option('--json');
19
+ register(program);
20
+ await program.parseAsync(['node', 'nexus', '--json', ...args], { from: 'node' });
21
+ }
22
+ finally {
23
+ console.log = originalLog;
24
+ }
25
+ strict_1.default.equal(logs.length, 1, 'machine mode must emit exactly one stdout document');
26
+ return JSON.parse(logs[0]);
27
+ }
28
+ (0, node_test_1.default)('sandbox create dry-run is local and emits a machine preview', async () => {
29
+ const result = await runDryRun(sandbox_1.registerSandboxCommands, [
30
+ 'sandbox', 'create', '--name', 'preview-only', '--type', 'developer', '--dry-run',
31
+ ]);
32
+ strict_1.default.equal(result.schemaVersion, 'nexusclaw.cli-result/v1');
33
+ strict_1.default.equal(result.phase, 'dry-run');
34
+ strict_1.default.equal(result.data.remoteMutation, false);
35
+ strict_1.default.equal(result.data.name, 'preview-only');
36
+ });
37
+ (0, node_test_1.default)('package promote dry-run is local and emits a machine preview', async () => {
38
+ const result = await runDryRun(package_1.registerPackageCommands, [
39
+ 'package', 'promote', 'workspace.org-base', '1.0.0',
40
+ '--from', 'development', '--to', 'production', '--dry-run',
41
+ ]);
42
+ strict_1.default.equal(result.schemaVersion, 'nexusclaw.cli-result/v1');
43
+ strict_1.default.equal(result.phase, 'dry-run');
44
+ strict_1.default.equal(result.data.remoteMutation, false);
45
+ strict_1.default.equal(result.data.packageName, 'workspace.org-base');
46
+ });
47
+ (0, node_test_1.default)('metadata deploy dry-run validates but never submits deployment', async () => {
48
+ const requests = [];
49
+ const server = node_http_1.default.createServer((request, response) => {
50
+ requests.push(request.url ?? '');
51
+ request.resume();
52
+ request.on('end', () => {
53
+ response.writeHead(200, { 'Content-Type': 'application/json' });
54
+ response.end(JSON.stringify({
55
+ success: true,
56
+ data: { success: true, errors: [], warnings: [] },
57
+ }));
58
+ });
59
+ });
60
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
61
+ const address = server.address();
62
+ strict_1.default.ok(address && typeof address !== 'string');
63
+ const previousBaseUrl = process.env.NEXUS_BASE_URL;
64
+ const previousToken = process.env.NEXUS_AUTH_TOKEN;
65
+ process.env.NEXUS_BASE_URL = `http://127.0.0.1:${address.port}`;
66
+ process.env.NEXUS_AUTH_TOKEN = 'test-token';
67
+ try {
68
+ const result = await runDryRun(index_1.registerMetadataCommands, [
69
+ 'metadata', 'deploy', '--change-set-id', 'change-set-preview', '--dry-run',
70
+ ]);
71
+ strict_1.default.equal(result.schemaVersion, 'nexusclaw.cli-result/v1');
72
+ strict_1.default.equal(result.phase, 'dry-run');
73
+ strict_1.default.equal(result.data.remoteMutation, false);
74
+ strict_1.default.deepEqual(requests, ['/api/metadata/validate']);
75
+ }
76
+ finally {
77
+ process.env.NEXUS_BASE_URL = previousBaseUrl;
78
+ process.env.NEXUS_AUTH_TOKEN = previousToken;
79
+ await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
80
+ }
81
+ });
82
+ //# sourceMappingURL=safe-write-dry-run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-write-dry-run.test.js","sourceRoot":"","sources":["../../../../src/commands/safe-write-dry-run.test.ts"],"names":[],"mappings":"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"}
@@ -5,12 +5,41 @@ const commander_1 = require("commander");
5
5
  const spinner_1 = require("../../utils/spinner");
6
6
  const error_handler_1 = require("../../utils/error-handler");
7
7
  const api_client_1 = require("../../services/api-client");
8
+ const machine_result_1 = require("../../contracts/machine-result");
9
+ const command_options_1 = require("../../utils/command-options");
8
10
  exports.createCommand = new commander_1.Command('create')
9
11
  .description('Create a new sandbox')
10
12
  .requiredOption('-n, --name <name>', 'Sandbox name')
11
13
  .option('-t, --type <type>', 'Sandbox type: developer|partial|full', 'developer')
12
14
  .option('-o, --target-org <alias>', 'Target org alias')
13
- .action((0, error_handler_1.withErrorHandler)(async (opts) => {
15
+ .option('--dry-run', 'Preview the sandbox creation without remote mutation', false)
16
+ .option('--json', 'Output one machine-readable JSON document', false)
17
+ .action((0, error_handler_1.withErrorHandler)(async (opts, command) => {
18
+ const json = (0, command_options_1.isJsonOutputRequested)(opts, command);
19
+ if (opts.dryRun) {
20
+ const data = {
21
+ operation: 'sandbox.create',
22
+ targetOrg: opts.targetOrg ?? null,
23
+ name: opts.name,
24
+ type: opts.type,
25
+ remoteMutation: false,
26
+ };
27
+ if (json) {
28
+ (0, machine_result_1.emitCliResult)((0, machine_result_1.buildCliResult)({
29
+ command: 'sandbox create',
30
+ phase: 'dry-run',
31
+ contractVersion: 'nexusclaw.cli-command-contract/v1',
32
+ ok: true,
33
+ data,
34
+ }));
35
+ }
36
+ else {
37
+ console.log(`Sandbox create dry-run: ${opts.name} (${opts.type})`);
38
+ console.log(` targetOrg: ${opts.targetOrg ?? 'default'}`);
39
+ console.log(' remoteMutation: false');
40
+ }
41
+ return;
42
+ }
14
43
  const spinner = (0, spinner_1.createSpinner)(`Creating sandbox "${opts.name}"...`);
15
44
  spinner.start();
16
45
  const client = (0, api_client_1.createApiClient)(opts.targetOrg);
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../../src/commands/sandbox/create.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,iDAAoD;AACpD,6DAA6D;AAC7D,0DAA4D;AAK/C,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sBAAsB,CAAC;KACnC,cAAc,CAAC,mBAAmB,EAAE,cAAc,CAAC;KACnD,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,EAAE,WAAW,CAAC;KAChF,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,CAAC;KACtD,MAAM,CACL,IAAA,gCAAgB,EAAC,KAAK,EAAE,IAAwD,EAAE,EAAE;IAClF,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,qBAAqB,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;IACpE,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,IAAA,4BAAe,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC3B,gBAAgB,EAChB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CACrC,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,0BAA0B,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,IAAI,kBAAkB,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACrG,CAAC,CAAC,CACH,CAAC"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../../src/commands/sandbox/create.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,iDAAoD;AACpD,6DAA6D;AAC7D,0DAA4D;AAC5D,mEAA+E;AAC/E,iEAAoE;AAKvD,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sBAAsB,CAAC;KACnC,cAAc,CAAC,mBAAmB,EAAE,cAAc,CAAC;KACnD,MAAM,CAAC,mBAAmB,EAAE,sCAAsC,EAAE,WAAW,CAAC;KAChF,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,sDAAsD,EAAE,KAAK,CAAC;KAClF,MAAM,CAAC,QAAQ,EAAE,2CAA2C,EAAE,KAAK,CAAC;KACpE,MAAM,CACL,IAAA,gCAAgB,EAAC,KAAK,EAAE,IAA0F,EAAE,OAAgB,EAAE,EAAE;IACtI,MAAM,IAAI,GAAG,IAAA,uCAAqB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG;YACX,SAAS,EAAE,gBAAgB;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;YACjC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,cAAc,EAAE,KAAK;SACtB,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,IAAA,8BAAa,EAAC,IAAA,+BAAc,EAAC;gBAC3B,OAAO,EAAE,gBAAgB;gBACzB,KAAK,EAAE,SAAS;gBAChB,eAAe,EAAE,mCAAmC;gBACpD,EAAE,EAAE,IAAI;gBACR,IAAI;aACL,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,qBAAqB,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;IACpE,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,MAAM,GAAG,IAAA,4BAAe,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC3B,gBAAgB,EAChB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CACrC,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,0BAA0B,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,IAAI,kBAAkB,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACrG,CAAC,CAAC,CACH,CAAC"}
@@ -1,4 +1,4 @@
1
- export declare const WORKFORCE_TEST_CLI_VERSION = "0.3.22";
1
+ export declare const WORKFORCE_TEST_CLI_VERSION = "0.3.23";
2
2
  export declare function assertWorkforceTestCompatibility(compatibilityVersion: string): void;
3
3
  export interface AgentTestCaseView {
4
4
  id: string;
@@ -12,7 +12,7 @@ exports.listTestResultsRemote = listTestResultsRemote;
12
12
  exports.getTestBaselineRemote = getTestBaselineRemote;
13
13
  exports.getTestRegressionRemote = getTestRegressionRemote;
14
14
  const api_client_1 = require("./api-client");
15
- exports.WORKFORCE_TEST_CLI_VERSION = '0.3.22';
15
+ exports.WORKFORCE_TEST_CLI_VERSION = '0.3.23';
16
16
  function parseCompatibilityVersion(version) {
17
17
  const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(version.trim());
18
18
  if (!match)
@@ -22,9 +22,9 @@ const workforce_test_remote_1 = require("./workforce-test-remote");
22
22
  strict_1.default.throws(() => (0, workforce_test_remote_1.assertWorkforceTestCompatibility)('unknown'), /did not publish cliCompatibilityVersion/);
23
23
  });
24
24
  (0, node_test_1.default)('evaluation preflight blocks a mismatched CLI/Core contract', () => {
25
- strict_1.default.throws(() => (0, workforce_test_remote_1.assertWorkforceTestCompatibility)('0.4.0'), /CLI 0.3.22, Core requires 0.4.0/);
25
+ strict_1.default.throws(() => (0, workforce_test_remote_1.assertWorkforceTestCompatibility)('0.4.0'), /CLI 0.3.23, Core requires 0.4.0/);
26
26
  });
27
27
  (0, node_test_1.default)('evaluation preflight blocks an older CLI than the Core patch contract', () => {
28
- strict_1.default.throws(() => (0, workforce_test_remote_1.assertWorkforceTestCompatibility)('0.3.23'), /CLI 0.3.22, Core requires 0.3.23/);
28
+ strict_1.default.throws(() => (0, workforce_test_remote_1.assertWorkforceTestCompatibility)('0.3.24'), /CLI 0.3.23, Core requires 0.3.24/);
29
29
  });
30
30
  //# sourceMappingURL=workforce-test-remote.test.js.map