From 5d92b420c2057f9f9100052cc6c7149b43cebb3a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Oct 2025 10:57:47 +0000 Subject: [PATCH 1/7] Initial plan From 64c353bf9e7091db53c5299cb60de2d3e67dc349 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Oct 2025 11:14:57 +0000 Subject: [PATCH 2/7] Enable multi-app deploy support in DeployCommand Co-authored-by: adrians5j <5121148+adrians5j@users.noreply.github.com> --- .../features/DeployCommand/DeployCommand.ts | 27 ++++++++++++++----- .../deployOutputs/BaseDeployOutput.ts | 6 ++--- .../GetCliRunnerService.ts | 9 +++++-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts index ffe928e216..db70d5bce9 100644 --- a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts +++ b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts @@ -18,11 +18,18 @@ export interface IDeployNoAppParams { } export interface IDeployWithAppParams extends IDeployNoAppParams { + apps: AppName[]; + build?: boolean; + preview?: boolean; +} + +export interface IDeploySingleAppParams extends IDeployNoAppParams { app: AppName; build?: boolean; preview?: boolean; } + export type IDeployCommandParams = IDeployNoAppParams | IDeployWithAppParams; const sleep = (ms: number = 1500) => setTimeout(ms); @@ -43,14 +50,15 @@ export class DeployCommand implements Command.Interface { description: "Deploys specified app or all apps in the project", examples: [ "$0 deploy api --env dev", + "$0 deploy core api --env dev", "$0 deploy admin --env prod", "$0 deploy --env prod", "$0 deploy" ], params: [ { - name: "app", - description: "Name of the app (core, admin, or api)", + name: "apps..", + description: "Name of the app(s) to deploy (core, admin, or api). You can specify multiple apps.", type: "string" } ], @@ -61,7 +69,7 @@ export class DeployCommand implements Command.Interface { type: "string", default: "dev", validation: params => { - if ("app" in params && !params.env) { + if ("apps" in params && params.apps && params.apps.length > 0 && !params.env) { throw new Error("Environment name is required when deploying an app."); } return true; @@ -111,8 +119,15 @@ export class DeployCommand implements Command.Interface { } ], handler: async (params: IDeployCommandParams) => { - if ("app" in params) { - await this.deployApp(params); + if ("apps" in params && params.apps && params.apps.length > 0) { + // Deploy specified apps + for (const app of params.apps) { + const appParams = { ...params, app }; + ui.info("Deploying %s app...", app.charAt(0).toUpperCase() + app.slice(1)); + await this.deployApp(appParams); + ui.newLine(); + } + ui.success(`Apps deployed: ${params.apps.join(", ")}`); } else { const isCi = projectSdk.isCi(); const coreStack = await projectSdk.getAppStackOutput({ @@ -195,7 +210,7 @@ export class DeployCommand implements Command.Interface { }; } - private async deployApp(params: IDeployWithAppParams) { + private async deployApp(params: IDeploySingleAppParams) { const projectSdk = await this.getProjectSdkService.execute(); const ui = this.uiService; diff --git a/packages/cli-core/src/features/DeployCommand/deployOutputs/BaseDeployOutput.ts b/packages/cli-core/src/features/DeployCommand/deployOutputs/BaseDeployOutput.ts index d49bfa104d..3e1ba7e7c7 100644 --- a/packages/cli-core/src/features/DeployCommand/deployOutputs/BaseDeployOutput.ts +++ b/packages/cli-core/src/features/DeployCommand/deployOutputs/BaseDeployOutput.ts @@ -1,5 +1,5 @@ import { UiService, StdioService } from "~/abstractions/index.js"; -import { IDeployWithAppParams } from "../DeployCommand.js"; +import { IDeploySingleAppParams } from "../DeployCommand.js"; import { ExecaChildProcess } from "execa"; export type IDeployProcess = ExecaChildProcess; @@ -9,7 +9,7 @@ export interface IBaseDeployOutputParams { stdio: StdioService.Interface; ui: UiService.Interface; showDeploymentLogs: boolean; - deployParams: IDeployWithAppParams; + deployParams: IDeploySingleAppParams; } export class BaseDeployOutput { @@ -17,7 +17,7 @@ export class BaseDeployOutput { public readonly stdio: StdioService.Interface; public readonly ui: UiService.Interface; public readonly showDeploymentLogs: boolean; - public readonly deployParams: IDeployWithAppParams; + public readonly deployParams: IDeploySingleAppParams; public constructor({ deployProcess, diff --git a/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts b/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts index 7b743ae267..58f8d7e3c6 100644 --- a/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts +++ b/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts @@ -137,9 +137,14 @@ export class DefaultGetCliRunnerService implements GetCliRunnerService.Interface yargs => { params.forEach((param: Command.ParamDefinition) => { const { name, required, validation, ...rest } = param; - - const yargsParam = yargs.positional(name, { + + // Handle variadic parameters (those ending with ..) + const isVariadic = name.endsWith(".."); + const positionalName = isVariadic ? name.slice(0, -2) : name; + + const yargsParam = yargs.positional(positionalName, { ...rest, + ...(isVariadic && { array: true }), demandOption: required }); From ada5145bb6d37e85cabb5ee093f17650c79475f0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Oct 2025 11:18:34 +0000 Subject: [PATCH 3/7] Fix code formatting for multi-app deploy changes Co-authored-by: adrians5j <5121148+adrians5j@users.noreply.github.com> --- .../src/features/DeployCommand/DeployCommand.ts | 11 ++++++++--- .../GetCliRunnerService/GetCliRunnerService.ts | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts index db70d5bce9..ad901b4cf7 100644 --- a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts +++ b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts @@ -29,7 +29,6 @@ export interface IDeploySingleAppParams extends IDeployNoAppParams { preview?: boolean; } - export type IDeployCommandParams = IDeployNoAppParams | IDeployWithAppParams; const sleep = (ms: number = 1500) => setTimeout(ms); @@ -58,7 +57,8 @@ export class DeployCommand implements Command.Interface { params: [ { name: "apps..", - description: "Name of the app(s) to deploy (core, admin, or api). You can specify multiple apps.", + description: + "Name of the app(s) to deploy (core, admin, or api). You can specify multiple apps.", type: "string" } ], @@ -69,7 +69,12 @@ export class DeployCommand implements Command.Interface { type: "string", default: "dev", validation: params => { - if ("apps" in params && params.apps && params.apps.length > 0 && !params.env) { + if ( + "apps" in params && + params.apps && + params.apps.length > 0 && + !params.env + ) { throw new Error("Environment name is required when deploying an app."); } return true; diff --git a/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts b/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts index 58f8d7e3c6..7f0036e1f8 100644 --- a/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts +++ b/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts @@ -137,11 +137,11 @@ export class DefaultGetCliRunnerService implements GetCliRunnerService.Interface yargs => { params.forEach((param: Command.ParamDefinition) => { const { name, required, validation, ...rest } = param; - + // Handle variadic parameters (those ending with ..) const isVariadic = name.endsWith(".."); const positionalName = isVariadic ? name.slice(0, -2) : name; - + const yargsParam = yargs.positional(positionalName, { ...rest, ...(isVariadic && { array: true }), From 2568d72f80e6c510b1b83bce775189ff28720408 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Oct 2025 12:01:02 +0000 Subject: [PATCH 4/7] Use explicit array: true instead of apps.. syntax Co-authored-by: adrians5j <5121148+adrians5j@users.noreply.github.com> --- .../cli-core/src/abstractions/features/Command.ts | 1 + .../src/features/DeployCommand/DeployCommand.ts | 5 +++-- .../GetCliRunnerService/GetCliRunnerService.ts | 13 +++++-------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/cli-core/src/abstractions/features/Command.ts b/packages/cli-core/src/abstractions/features/Command.ts index 02cc742e5b..d592f12a9a 100644 --- a/packages/cli-core/src/abstractions/features/Command.ts +++ b/packages/cli-core/src/abstractions/features/Command.ts @@ -5,6 +5,7 @@ export interface ICommandParamDefinition { description: string; type: "boolean" | "number" | "string"; required?: boolean; + array?: boolean; default?: any; validation?: (value: TCommandParams) => boolean | string; } diff --git a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts index ad901b4cf7..d75a364ab3 100644 --- a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts +++ b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts @@ -56,10 +56,11 @@ export class DeployCommand implements Command.Interface { ], params: [ { - name: "apps..", + name: "apps", description: "Name of the app(s) to deploy (core, admin, or api). You can specify multiple apps.", - type: "string" + type: "string", + array: true } ], options: [ diff --git a/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts b/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts index 7f0036e1f8..34c97fbaa3 100644 --- a/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts +++ b/packages/cli-core/src/services/GetCliRunnerService/GetCliRunnerService.ts @@ -126,7 +126,8 @@ export class DefaultGetCliRunnerService implements GetCliRunnerService.Interface " " + params .map(param => { - return param.required ? `<${param.name}>` : `[${param.name}]`; + const paramName = param.array ? `${param.name}..` : param.name; + return param.required ? `<${paramName}>` : `[${paramName}]`; }) .join(" "); } @@ -136,15 +137,11 @@ export class DefaultGetCliRunnerService implements GetCliRunnerService.Interface description, yargs => { params.forEach((param: Command.ParamDefinition) => { - const { name, required, validation, ...rest } = param; + const { name, required, validation, array, ...rest } = param; - // Handle variadic parameters (those ending with ..) - const isVariadic = name.endsWith(".."); - const positionalName = isVariadic ? name.slice(0, -2) : name; - - const yargsParam = yargs.positional(positionalName, { + const yargsParam = yargs.positional(name, { ...rest, - ...(isVariadic && { array: true }), + ...(array && { array: true }), demandOption: required }); From d09a4e0b865f7a0173d9694c1877c64278ae1026 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:10:15 +0000 Subject: [PATCH 5/7] Simplify interface: use single apps parameter always as optional array Co-authored-by: adrians5j <5121148+adrians5j@users.noreply.github.com> --- .../features/DeployCommand/DeployCommand.ts | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts index d75a364ab3..9980131b52 100644 --- a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts +++ b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts @@ -10,27 +10,26 @@ import open from "open"; // TODO: convert to a real service. import { PrintInfoForEnv } from "~/features/InfoCommand/PrintInfoForEnv.js"; -export interface IDeployNoAppParams { +export interface IDeployCommandParams { + apps?: AppName[]; variant?: string; region?: string; env: string; deploymentLogs?: boolean; -} - -export interface IDeployWithAppParams extends IDeployNoAppParams { - apps: AppName[]; build?: boolean; preview?: boolean; } -export interface IDeploySingleAppParams extends IDeployNoAppParams { +export interface IDeploySingleAppParams { app: AppName; + variant?: string; + region?: string; + env: string; + deploymentLogs?: boolean; build?: boolean; preview?: boolean; } -export type IDeployCommandParams = IDeployNoAppParams | IDeployWithAppParams; - const sleep = (ms: number = 1500) => setTimeout(ms); export class DeployCommand implements Command.Interface { @@ -70,12 +69,7 @@ export class DeployCommand implements Command.Interface { type: "string", default: "dev", validation: params => { - if ( - "apps" in params && - params.apps && - params.apps.length > 0 && - !params.env - ) { + if (params.apps && params.apps.length > 0 && !params.env) { throw new Error("Environment name is required when deploying an app."); } return true; @@ -125,10 +119,13 @@ export class DeployCommand implements Command.Interface { } ], handler: async (params: IDeployCommandParams) => { - if ("apps" in params && params.apps && params.apps.length > 0) { + if (params.apps && params.apps.length > 0) { // Deploy specified apps for (const app of params.apps) { - const appParams = { ...params, app }; + const appParams: IDeploySingleAppParams = { + ...params, + app + }; ui.info("Deploying %s app...", app.charAt(0).toUpperCase() + app.slice(1)); await this.deployApp(appParams); ui.newLine(); From b569ac8c0f76f79d940bbf082dc53ac737ff53a1 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Tue, 21 Oct 2025 14:48:07 +0200 Subject: [PATCH 6/7] wipwip --- webiny.config.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webiny.config.tsx b/webiny.config.tsx index 780fa52f9b..e7d57280ac 100644 --- a/webiny.config.tsx +++ b/webiny.config.tsx @@ -15,10 +15,10 @@ export default () => { Core, API, and Admin Pulumi apps that we deploy by default. */} - - - - + {/**/} + {/**/} + {/**/} + {/**/} From aad1b34449d7595121e28496f85040ee5d2e9bea Mon Sep 17 00:00:00 2001 From: adrians5j Date: Tue, 21 Oct 2025 14:55:24 +0200 Subject: [PATCH 7/7] wip --- packages/cli-core/src/features/DeployCommand/DeployCommand.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts index 9980131b52..cba7b31dc5 100644 --- a/packages/cli-core/src/features/DeployCommand/DeployCommand.ts +++ b/packages/cli-core/src/features/DeployCommand/DeployCommand.ts @@ -130,7 +130,6 @@ export class DeployCommand implements Command.Interface { await this.deployApp(appParams); ui.newLine(); } - ui.success(`Apps deployed: ${params.apps.join(", ")}`); } else { const isCi = projectSdk.isCi(); const coreStack = await projectSdk.getAppStackOutput({