From 6bb447405b1aa5e2ee233263e29f5334631f8b54 Mon Sep 17 00:00:00 2001 From: sanjanaravikumar-az Date: Wed, 20 May 2026 10:25:24 -0400 Subject: [PATCH 1/4] fix(cli): resolve command aliases before checking for unknown options When a user runs a command via its alias (e.g. `cdk ls` instead of `cdk list`), argv._[0] contains the alias string. The unknown options check was using this directly as the key into config.commands, which only has canonical command names. This caused all command-specific options to be incorrectly flagged as unknown. Build a reverse alias map at module scope and resolve to the canonical command name before looking up command options. Closes aws/aws-cdk-cli#1535 --- .../lib/cli/util/check-unknown-options.ts | 13 ++++++++++- .../cli/util/check-unknown-options.test.ts | 23 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/aws-cdk/lib/cli/util/check-unknown-options.ts b/packages/aws-cdk/lib/cli/util/check-unknown-options.ts index dc86eb1f8..0c988b022 100644 --- a/packages/aws-cdk/lib/cli/util/check-unknown-options.ts +++ b/packages/aws-cdk/lib/cli/util/check-unknown-options.ts @@ -30,6 +30,16 @@ function collectKnownOptions(optionDefs: Record): Set { /** Pre-computed set of known global options (static, doesn't depend on argv) */ const globalKnownOptions = collectKnownOptions(config.globalOptions); +/** Reverse mapping from command alias to canonical command name */ +const commandAliasMap = new Map(); +for (const [name, def] of Object.entries(config.commands)) { + if (def.aliases) { + for (const alias of def.aliases) { + commandAliasMap.set(alias, name); + } + } +} + /** yargs internal keys that are always present in argv */ const yargsInternals = new Set(['_', '$0', 'help', 'h', 'version']); @@ -43,8 +53,9 @@ const yargsInternals = new Set(['_', '$0', 'help', 'h', 'version']); */ export function findUnknownOptions(argv: any): string[] { const command = argv._[0]; + const canonicalCommand = commandAliasMap.get(command) ?? command; - const commandDef = config.commands[command]; + const commandDef = config.commands[canonicalCommand]; const commandKnownOptions = commandDef?.options ? collectKnownOptions(commandDef.options) : new Set(); diff --git a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts index b00c01c66..1db5dfedd 100644 --- a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts +++ b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts @@ -93,6 +93,29 @@ describe('findUnknownOptions', () => { } }); + test('resolves command aliases to canonical names (e.g. ls -> list)', () => { + const argv = { + _: ['ls'], + $0: 'cdk', + long: true, + l: true, + showDependencies: false, + 'show-dependencies': false, + d: false, + }; + expect(findUnknownOptions(argv)).toEqual([]); + }); + + test('resolves synth alias (synthesize -> synth)', () => { + const argv = { + _: ['synthesize'], + $0: 'cdk', + exclusively: true, + e: true, + }; + expect(findUnknownOptions(argv)).toEqual([]); + }); + test('still reports truly unknown options even when CDK_ env vars exist', () => { process.env.CDK_INTEG_ATMOSPHERE_POOL = 'test-pool'; try { From d22a2dbe7cb8abffbf4ea53c37021e2327361f2c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 14:33:12 +0000 Subject: [PATCH 2/4] chore: self mutation Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../test/cli/util/check-unknown-options.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts index 1db5dfedd..343700dfe 100644 --- a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts +++ b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts @@ -95,13 +95,13 @@ describe('findUnknownOptions', () => { test('resolves command aliases to canonical names (e.g. ls -> list)', () => { const argv = { - _: ['ls'], - $0: 'cdk', - long: true, - l: true, - showDependencies: false, + '_': ['ls'], + '$0': 'cdk', + 'long': true, + 'l': true, + 'showDependencies': false, 'show-dependencies': false, - d: false, + 'd': false, }; expect(findUnknownOptions(argv)).toEqual([]); }); From 7ceca8f31346fce2b189db5401814bd93ff03087 Mon Sep 17 00:00:00 2001 From: sanjanaravikumar-az Date: Wed, 20 May 2026 10:58:48 -0400 Subject: [PATCH 3/4] fix(cli): handle positional args with both cases in unknown options check Yargs stores positional args under both their original case (e.g. "ID") and lowercase (e.g. "id") in argv. The previous check only compared against the raw name from the registry, missing the other variant. --- packages/aws-cdk/lib/cli/util/check-unknown-options.ts | 7 +++++-- .../test/cli/util/check-unknown-options.test.ts | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/aws-cdk/lib/cli/util/check-unknown-options.ts b/packages/aws-cdk/lib/cli/util/check-unknown-options.ts index 0c988b022..261ad4514 100644 --- a/packages/aws-cdk/lib/cli/util/check-unknown-options.ts +++ b/packages/aws-cdk/lib/cli/util/check-unknown-options.ts @@ -60,14 +60,17 @@ export function findUnknownOptions(argv: any): string[] { ? collectKnownOptions(commandDef.options) : new Set(); - const positionalArg = commandDef?.arg?.name; + const positionalArgRaw = commandDef?.arg?.name; + const positionalArgs = positionalArgRaw + ? new Set([positionalArgRaw, positionalArgRaw.toLowerCase()]) + : new Set(); const unknown: string[] = []; for (const key of Object.keys(argv)) { if (argv[key] === undefined) { continue; } - if (yargsInternals.has(key) || key === positionalArg) { + if (yargsInternals.has(key) || positionalArgs.has(key)) { continue; } if (globalKnownOptions.has(key) || commandKnownOptions.has(key)) { diff --git a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts index 343700dfe..187daf746 100644 --- a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts +++ b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts @@ -106,6 +106,16 @@ describe('findUnknownOptions', () => { expect(findUnknownOptions(argv)).toEqual([]); }); + test('does not report positional args (both original case and lowercase)', () => { + const argv = { + '_': ['ack'], + '$0': 'cdk', + 'ID': 12345, + 'id': 12345, + }; + expect(findUnknownOptions(argv)).toEqual([]); + }); + test('resolves synth alias (synthesize -> synth)', () => { const argv = { _: ['synthesize'], From 8bc65072b468149b9d4094631cfa635d7623c8d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 15:06:24 +0000 Subject: [PATCH 4/4] chore: self mutation Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../aws-cdk/test/cli/util/check-unknown-options.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts index 187daf746..10f6926a9 100644 --- a/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts +++ b/packages/aws-cdk/test/cli/util/check-unknown-options.test.ts @@ -108,10 +108,10 @@ describe('findUnknownOptions', () => { test('does not report positional args (both original case and lowercase)', () => { const argv = { - '_': ['ack'], - '$0': 'cdk', - 'ID': 12345, - 'id': 12345, + _: ['ack'], + $0: 'cdk', + ID: 12345, + id: 12345, }; expect(findUnknownOptions(argv)).toEqual([]); });