diff --git a/package.json b/package.json index f1dd292..0d0f10b 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,11 @@ "@inquirer/prompts": "^7.10.1", "@oclif/core": "^4", "@oclif/multi-stage-output": "^0.8.29", - "@salesforce/agents": "^0.23.1", + "@salesforce/agents": "^0.23.3", "@salesforce/core": "^8.26.2", "@salesforce/kit": "^3.2.4", "@salesforce/sf-plugins-core": "^12.2.6", - "@salesforce/source-deploy-retrieve": "^12.31.11", + "@salesforce/source-deploy-retrieve": "^12.31.14", "@salesforce/types": "^1.6.0", "ansis": "^3.3.2", "fast-xml-parser": "^5.3.6", diff --git a/src/commands/agent/validate/authoring-bundle.ts b/src/commands/agent/validate/authoring-bundle.ts index c402eef..32d02a1 100644 --- a/src/commands/agent/validate/authoring-bundle.ts +++ b/src/commands/agent/validate/authoring-bundle.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; -import { Messages, SfError } from '@salesforce/core'; +import { Messages } from '@salesforce/core'; import { MultiStageOutput } from '@oclif/multi-stage-output'; import { Agent } from '@salesforce/agents'; import { colorize } from '@oclif/core/ux'; @@ -88,44 +88,33 @@ export default class AgentValidateAuthoringBundle extends SfCommand { - count += 1; - const type = line.split(':')[0]; - const rest = line.includes(':') ? line.substring(line.indexOf(':')).trim() : ''; - return `- ${colorize('red', type)}${rest}`; - }) - .join('\n'); + mso.skipTo('Validating Authoring Bundle'); + const targetOrg = flags['target-org']; + const conn = targetOrg.getConnection(flags['api-version']); + const agent = await Agent.init({ connection: conn, project: this.project!, aabName }); - mso.updateData({ errors: count.toString(), status: 'ERROR' }); - mso.error(); - - this.error(messages.getMessage('error.compilationFailed', [formattedError])); + const result = await agent.compile(); + if (result.status === 'success') { + mso.updateData({ status: 'COMPLETED' }); + mso.stop('completed'); return { - success: false, - errors: err.message.split('\n'), + success: true, }; } + // Validation failed with compilation errors -> exit 1 (404/500 set by @salesforce/agents) + mso.updateData({ errors: result.errors.length.toString(), status: 'ERROR' }); + mso.error(); + + this.log( + messages.getMessage('error.compilationFailed', [ + result.errors + .map( + (line) => + `- ${colorize('red', line.errorType)}: ${line.description} [Ln ${line.lineStart}, Col ${line.colStart}]` + ) + .join('\n'), + ]) + ); + throwAgentCompilationError(result.errors); } } diff --git a/src/common.ts b/src/common.ts index fdffbfb..3f09486 100644 --- a/src/common.ts +++ b/src/common.ts @@ -15,7 +15,10 @@ */ import { EOL } from 'node:os'; import { SfError } from '@salesforce/core'; -import { CompilationError } from '@salesforce/agents'; +import { CompilationError, COMPILATION_API_EXIT_CODES } from '@salesforce/agents'; + +/** Re-export so consumers can use the library's exit code contract (404 → 2, 500 → 3). */ +export { COMPILATION_API_EXIT_CODES }; /** * Utility function to generate SfError when there are agent compilation errors. @@ -29,6 +32,7 @@ export function throwAgentCompilationError(compilationErrors: CompilationError[] name: 'CompileAgentScriptError', message: 'Unknown compilation error occurred', data: compilationErrors, + exitCode: 1, }); } @@ -37,6 +41,7 @@ export function throwAgentCompilationError(compilationErrors: CompilationError[] throw SfError.create({ name: 'CompileAgentScriptError', message: errors.map((e) => `${e.errorType}: ${e.description} [Ln ${e.lineStart}, Col ${e.colStart}]`).join(EOL), - data: errors, + data: { errors }, + exitCode: 1, }); } diff --git a/test/commands/agent/validate/authoring-bundle.test.ts b/test/commands/agent/validate/authoring-bundle.test.ts index 703a58a..28ca60b 100644 --- a/test/commands/agent/validate/authoring-bundle.test.ts +++ b/test/commands/agent/validate/authoring-bundle.test.ts @@ -73,6 +73,7 @@ describe('Agent Validate Authoring Bundle', () => { } catch (error) { expect(error).to.be.instanceOf(SfError); expect((error as SfError).name).to.equal('CompileAgentScriptError'); + expect((error as SfError).exitCode).to.equal(1); expect((error as SfError).message).to.include('SyntaxError: Invalid syntax [Ln 10, Col 5]'); expect((error as SfError).message).to.include('SyntaxError: Unknown error [Ln 15, Col 1]'); } @@ -85,6 +86,7 @@ describe('Agent Validate Authoring Bundle', () => { } catch (error) { expect(error).to.be.instanceOf(SfError); expect((error as SfError).name).to.equal('CompileAgentScriptError'); + expect((error as SfError).exitCode).to.equal(1); expect((error as SfError).message).to.equal('Unknown compilation error occurred'); } }); diff --git a/test/nuts/z1.agent.validate.nut.ts b/test/nuts/z1.agent.validate.nut.ts index ab81a16..6fb2010 100644 --- a/test/nuts/z1.agent.validate.nut.ts +++ b/test/nuts/z1.agent.validate.nut.ts @@ -53,10 +53,9 @@ describe('agent validate authoring-bundle NUTs', function () { // Retry up to 3 times total (1 initial + 2 retries) to handle transient failures this.retries(2); - // Use the invalid authoring bundle (expects exit code 2 for compilation errors) execCmd( `agent validate authoring-bundle --api-name invalid --target-org ${getUsername()} --json`, - { ensureExitCode: 2 } + { ensureExitCode: 1 } ); }); }); diff --git a/yarn.lock b/yarn.lock index 597c29e..c08ed8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1743,16 +1743,16 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@salesforce/agents@^0.23.1": - version "0.23.1" - resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-0.23.1.tgz#a570619c92eb9103fc3b0280e8895e1cc41d6812" - integrity sha512-mQ140OBRbjIpf7/rgpMuMS4s5O0n8bkS16EdDFK6VZ87R66/m5sLb+T2VzSU7d9fS99O8ZC4/yy1X0UcbLDGPg== +"@salesforce/agents@^0.23.3": + version "0.23.3" + resolved "https://registry.yarnpkg.com/@salesforce/agents/-/agents-0.23.3.tgz#3edfe84016cffc2d9604ca19dab4bca130bcc9b6" + integrity sha512-ls+fhZi2MTtd4mYNf78t8ImAyo6K2FsN8M5SEcS9+kmnL0lDX1WhpSzIc0YyPqHdZ7CC6a/PZJ0kQ1rx5r0HYw== dependencies: - "@salesforce/core" "^8.25.1" + "@salesforce/core" "^8.26.2" "@salesforce/kit" "^3.2.4" - "@salesforce/source-deploy-retrieve" "^12.31.10" + "@salesforce/source-deploy-retrieve" "^12.31.12" "@salesforce/types" "^1.6.0" - fast-xml-parser "^5.3.5" + fast-xml-parser "^5.3.6" nock "^13.5.6" yaml "^2.8.2" @@ -1772,7 +1772,7 @@ strip-ansi "6.0.1" ts-retry-promise "^0.8.1" -"@salesforce/core@^8.18.7", "@salesforce/core@^8.23.1", "@salesforce/core@^8.23.3", "@salesforce/core@^8.24.0", "@salesforce/core@^8.25.1", "@salesforce/core@^8.26.2", "@salesforce/core@^8.5.1", "@salesforce/core@^8.8.0": +"@salesforce/core@^8.18.7", "@salesforce/core@^8.23.1", "@salesforce/core@^8.23.3", "@salesforce/core@^8.26.2", "@salesforce/core@^8.5.1", "@salesforce/core@^8.8.0": version "8.26.2" resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.26.2.tgz#1b82f7bc8e8598ba1ed8779759a5188b74841445" integrity sha512-P1otybl1d+sXg5FORl3PD82TzaOOP5aH1j0UVkpGf1p4BLw6VD0mJekS4mDc0pz6UKK2iIt0CFxXAEMKa/YtBA== @@ -1894,17 +1894,17 @@ cli-progress "^3.12.0" terminal-link "^3.0.0" -"@salesforce/source-deploy-retrieve@^12.31.10", "@salesforce/source-deploy-retrieve@^12.31.11": - version "12.31.11" - resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.31.11.tgz#58c51ebb54bd2fc2242c6374ce25fc3a3b71aea0" - integrity sha512-7LGWY4GsXl8iFz/ZvZrRdufnefQ5iezi0Pm1YQVRmJfqpBY/4kz/98gRW65h3XERASuuvAfVRLXfPVKtCHW4yA== +"@salesforce/source-deploy-retrieve@^12.31.12", "@salesforce/source-deploy-retrieve@^12.31.14": + version "12.31.14" + resolved "https://registry.yarnpkg.com/@salesforce/source-deploy-retrieve/-/source-deploy-retrieve-12.31.14.tgz#6ed0a2fdb9a14d60ed64a2dd8fdc18c16af143a6" + integrity sha512-tLnTCG6t+d+MN8pGijF6nL4lsqE37FaBINZZvyd+IDAw+7eWffFqIXK/nNyQ1ZARTNeHOs5K/NlNXNBp5+x/YQ== dependencies: - "@salesforce/core" "^8.24.0" + "@salesforce/core" "^8.26.2" "@salesforce/kit" "^3.2.4" "@salesforce/ts-types" "^2.0.12" "@salesforce/types" "^1.6.0" fast-levenshtein "^3.0.0" - fast-xml-parser "^5.3.4" + fast-xml-parser "^5.3.6" got "^11.8.6" graceful-fs "^4.2.11" ignore "^5.3.2" @@ -4723,7 +4723,7 @@ fast-xml-parser@5.3.4: dependencies: strnum "^2.1.0" -fast-xml-parser@^5.3.4, fast-xml-parser@^5.3.5, fast-xml-parser@^5.3.6: +fast-xml-parser@^5.3.6: version "5.3.6" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz#85a69117ca156b1b3c52e426495b6de266cb6a4b" integrity sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==