npm package diff

Package: @forge/cli

Versions: 11.0.0 - 11.0.1-next.14

Added: package/out/command-line/uninstall-command-helpers.js

Added: package/out/command-line/uninstall-command-helpers.d.ts.map

Added: package/out/command-line/uninstall-command-helpers.d.ts

Modified: package/out/environment/graphql-client.js

Index: package/out/environment/graphql-client.js
===================================================================
--- package/out/environment/graphql-client.js
+++ package/out/environment/graphql-client.js
@@ -58,9 +58,9 @@
             createdAt
             versions(first: 1) {
               nodes {
                 updatedAt
-                primaryProduct
+                requiredProducts
               }
             }
           }
         }
@@ -76,9 +76,9 @@
             return {
                 type: environment.type,
                 key: environment.key,
                 lastDeployedAt: environment.versions?.nodes?.[0]?.updatedAt || environment.createdAt,
-                primaryProduct: environment.versions?.nodes?.[0]?.primaryProduct || undefined
+                requiredProducts: environment.versions?.nodes?.[0]?.requiredProducts || []
             };
         });
     }
     async deleteEnvironments(details) {

Modified: package/out/installations/graphql-client.js

Index: package/out/installations/graphql-client.js
===================================================================
--- package/out/installations/graphql-client.js
+++ package/out/installations/graphql-client.js
@@ -449,9 +449,9 @@
           environmentByKey(key: $environmentKey) {
             type
             versions(first: $firstN) {
               nodes {
-                primaryProduct
+                requiredProducts
                 permissions {
                   egress {
                     addresses
                   }

Modified: package/out/command-line/controller/install-controller.js

Index: package/out/command-line/controller/install-controller.js
===================================================================
--- package/out/command-line/controller/install-controller.js
+++ package/out/command-line/controller/install-controller.js
@@ -69,14 +69,19 @@
                 return text.cmd.end(false);
             }
         });
     }
-    async promptForProduct() {
+    async promptForProducts(requiredProducts) {
         this.ui.info(cli_shared_1.Text.installationContext.overviewProduct);
-        return await this.ui.promptForList(cli_shared_1.Text.installationContext.promptProduct, await this.supportedProductsService.getSupportedProducts());
+        if (requiredProducts?.length) {
+            return await this.ui.promptForMultiSelectList(cli_shared_1.Text.installationContext.promptOptionalProducts, await this.supportedProductsService.getSupportedProducts(requiredProducts));
+        }
+        return [
+            await this.ui.promptForList(cli_shared_1.Text.installationContext.promptProduct, await this.supportedProductsService.getSupportedProducts())
+        ];
     }
-    async promptForSite(product) {
-        const isWorkspaceBased = product && (await this.supportedProductsService.isWorkspaceProduct(product));
+    async promptForSite(products) {
+        const isWorkspaceBased = products.length > 0 && (await this.supportedProductsService.isWorkspaceProduct(products[0]));
         const overviewText = isWorkspaceBased
             ? cli_shared_1.Text.installationContext.overviewWorkspace
             : cli_shared_1.Text.installationContext.overviewSite;
         this.ui.info(overviewText);
@@ -87,9 +92,9 @@
         const invalidText = isWorkspaceBased ? cli_shared_1.Text.error.invalidWorkspace : cli_shared_1.Text.error.invalidSite;
         if (!trySite) {
             throw new cli_shared_1.ValidationError(invalidText);
         }
-        return this.supportedProductsService.validateSite(trySite, product);
+        return this.supportedProductsService.validateSite(trySite, products[0]);
     }
     async promptForUpgrade(siteOption, productOption, environmentOption) {
         const { installations } = await this.installationService.listNonTechnicalAppInstallations({
             site: siteOption,
@@ -142,29 +147,55 @@
         if (uiKit1Modules.length > 0) {
             this.installView.displayUIKit1DeprecationMessage(uiKit1Modules);
         }
     };
-    async run({ environment, site, product, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive }) {
+    async run({ environment, site, products, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive }) {
         const { id } = await this.appConfigProvider();
         const text = upgrade ? cli_shared_1.Text.upgrade : cli_shared_1.Text.install;
         const validLicense = this.validateLicenseOption(license, environment);
         const overrides = await this.validateEcosystemAppInstallationOverridesInput(licenseModes, usersWithAccess, environment);
-        if (upgrade && (!site || !product)) {
-            const upgradeResult = await this.promptForUpgrade(site, product, environment);
+        const { installations } = (await this.installationService.listAppInstallations()) ?? [];
+        const environmentPermissions = await this.installationService.getAppEnvironmentPermissions(id, environment);
+        const requiredProducts = environmentPermissions?.requiredProducts;
+        if (upgrade && (!site || !products?.length)) {
+            const upgradeResult = await this.promptForUpgrade(site, products?.[0], environment);
             environment = upgradeResult.environment;
             site = upgradeResult.site;
-            product = upgradeResult.product;
+            products = [upgradeResult.product];
         }
-        product = product ? product : await this.promptForProduct();
-        site = site ? site : await this.promptForSite(product);
-        const bannerText = product && (await this.supportedProductsService.isWorkspaceProduct(product))
+        if (!requiredProducts?.length) {
+            products = products?.length ? products : await this.promptForProducts();
+            site = site ? site : await this.promptForSite(products);
+        }
+        else {
+            site = site ? site : await this.promptForSite([]);
+            if (!products?.length) {
+                const hasRequiredInstallations = this.checkRequiredInstallationExists(installations, site.host, requiredProducts);
+                if (hasRequiredInstallations) {
+                    this.ui.info(cli_shared_1.Text.install.alreadyInstalledInRequiredProduct(requiredProducts[0]));
+                    products = products?.length ? products : await this.promptForProducts(requiredProducts);
+                }
+                else {
+                    this.ui.info(cli_shared_1.Text.install.installingToRequiredProduct(requiredProducts[0]));
+                    products = requiredProducts;
+                }
+            }
+            else {
+                if (requiredProducts.includes(products[0])) {
+                    this.ui.info(cli_shared_1.Text.install.installingToRequiredProduct(products[0]));
+                }
+                else {
+                    this.ui.info(cli_shared_1.Text.install.installingToOptionalProduct);
+                }
+            }
+        }
+        const bannerText = (await this.supportedProductsService.isWorkspaceProduct(products[0]))
             ? text.bannerWorkspace
             : text.bannerSite;
         this.ui.info(bannerText);
         if ((0, cli_shared_1.isSecureSite)(site)) {
             await this.securityPrompt(site);
         }
-        const environmentPermissions = await this.installationService.getAppEnvironmentPermissions(id, environment);
         if (!environmentPermissions?.hasDeployments) {
             this.ui.error(new NoDeploymentError(environment), { pad: false });
             return;
         }
@@ -184,31 +215,33 @@
         const addedScopes = await this.extractAddedScopes(environmentPermissions);
         const scopesConfirmationResult = await this.installView.promptForPermissionsConfirmation(environmentPermissions, addedScopes, [...manifestScopes], manifestEgressAddresses, environment, confirmScopes, !!nonInteractive, text);
         if (!scopesConfirmationResult)
             return;
-        const isAlreadyUpdated = await this.installOrUpgrade(upgrade, environment, environmentType, site, product, id, text, validLicense, overrides);
-        if (isAlreadyUpdated) {
-            this.ui.info(cli_shared_1.Text.upgrade.alreadyUpdated.banner(environment, product, site.host));
+        for (const product of products) {
+            const isAlreadyUpdated = await this.installOrUpgrade(upgrade, environment, environmentType, site, product, id, text, validLicense, overrides);
+            if (isAlreadyUpdated) {
+                this.ui.info(cli_shared_1.Text.upgrade.alreadyUpdated.banner(environment, product, site.host));
+            }
+            else {
+                this.ui.emptyLine();
+                this.ui.info(text.success.banner(environment, environmentType, product, site.host));
+                const uniqueProductsFromScopes = this.getUniqueInstallationProductsFromScopes(environmentScopes);
+                if (!uniqueProductsFromScopes || uniqueProductsFromScopes.length <= 1)
+                    return;
+                const { installations } = await this.installationService.listNonTechnicalAppInstallations({
+                    site,
+                    environment
+                });
+                const productsToUpgrade = installations
+                    .filter((installation) => !installation.version.isLatest)
+                    .map((installation) => installation.product);
+                const installedProducts = installations.map((installation) => installation.product);
+                const productsToInstall = uniqueProductsFromScopes.filter((product) => !installedProducts.includes(product));
+                if (!productsToInstall.length && productsToUpgrade.length === 0)
+                    return;
+                this.ui.warn(cli_shared_1.Text.install.multiProductScopesDetected(productsToInstall, productsToUpgrade, site.host, environment));
+            }
         }
-        else {
-            this.ui.emptyLine();
-            this.ui.info(text.success.banner(environment, environmentType, product, site.host));
-            const uniqueProductsFromScopes = this.getUniqueInstallationProductsFromScopes(environmentScopes);
-            if (!uniqueProductsFromScopes || uniqueProductsFromScopes.length <= 1)
-                return;
-            const { installations } = await this.installationService.listNonTechnicalAppInstallations({
-                site,
-                environment
-            });
-            const productsToUpgrade = installations
-                .filter((installation) => !installation.version.isLatest)
-                .map((installation) => installation.product);
-            const installedProducts = installations.map((installation) => installation.product);
-            const productsToInstall = uniqueProductsFromScopes.filter((product) => !installedProducts.includes(product));
-            if (productsToInstall.length === 0 && productsToUpgrade.length === 0)
-                return;
-            this.ui.warn(cli_shared_1.Text.install.multiProductScopesDetected(productsToInstall, productsToUpgrade, site.host, environment));
-        }
     }
     async extractAddedScopes({ addedScopes }) {
         const scopesWithInteractiveConsent = (0, manifest_1.getScopesWithInteractiveConsent)();
         return addedScopes.map((scope) => ({
@@ -264,6 +297,9 @@
         return ecosystemLicenseModes && usersWithAccess
             ? { licenseModes: ecosystemLicenseModes, usersWithAccess }
             : undefined;
     }
+    checkRequiredInstallationExists = (installations, site, requiredProducts) => {
+        return requiredProducts.every((requiredProduct) => installations.some((installation) => installation.site.includes(site) && installation.product.toLowerCase() === requiredProduct.toLowerCase()));
+    };
 }
 exports.InstallController = InstallController;

Modified: package/out/service/installation-service.js

Index: package/out/service/installation-service.js
===================================================================
--- package/out/service/installation-service.js
+++ package/out/service/installation-service.js
@@ -95,27 +95,27 @@
         }
     }
     getPermissionsFromAppEnvironmentVersion(appEnvironmentVersion) {
         const permissions = appEnvironmentVersion?.permissions[0];
-        const primaryProduct = appEnvironmentVersion?.primaryProduct ?? undefined;
+        const requiredProducts = appEnvironmentVersion?.requiredProducts ?? [];
         if (!permissions) {
-            return { scopes: [], egressAddresses: [], primaryProduct };
+            return { scopes: [], egressAddresses: [], requiredProducts };
         }
         const scopes = permissions.scopes.map((s) => s.key);
         const egressAddresses = permissions?.egress ? (0, cli_shared_1.flatMap)(permissions.egress, ({ addresses }) => addresses ?? []) : [];
-        return { scopes, egressAddresses, primaryProduct };
+        return { scopes, egressAddresses, requiredProducts };
     }
     async getAppEnvironmentPermissions(appId, environmentKey) {
         const versionDetails = await this.listInstallationsClient.getVersions(appId, environmentKey, 2);
         const versions = versionDetails?.nodes;
         if (!versions || versions.length === 0)
             return;
-        const [{ scopes, egressAddresses, primaryProduct }, oldVersion] = versions.map((appEnvironmentVersion) => this.getPermissionsFromAppEnvironmentVersion(appEnvironmentVersion));
+        const [{ scopes, egressAddresses, requiredProducts }, oldVersion] = versions.map((appEnvironmentVersion) => this.getPermissionsFromAppEnvironmentVersion(appEnvironmentVersion));
         const groupedEgressAddresses = (0, egress_1.sortAndGroupEgressPermissionsByDomain)(egressAddresses);
         if (!oldVersion) {
             return {
                 scopes,
-                primaryProduct,
+                requiredProducts,
                 hasDeployments: false,
                 egressAddresses: groupedEgressAddresses,
                 addedScopes: scopes,
                 environmentType: versionDetails.environmentType
@@ -124,9 +124,9 @@
         const { scopes: oldScopes } = oldVersion;
         const addedScopes = (0, lodash_1.difference)(scopes, oldScopes);
         return {
             scopes,
-            primaryProduct,
+            requiredProducts,
             hasDeployments: true,
             egressAddresses: groupedEgressAddresses,
             addedScopes,
             environmentType: versionDetails.environmentType

Modified: package/out/command-line/register-installation-commands.js

Index: package/out/command-line/register-installation-commands.js
===================================================================
--- package/out/command-line/register-installation-commands.js
+++ package/out/command-line/register-installation-commands.js
@@ -1,10 +1,10 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerCommands = exports.performMultipleUninstalls = exports.performSingleUninstall = exports.registerListInstallationsCommand = void 0;
+exports.registerCommands = exports.registerListInstallationsCommand = void 0;
 const cli_shared_1 = require("@forge/cli-shared");
 const shared_1 = require("../installations/shared");
-const errors_1 = require("./errors");
+const uninstall_command_helpers_1 = require("./uninstall-command-helpers");
 const semver_1 = require("semver");
 const COMMAND_NAME = 'install';
 const registerInstallAppCommand = async ({ cmd, controllers: { installController }, services: { supportedProductsService } }) => {
     const supportedProducts = await supportedProductsService.getSupportedProducts();
@@ -22,9 +22,9 @@
         .action(async ({ environment, site, product, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive }) => {
         await installController.run({
             environment,
             site,
-            product,
+            products: product ? [product] : [],
             upgrade,
             confirmScopes,
             license,
             licenseModes,
@@ -64,54 +64,8 @@
         });
     });
 };
 exports.registerListInstallationsCommand = registerListInstallationsCommand;
-const performSingleUninstall = async (installId, { ui, commands: { uninstallAppCommand } }) => {
-    const installation = await ui.displayProgress(() => uninstallAppCommand.execute(installId), cli_shared_1.Text.uninstall.cmd.start, (result) => ({
-        successful: !!result.successful,
-        message: cli_shared_1.Text.uninstall.cmd.success(false)
-    }));
-    const uninstallMessageFormat = installation.successful ? cli_shared_1.Text.uninstall.done : cli_shared_1.Text.uninstall.failed;
-    const uninstallMessage = uninstallMessageFormat((0, cli_shared_1.productDisplayName)(installation.product), installation.site, installation.environmentKey, false);
-    if (installation.successful) {
-        ui.info(uninstallMessage);
-    }
-    else {
-        ui.error(new shared_1.UninstallAppError(uninstallMessage));
-    }
-};
-exports.performSingleUninstall = performSingleUninstall;
-const performMultipleUninstalls = async (appsToUninstall, { ui, commands: { uninstallAppCommand } }) => {
-    const filteredInstallations = appsToUninstall.filter(({ product }) => product !== 'identity');
-    const hasMultipleNonIdentityApps = filteredInstallations.length > 1;
-    const uninstalledApps = await ui.displayProgress(() => uninstallAppCommand.batchExecute([], appsToUninstall), cli_shared_1.Text.uninstall.cmd.start, (result) => {
-        const isSuccessful = !result.some(({ successful }) => successful === false);
-        return {
-            successful: isSuccessful,
-            message: cli_shared_1.Text.uninstall.cmd.success(hasMultipleNonIdentityApps)
-        };
-    });
-    const deferredErrors = [];
-    uninstalledApps.forEach((uninstall) => {
-        const uninstallMessageFormat = uninstall.successful ? cli_shared_1.Text.uninstall.done : cli_shared_1.Text.uninstall.failed;
-        const formattedMessage = uninstallMessageFormat((0, cli_shared_1.productDisplayName)(uninstall.product), uninstall.site, uninstall.environmentKey, hasMultipleNonIdentityApps);
-        if (uninstall.successful && uninstall.product !== 'identity') {
-            ui.info(formattedMessage);
-        }
-        else if (!uninstall.successful) {
-            const uninstallError = new shared_1.UninstallAppError(formattedMessage);
-            ui.error(uninstallError);
-            deferredErrors.push(uninstallError);
-        }
-    });
-    if (uninstalledApps.some(({ successful }) => successful === false)) {
-        throw new errors_1.DeferredErrors(deferredErrors);
-    }
-    if (hasMultipleNonIdentityApps) {
-        ui.info(cli_shared_1.Text.uninstall.interactive.done);
-    }
-};
-exports.performMultipleUninstalls = performMultipleUninstalls;
 const registerUninstallCommand = async (deps) => {
     const { cmd, ui, services: { installationsService, supportedProductsService } } = deps;
     const supportedProducts = await supportedProductsService.getSupportedProducts();
     cmd
@@ -134,25 +88,25 @@
             });
             ui.info(cli_shared_1.Text.uninstall.info);
             ui.info(cli_shared_1.Text.ctrlC);
             ui.emptyLine();
-            await (0, exports.performSingleUninstall)(installation.id, deps);
+            await (0, uninstall_command_helpers_1.performSingleUninstall)(installation.id, deps);
         }
         else {
             const filteredInstallations = installations.filter((install) => install.product !== 'identity' && install.product !== 'jira-servicedesk');
-            const selectedSitesIndexes = await ui.promptForTable(cli_shared_1.Text.uninstall.interactive.desc, cli_shared_1.Text.uninstall.interactive.progressInfo, ['Environment', 'Site', 'Product'], filteredInstallations.map(({ id, environmentKey, product, site }) => ({
-                names: [(0, cli_shared_1.environmentToOption)(environmentKey), site, (0, cli_shared_1.productDisplayName)(product)],
-                value: id
-            })));
-            const appsToUninstall = filteredInstallations.filter((_, index) => selectedSitesIndexes.includes(index));
-            const selectedSites = new Set(appsToUninstall.map(({ site }) => site));
-            const remainingApps = filteredInstallations.filter((_, index) => !selectedSitesIndexes.includes(index));
-            appsToUninstall.push(...(0, shared_1.getHangingIdentityInstallationsFromSite)(installations, remainingApps, selectedSites));
-            if (appsToUninstall.length > 1) {
-                await (0, exports.performMultipleUninstalls)(appsToUninstall, deps);
+            const options = (0, uninstall_command_helpers_1.getMultiChoiceOptionsForUninstall)(filteredInstallations);
+            const selectedSitesIndexes = await ui.promptForTable(cli_shared_1.Text.uninstall.interactive.desc, cli_shared_1.Text.uninstall.interactive.progressInfo, ['Environment', 'Site', 'Product'], options);
+            const [firstUninstall, secondUninstall] = (0, uninstall_command_helpers_1.getInstallationsFromSelection)(options, selectedSitesIndexes, filteredInstallations);
+            const selectedSites = new Set(firstUninstall.map(({ site }) => site).concat(secondUninstall.map(({ site }) => site)));
+            const remainingApps = options
+                .filter((_, index) => !selectedSitesIndexes.includes(index))
+                .map(({ extra }) => filteredInstallations[extra.installationIdx]);
+            firstUninstall.push(...(0, shared_1.getHangingIdentityInstallationsFromSite)(installations, remainingApps, selectedSites));
+            if (firstUninstall.length > 1 || secondUninstall.length > 0) {
+                await (0, uninstall_command_helpers_1.performMultipleUninstalls)(firstUninstall, secondUninstall, deps);
             }
-            else {
-                await (0, exports.performSingleUninstall)(appsToUninstall[0].id, deps);
+            else if (firstUninstall.length === 1) {
+                await (0, uninstall_command_helpers_1.performSingleUninstall)(firstUninstall[0].id, deps);
             }
         }
     });
 };

Modified: package/out/installations/uninstall-app.js

Index: package/out/installations/uninstall-app.js
===================================================================
--- package/out/installations/uninstall-app.js
+++ package/out/installations/uninstall-app.js
@@ -31,8 +31,9 @@
         const uninstallOutput = await this.client.uninstallMultipleApps(appsInstallInfo.map((installInfo) => ({
             appId,
             environmentKey: installInfo.environmentKey,
             installationId: installInfo.id,
+            installationContext: installInfo.context,
             async: true
         })));
         return appsInstallInfo.map(({ product, site, environmentKey }, index) => ({
             product,

Modified: package/out/command-line/version-info.js

Index: package/out/command-line/version-info.js
===================================================================
--- package/out/command-line/version-info.js
+++ package/out/command-line/version-info.js
@@ -20,9 +20,9 @@
         return undefined;
     }
 };
 exports.getCLIDetails = getCLIDetails;
-const supportedNodeMajorVersions = [18, 20];
+const supportedNodeMajorVersions = [18, 20, 22];
 exports.semverSupportedNodeVersion = supportedNodeMajorVersions.map((v) => `${v}.x`).join(' || ');
 exports.humanReadableSupportedNodeVersion = supportedNodeMajorVersions
     .map((v) => `${v}.x`)
     .join(', ')

Modified: package/npm-shrinkwrap.json

Large diffs are not rendered by default.

Modified: package/package.json

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/cli",
-  "version": "11.0.0",
+  "version": "11.0.1-next.14",
   "description": "A command line interface for managing Atlassian-hosted apps",
   "author": "Atlassian",
   "license": "SEE LICENSE IN LICENSE.txt",
   "bin": {
@@ -17,16 +17,16 @@
     "postbuild": "chmod +x out/bin/*.js && ts-node scripts/configureAutocomplete.ts",
     "postinstall": "node -e \"fs.existsSync('./out/bin/postinstall.js') && require('./out/bin/postinstall.js')\""
   },
   "dependencies": {
-    "@forge/bundler": "4.20.8",
-    "@forge/cli-shared": "6.6.0",
-    "@forge/egress": "1.3.1",
-    "@forge/lint": "5.7.0",
-    "@forge/manifest": "8.6.1",
-    "@forge/runtime": "5.10.5",
-    "@forge/tunnel": "5.9.2",
-    "@forge/util": "1.4.7",
+    "@forge/bundler": "4.20.9-next.11",
+    "@forge/cli-shared": "6.6.1-next.8",
+    "@forge/egress": "1.4.0-next.0",
+    "@forge/lint": "5.7.1-next.9",
+    "@forge/manifest": "8.7.0-next.4",
+    "@forge/runtime": "5.10.6-next.0",
+    "@forge/tunnel": "5.9.3-next.11",
+    "@forge/util": "1.4.8-next.0",
     "@sentry/node": "7.106.0",
     "@forge/i18n": "0.0.3",
     "ajv": "^8.12.0",
     "archiver": "^6.0.2",

Modified: package/out/command-line/controller/install-controller.d.ts.map

Index: package/out/command-line/controller/install-controller.d.ts.map
===================================================================
--- package/out/command-line/controller/install-controller.d.ts.map
+++ package/out/command-line/controller/install-controller.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"install-controller.d.ts","sourceRoot":"","sources":["../../../src/command-line/controller/install-controller.ts"],"names":[],"mappings":";AAAA,OAAO,EAEL,iBAAiB,EAEjB,UAAU,EAEV,EAAE,EAYF,wBAAwB,EAEzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAA6B,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAYD,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,WAAW,EAAE,MAAM;CAGhC;AASD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,wBAAwB;gBANxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,EAAE,EACN,qBAAqB,EAAE,qBAAqB,EAC5C,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,WAAW,EACxB,wBAAwB,EAAE,wBAAwB;YAGvD,cAAc;YAmBd,gBAAgB;YA8ChB,gBAAgB;YAQhB,aAAa;YAsBb,gBAAgB;IAwB9B,OAAO,CAAC,uCAAuC;IAY/C,OAAO,CAAC,cAAc;IAGtB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,qBAAqB,CAK3B;IAEW,GAAG,CAAC,EACf,WAAW,EACX,IAAI,EACJ,OAAO,EACP,OAAO,EACP,aAAa,EACb,OAAO,EACP,YAAY,EACZ,eAAe,EACf,cAAc,EACf,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAkHrB,kBAAkB;IAUhC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,uBAAuB;YAoBjB,8CAA8C;CAW7D"}
\ No newline at end of file
+{"version":3,"file":"install-controller.d.ts","sourceRoot":"","sources":["../../../src/command-line/controller/install-controller.ts"],"names":[],"mappings":";AAAA,OAAO,EAEL,iBAAiB,EAEjB,UAAU,EAEV,EAAE,EAYF,wBAAwB,EAEzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAA2C,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAClH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAYD,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,WAAW,EAAE,MAAM;CAGhC;AASD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,wBAAwB;gBANxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,EAAE,EACN,qBAAqB,EAAE,qBAAqB,EAC5C,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,WAAW,EACxB,wBAAwB,EAAE,wBAAwB;YAGvD,cAAc;YAmBd,gBAAgB;YA8ChB,iBAAiB;YAmBjB,aAAa;YA2Bb,gBAAgB;IAwB9B,OAAO,CAAC,uCAAuC;IAa/C,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,qBAAqB,CAK3B;IAEW,GAAG,CAAC,EACf,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,aAAa,EACb,OAAO,EACP,YAAY,EACZ,eAAe,EACf,cAAc,EACf,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YA0JrB,kBAAkB;IAUhC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,uBAAuB;YAoBjB,8CAA8C;IAY5D,OAAO,CAAC,+BAA+B,CAWrC;CACH"}
\ No newline at end of file

Modified: package/out/service/installation-service.d.ts.map

Index: package/out/service/installation-service.d.ts.map
===================================================================
--- package/out/service/installation-service.d.ts.map
+++ package/out/service/installation-service.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"installation-service.d.ts","sourceRoot":"","sources":["../../src/service/installation-service.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EAGrB,KAAK,EAGL,gBAAgB,EAEhB,SAAS,EACV,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAG1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,kBAAkB,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE;QACP,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,yBAA0B,SAAQ,gCAAgC;IACjF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,kBAAkB,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,yBAAyB;IACjC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,GAAG,IAAI,CAAC;IACnD,eAAe,EAAE,kBAAkB,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACxG;AAED,MAAM,WAAW,6BAA6B;IAC5C,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrG;AAED,MAAM,WAAW,iCAAiC;IAChD,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1F;AAMD,qBAAa,kCAAmC,SAAQ,SAAS;;CAIhE;AAED,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,6BAA6B;IAC9C,OAAO,CAAC,QAAQ,CAAC,iCAAiC;gBAHjC,YAAY,EAAE,iBAAiB,EAC/B,uBAAuB,EAAE,0BAA0B,EACnD,6BAA6B,EAAE,6BAA6B,EAC5D,iCAAiC,EAAE,iCAAiC;IAGvF,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,mBAAmB;IAad,oBAAoB,CAAC,MAAM,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,eAAe,CAAC;IAOlF,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzE,gCAAgC,CAAC,MAAM,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,eAAe,CAAC;IAU9F,4BAA4B,CAAC,MAAM,EAAE,yBAAyB;IAc9D,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOrE,mBAAmB,CAC9B,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC;IAkBnB,OAAO,CAAC,uCAAuC;IAiBlC,4BAA4B,CACvC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;CAmClD"}
\ No newline at end of file
+{"version":3,"file":"installation-service.d.ts","sourceRoot":"","sources":["../../src/service/installation-service.ts"],"names":[],"mappings":"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"}
\ No newline at end of file

Modified: package/out/environment/list-environment.d.ts.map

Index: package/out/environment/list-environment.d.ts.map
===================================================================
--- package/out/environment/list-environment.d.ts.map
+++ package/out/environment/list-environment.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"list-environment.d.ts","sourceRoot":"","sources":["../../src/environment/list-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,MAAM,CAAC;IACjF,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;CACpF;AAED,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,MAAM,EAAE,qBAAqB,EAC7B,YAAY,EAAE,iBAAiB;IAGrC,OAAO;CAMrB"}
\ No newline at end of file
+{"version":3,"file":"list-environment.d.ts","sourceRoot":"","sources":["../../src/environment/list-environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,MAAM,CAAC;IACjF,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;CACpF;AAED,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,MAAM,EAAE,qBAAqB,EAC7B,YAAY,EAAE,iBAAiB;IAGrC,OAAO;CAMrB"}
\ No newline at end of file

Modified: package/out/command-line/register-installation-commands.d.ts.map

Index: package/out/command-line/register-installation-commands.d.ts.map
===================================================================
--- package/out/command-line/register-installation-commands.d.ts.map
+++ package/out/command-line/register-installation-commands.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"register-installation-commands.d.ts","sourceRoot":"","sources":["../../src/command-line/register-installation-commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAqD/D,eAAO,MAAM,gCAAgC,oDAAqD,YAAY,SAmC7G,CAAC;AAEF,eAAO,MAAM,sBAAsB,cACtB,MAAM,6CAC0B,YAAY,kBAuBxD,CAAC;AAEF,eAAO,MAAM,yBAAyB,oBACnB,YAAY,EAAE,6CACY,YAAY,kBA8CxD,CAAC;AAsEF,eAAO,MAAM,gBAAgB,qBAA4B,YAAY,KAAG,QAAQ,IAAI,CAenF,CAAC"}
\ No newline at end of file
+{"version":3,"file":"register-installation-commands.d.ts","sourceRoot":"","sources":["../../src/command-line/register-installation-commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA2DtD,eAAO,MAAM,gCAAgC,oDAAqD,YAAY,SAmC7G,CAAC;AA6EF,eAAO,MAAM,gBAAgB,qBAA4B,YAAY,KAAG,QAAQ,IAAI,CAenF,CAAC"}
\ No newline at end of file

Modified: package/out/installations/uninstall-app.d.ts.map

Index: package/out/installations/uninstall-app.d.ts.map
===================================================================
--- package/out/installations/uninstall-app.d.ts.map
+++ package/out/installations/uninstall-app.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"uninstall-app.d.ts","sourceRoot":"","sources":["../../src/installations/uninstall-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IACzE,KAAK,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9E,YAAY,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,qBAAqB,CAAC,KAAK,EAAE,2BAA2B,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;CACrG;AAED,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,kBAAkB;IAGhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAY5D,YAAY,CACvB,eAAe,GAAE,MAAM,EAAO,EAC9B,iBAAiB,CAAC,EAAE,YAAY,EAAE,GACjC,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA4BjC"}
\ No newline at end of file
+{"version":3,"file":"uninstall-app.d.ts","sourceRoot":"","sources":["../../src/installations/uninstall-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IACzE,KAAK,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9E,YAAY,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,qBAAqB,CAAC,KAAK,EAAE,2BAA2B,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;CACrG;AAED,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,kBAAkB;IAGhC,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAY5D,YAAY,CACvB,eAAe,GAAE,MAAM,EAAO,EAC9B,iBAAiB,CAAC,EAAE,YAAY,EAAE,GACjC,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA6BjC"}
\ No newline at end of file

Modified: package/CHANGELOG.md

Large diffs are not rendered by default.

Modified: package/out/environment/graphql-client.d.ts

Index: package/out/environment/graphql-client.d.ts
===================================================================
--- package/out/environment/graphql-client.d.ts
+++ package/out/environment/graphql-client.d.ts
@@ -12,9 +12,9 @@
     listEnvironment(details: ListEnvironmentDetails): Promise<{
         type: AppEnvironmentType;
         key: string;
         lastDeployedAt: string;
-        primaryProduct: import("@forge/cli-shared").EcosystemRequiredProduct | undefined;
+        requiredProducts: import("@forge/cli-shared").EcosystemRequiredProduct[];
     }[]>;
     deleteEnvironments(details: BatchDeleteEnvironmentDetails): Promise<DeleteEnvironmentOutput[]>;
     deleteEnvironment(details: DeleteEnvironmentDetails): Promise<true>;
 }

Modified: package/out/command-line/controller/install-controller.d.ts

Index: package/out/command-line/controller/install-controller.d.ts
===================================================================
--- package/out/command-line/controller/install-controller.d.ts
+++ package/out/command-line/controller/install-controller.d.ts
@@ -6,9 +6,9 @@
 import { InstallView } from '../view/install-view';
 interface InstallViewProps {
     environment: string;
     site?: URL;
-    product?: string;
+    products?: string[];
     upgrade: boolean;
     nonInteractive?: boolean;
     confirmScopes: boolean;
     license?: string;
@@ -28,20 +28,21 @@
     private readonly supportedProductsService;
     constructor(appConfigProvider: AppConfigProvider, configFile: ConfigFile, ui: UI, installAppSiteCommand: InstallAppSiteCommand, installationService: InstallationService, installView: InstallView, supportedProductsService: SupportedProductsService);
     private securityPrompt;
     private installOrUpgrade;
-    private promptForProduct;
+    private promptForProducts;
     private promptForSite;
     private promptForUpgrade;
     private getUniqueInstallationProductsFromScopes;
     private isValidLicense;
     private validateLicenseOption;
     private checkForUIKit1Modules;
-    run({ environment, site, product, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive }: InstallViewProps): Promise<void>;
+    run({ environment, site, products, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive }: InstallViewProps): Promise<void>;
     private extractAddedScopes;
     private isValidLicenseMode;
     private validateLicenseModes;
     private validateUsersWithAccess;
     private validateEcosystemAppInstallationOverridesInput;
+    private checkRequiredInstallationExists;
 }
 export {};
 //# sourceMappingURL=install-controller.d.ts.map
\ No newline at end of file

Modified: package/out/service/installation-service.d.ts

Index: package/out/service/installation-service.d.ts
===================================================================
--- package/out/service/installation-service.d.ts
+++ package/out/service/installation-service.d.ts
@@ -21,9 +21,9 @@
 }
 export interface AppEnvironmentVersionPermissions {
     scopes: string[];
     egressAddresses: string[];
-    primaryProduct?: string;
+    requiredProducts?: string[];
 }
 export interface AppEnvironmentPermissions extends AppEnvironmentVersionPermissions {
     addedScopes: string[];
     environmentType: AppEnvironmentType;

Modified: package/out/environment/list-environment.d.ts

Index: package/out/environment/list-environment.d.ts
===================================================================
--- package/out/environment/list-environment.d.ts
+++ package/out/environment/list-environment.d.ts
@@ -3,9 +3,9 @@
     appId: string;
 }
 export interface ListEnvironmentOutput extends Pick<AppEnvironment, 'key' | 'type'> {
     lastDeployedAt: string;
-    primaryProduct?: string;
+    requiredProducts?: string[];
 }
 export interface ListEnvironmentClient {
     listEnvironment(details: ListEnvironmentDetails): Promise<ListEnvironmentOutput[]>;
 }

Modified: package/out/command-line/register-installation-commands.d.ts

Index: package/out/command-line/register-installation-commands.d.ts
===================================================================
--- package/out/command-line/register-installation-commands.d.ts
+++ package/out/command-line/register-installation-commands.d.ts
@@ -1,7 +1,4 @@
 import { Dependencies } from './dependency-injection';
-import { Installation } from '../service/installation-service';
 export declare const registerListInstallationsCommand: ({ cmd, ui, services: { installationsService } }: Dependencies) => void;
-export declare const performSingleUninstall: (installId: string, { ui, commands: { uninstallAppCommand } }: Dependencies) => Promise<void>;
-export declare const performMultipleUninstalls: (appsToUninstall: Installation[], { ui, commands: { uninstallAppCommand } }: Dependencies) => Promise<void>;
 export declare const registerCommands: ({ cmd, ...deps }: Dependencies) => Promise<void>;
 //# sourceMappingURL=register-installation-commands.d.ts.map
\ No newline at end of file

Modified: package/out/installations/uninstall-app.d.ts

Index: package/out/installations/uninstall-app.d.ts
===================================================================
--- package/out/installations/uninstall-app.d.ts
+++ package/out/installations/uninstall-app.d.ts
@@ -5,8 +5,9 @@
     product: string;
     site: string;
     environmentKey: string;
     successful?: boolean;
+    errorType?: string;
 }
 export interface AsyncAppUninstallationInput extends AppUninstallationInput {
     async: true;
 }