From ae5534ad4c826b699743e1453b238f982b12fee2 Mon Sep 17 00:00:00 2001 From: Steve Hetzel Date: Thu, 7 May 2026 13:34:07 -0600 Subject: [PATCH 1/2] test: expect oclif parse exit code 2 for invalid-input NUTs Six NUT cases asserted ensureExitCode: 1 but the commands fail at oclif flag-parse time (Flags.file({ exists: true }), parse callbacks that throw, validate callbacks, and missing required flags), which exits with code 2. Update the assertions to match. Co-Authored-By: Claude Opus 4.7 --- test/nuts/agent.generate.template.nut.ts | 2 +- test/nuts/agent.generate.test-spec.nut.ts | 4 ++-- test/nuts/agent.test.create.nut.ts | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/nuts/agent.generate.template.nut.ts b/test/nuts/agent.generate.template.nut.ts index c4931835..c2462a27 100644 --- a/test/nuts/agent.generate.template.nut.ts +++ b/test/nuts/agent.generate.template.nut.ts @@ -92,7 +92,7 @@ describe('agent generate template NUTs', function () { execCmd( `agent generate template --agent-file ${invalidAgentFile} --agent-version ${agentVersion} --output-dir ${outputDir} --json`, - { ensureExitCode: 1 } + { ensureExitCode: 2 } ); }); diff --git a/test/nuts/agent.generate.test-spec.nut.ts b/test/nuts/agent.generate.test-spec.nut.ts index e0ae08b3..1ae339f3 100644 --- a/test/nuts/agent.generate.test-spec.nut.ts +++ b/test/nuts/agent.generate.test-spec.nut.ts @@ -58,7 +58,7 @@ describe('agent generate test-spec NUTs', function () { const outputFile = join(session.project.dir, 'specs', genUniqueString('testSpec_%s.yaml')); execCmd(`agent generate test-spec --from-definition ${invalidFile} --output-file ${outputFile} --force-overwrite`, { - ensureExitCode: 1, + ensureExitCode: 2, }); }); @@ -75,7 +75,7 @@ describe('agent generate test-spec NUTs', function () { const outputFile = join(session.project.dir, 'specs', genUniqueString('testSpec_%s.yaml')); execCmd(`agent generate test-spec --from-definition ${invalidFile} --output-file ${outputFile} --force-overwrite`, { - ensureExitCode: 1, + ensureExitCode: 2, }); }); }); diff --git a/test/nuts/agent.test.create.nut.ts b/test/nuts/agent.test.create.nut.ts index ab5c05e5..3a6bfe79 100644 --- a/test/nuts/agent.test.create.nut.ts +++ b/test/nuts/agent.test.create.nut.ts @@ -58,14 +58,14 @@ describe('agent test create', function () { const normalizedInvalidSpecPath = normalize(invalidSpecPath).replace(/\\/g, '/'); execCmd( `agent test create --api-name "${testApiName}" --spec "${normalizedInvalidSpecPath}" --target-org ${getUsername()} --preview --json`, - { ensureExitCode: 1 } + { ensureExitCode: 2 } ); }); it('should fail when required flags are missing in JSON mode', async () => { // Missing --api-name execCmd(`agent test create --target-org ${getUsername()} --json`, { - ensureExitCode: 1, + ensureExitCode: 2, }); // Missing --spec @@ -73,7 +73,7 @@ describe('agent test create', function () { execCmd( `agent test create --api-name "${testApiName}" --target-org ${getUsername()} --json`, { - ensureExitCode: 1, + ensureExitCode: 2, } ); }); From 9ea48eeae8e324ac4280a92cc53fad2d3ffaf8ff Mon Sep 17 00:00:00 2001 From: Steve Hetzel Date: Thu, 7 May 2026 14:12:42 -0600 Subject: [PATCH 2/2] fix: use nonZero ensureExitCode for invalid-input NUTs The exit code for these oclif parse failures differs by sf-plugins-core version: 12.2.6 (bundled in CLI 2.135.0) emits 2, while 12.2.13 (used in plugin-agent's own CI) catches the parse error and re-emits exit 1. Use 'nonZero' so the assertion is correct in both environments. Co-Authored-By: Claude Opus 4.7 --- test/nuts/agent.generate.template.nut.ts | 2 +- test/nuts/agent.generate.test-spec.nut.ts | 4 ++-- test/nuts/agent.test.create.nut.ts | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/nuts/agent.generate.template.nut.ts b/test/nuts/agent.generate.template.nut.ts index c2462a27..3ca561f9 100644 --- a/test/nuts/agent.generate.template.nut.ts +++ b/test/nuts/agent.generate.template.nut.ts @@ -92,7 +92,7 @@ describe('agent generate template NUTs', function () { execCmd( `agent generate template --agent-file ${invalidAgentFile} --agent-version ${agentVersion} --output-dir ${outputDir} --json`, - { ensureExitCode: 2 } + { ensureExitCode: 'nonZero' } ); }); diff --git a/test/nuts/agent.generate.test-spec.nut.ts b/test/nuts/agent.generate.test-spec.nut.ts index 1ae339f3..524bc3c8 100644 --- a/test/nuts/agent.generate.test-spec.nut.ts +++ b/test/nuts/agent.generate.test-spec.nut.ts @@ -58,7 +58,7 @@ describe('agent generate test-spec NUTs', function () { const outputFile = join(session.project.dir, 'specs', genUniqueString('testSpec_%s.yaml')); execCmd(`agent generate test-spec --from-definition ${invalidFile} --output-file ${outputFile} --force-overwrite`, { - ensureExitCode: 2, + ensureExitCode: 'nonZero', }); }); @@ -75,7 +75,7 @@ describe('agent generate test-spec NUTs', function () { const outputFile = join(session.project.dir, 'specs', genUniqueString('testSpec_%s.yaml')); execCmd(`agent generate test-spec --from-definition ${invalidFile} --output-file ${outputFile} --force-overwrite`, { - ensureExitCode: 2, + ensureExitCode: 'nonZero', }); }); }); diff --git a/test/nuts/agent.test.create.nut.ts b/test/nuts/agent.test.create.nut.ts index 3a6bfe79..13adf4d4 100644 --- a/test/nuts/agent.test.create.nut.ts +++ b/test/nuts/agent.test.create.nut.ts @@ -58,14 +58,14 @@ describe('agent test create', function () { const normalizedInvalidSpecPath = normalize(invalidSpecPath).replace(/\\/g, '/'); execCmd( `agent test create --api-name "${testApiName}" --spec "${normalizedInvalidSpecPath}" --target-org ${getUsername()} --preview --json`, - { ensureExitCode: 2 } + { ensureExitCode: 'nonZero' } ); }); it('should fail when required flags are missing in JSON mode', async () => { // Missing --api-name execCmd(`agent test create --target-org ${getUsername()} --json`, { - ensureExitCode: 2, + ensureExitCode: 'nonZero', }); // Missing --spec @@ -73,7 +73,7 @@ describe('agent test create', function () { execCmd( `agent test create --api-name "${testApiName}" --target-org ${getUsername()} --json`, { - ensureExitCode: 2, + ensureExitCode: 'nonZero', } ); });