From 5dca8fedc1b05549e42e3d80c623caeb0840aeac Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Fri, 27 Feb 2026 12:16:10 +0100 Subject: [PATCH 1/9] feat(extensions-schema): allow production support level for plugin metadata Add `production` to the allowed values for `spec.support.level` in the extensions plugins schema so downstream metadata can consistently use production without schema validation errors. Made-with: Cursor --- workspaces/extensions/json-schema/plugins.json | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/extensions/json-schema/plugins.json b/workspaces/extensions/json-schema/plugins.json index 86a1774611..b2baf15ec3 100644 --- a/workspaces/extensions/json-schema/plugins.json +++ b/workspaces/extensions/json-schema/plugins.json @@ -128,6 +128,7 @@ "level": { "type": "string", "enum": [ + "production", "generally-available", "tech-preview", "dev-preview", From a4faa47d2f0e55399fd6329db291a8d6e21c5fbd Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Fri, 27 Feb 2026 13:49:50 +0100 Subject: [PATCH 2/9] chore(extensions): replace generally-available support term with production Remove remaining generally-available usage across extensions schema, types, examples, docs, and e2e references so production is the single support-level term used consistently. Made-with: Cursor --- workspaces/extensions/docs/catalog/plugins.md | 6 +++--- workspaces/extensions/examples/all-plugins.yaml | 2 +- ...ort-generally-available.yaml => support-production.yaml} | 6 +++--- workspaces/extensions/json-schema/packages.json | 2 +- workspaces/extensions/json-schema/plugins.json | 1 - .../extensions/packages/app/e2e-tests/extensions.test.ts | 4 ++-- .../extensions/plugins/extensions-common/report.api.md | 2 +- .../extensions-common/src/types/ExtensionsSupport.ts | 2 +- 8 files changed, 12 insertions(+), 13 deletions(-) rename workspaces/extensions/examples/plugins/{support-generally-available.yaml => support-production.yaml} (75%) diff --git a/workspaces/extensions/docs/catalog/plugins.md b/workspaces/extensions/docs/catalog/plugins.md index f46642b3c2..e09e5ddb96 100644 --- a/workspaces/extensions/docs/catalog/plugins.md +++ b/workspaces/extensions/docs/catalog/plugins.md @@ -96,7 +96,7 @@ All plugins inherit from Backstage's standard Entity interface and include: ```yaml support: provider: 'Red Hat' # Required: Support provider name, like 'Red Hat', 'IBM', 'Spotify', 'Backstage Community', etc. - level: 'generally-available' # Required: Support level + level: 'production' # Required: Support level ``` ###### Support Level Values @@ -104,7 +104,7 @@ All plugins inherit from Backstage's standard Entity interface and include: The `support.level` field indicates the maturity and support level provided bt the `support.provider`. Like: -- **`generally-available`**: Stable, fully supported plugins ready for production use. +- **`production`**: Stable, fully supported plugins ready for production use. - **`tech-preview`**: A technical preview of a plugin that is not fully supported yet. - **`dev-preview`**: An early-stage plugin. - **`community`**: Open-source plugins, supported by Community. @@ -158,7 +158,7 @@ spec: publisher: 'Red Hat' support: name: 'Red Hat' - level: 'generally-available' + level: 'production' categories: - 'CI/CD' - 'Kubernetes' diff --git a/workspaces/extensions/examples/all-plugins.yaml b/workspaces/extensions/examples/all-plugins.yaml index c372d5e8ee..3fae3623b2 100644 --- a/workspaces/extensions/examples/all-plugins.yaml +++ b/workspaces/extensions/examples/all-plugins.yaml @@ -22,7 +22,7 @@ spec: - ./plugins/search.yaml - ./plugins/support-community.yaml - ./plugins/support-dev-preview.yaml - - ./plugins/support-generally-available.yaml + - ./plugins/support-production.yaml - ./plugins/support-none.yaml - ./plugins/support-string.yaml - ./plugins/support-tech-preview.yaml diff --git a/workspaces/extensions/examples/plugins/support-generally-available.yaml b/workspaces/extensions/examples/plugins/support-production.yaml similarity index 75% rename from workspaces/extensions/examples/plugins/support-generally-available.yaml rename to workspaces/extensions/examples/plugins/support-production.yaml index a64d37432e..3285016b96 100644 --- a/workspaces/extensions/examples/plugins/support-generally-available.yaml +++ b/workspaces/extensions/examples/plugins/support-production.yaml @@ -3,8 +3,8 @@ apiVersion: extensions.backstage.io/v1alpha1 kind: Plugin metadata: namespace: extensions-plugin-demo - name: support-generally-available - title: Support Generally Available + name: support-production + title: Support Production annotations: extensions.backstage.io/pre-installed: 'true' spec: @@ -12,4 +12,4 @@ spec: - Test plugin entity support: provider: A provider - level: generally-available + level: production diff --git a/workspaces/extensions/json-schema/packages.json b/workspaces/extensions/json-schema/packages.json index 937ddef696..8ea7276e8e 100644 --- a/workspaces/extensions/json-schema/packages.json +++ b/workspaces/extensions/json-schema/packages.json @@ -134,7 +134,7 @@ "level": { "type": "string", "enum": [ - "generally-available", + "production", "tech-preview", "dev-preview", "community", diff --git a/workspaces/extensions/json-schema/plugins.json b/workspaces/extensions/json-schema/plugins.json index b2baf15ec3..d906b31a28 100644 --- a/workspaces/extensions/json-schema/plugins.json +++ b/workspaces/extensions/json-schema/plugins.json @@ -129,7 +129,6 @@ "type": "string", "enum": [ "production", - "generally-available", "tech-preview", "dev-preview", "community", diff --git a/workspaces/extensions/packages/app/e2e-tests/extensions.test.ts b/workspaces/extensions/packages/app/e2e-tests/extensions.test.ts index 1003e94a75..90e744a94d 100644 --- a/workspaces/extensions/packages/app/e2e-tests/extensions.test.ts +++ b/workspaces/extensions/packages/app/e2e-tests/extensions.test.ts @@ -155,7 +155,7 @@ test.describe('Admin > Extensions', () => { await extensions.resetSupportTypeFilter(translations.badges.certified); }); - test('Verify Generally available badge in extensions', async ({ + test('Verify production badge in extensions', async ({ browser: _browser, }) => { await extensions.selectSupportTypeFilter( @@ -171,7 +171,7 @@ test.describe('Admin > Extensions', () => { ), sharedPage, ); - await extensionHelper.clickLink({ href: '/support-generally-available' }); + await extensionHelper.clickLink({ href: '/support-production' }); await extensionHelper.labelTextContentVisible( translations.badges.productionReadyBy.replace( diff --git a/workspaces/extensions/plugins/extensions-common/report.api.md b/workspaces/extensions/plugins/extensions-common/report.api.md index 6bc4126a7b..e20e7a88a7 100644 --- a/workspaces/extensions/plugins/extensions-common/report.api.md +++ b/workspaces/extensions/plugins/extensions-common/report.api.md @@ -440,7 +440,7 @@ export enum ExtensionsSupportLevel { // (undocumented) DEV_PREVIEW = "dev-preview", // (undocumented) - GENERALLY_AVAILABLE = "generally-available", + PRODUCTION = "production", // (undocumented) NONE = "none", // (undocumented) diff --git a/workspaces/extensions/plugins/extensions-common/src/types/ExtensionsSupport.ts b/workspaces/extensions/plugins/extensions-common/src/types/ExtensionsSupport.ts index dafe4173c3..1e4ac19a7e 100644 --- a/workspaces/extensions/plugins/extensions-common/src/types/ExtensionsSupport.ts +++ b/workspaces/extensions/plugins/extensions-common/src/types/ExtensionsSupport.ts @@ -18,7 +18,7 @@ * @public */ export enum ExtensionsSupportLevel { - GENERALLY_AVAILABLE = 'generally-available', + PRODUCTION = 'production', TECH_PREVIEW = 'tech-preview', DEV_PREVIEW = 'dev-preview', COMMUNITY = 'community', From 5ab72dba74f7a927fec1fad66da2a0a283a13f67 Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Fri, 27 Feb 2026 14:05:16 +0100 Subject: [PATCH 3/9] chore(changeset): add extensions-common patch changeset Add missing changeset for @red-hat-developer-hub/backstage-plugin-extensions-common so the PR includes the required version bump metadata. Made-with: Cursor --- workspaces/extensions/.changeset/few-bugs-teach.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 workspaces/extensions/.changeset/few-bugs-teach.md diff --git a/workspaces/extensions/.changeset/few-bugs-teach.md b/workspaces/extensions/.changeset/few-bugs-teach.md new file mode 100644 index 0000000000..f465ebf273 --- /dev/null +++ b/workspaces/extensions/.changeset/few-bugs-teach.md @@ -0,0 +1,5 @@ +--- +'@red-hat-developer-hub/backstage-plugin-extensions-common': patch +--- + +Normalize support-level terminology from `generally-available` to `production` in extensions schemas, shared support-level types, and related examples/docs. From b570e6dc39d6725b8aa0c8c1f676e62dcfc0a8e5 Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Fri, 27 Feb 2026 14:12:56 +0100 Subject: [PATCH 4/9] fix(extensions): update support-level enum references to production Replace outdated GENERALLY_AVAILABLE enum checks with PRODUCTION in extensions UI filtering and badge logic to match the renamed support level enum. Made-with: Cursor --- .../extensions/plugins/extensions/src/components/Badges.tsx | 3 ++- .../plugins/extensions/src/hooks/useFilteredSupportTypes.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/workspaces/extensions/plugins/extensions/src/components/Badges.tsx b/workspaces/extensions/plugins/extensions/src/components/Badges.tsx index c4c674f5f2..f500341b22 100644 --- a/workspaces/extensions/plugins/extensions/src/components/Badges.tsx +++ b/workspaces/extensions/plugins/extensions/src/components/Badges.tsx @@ -17,6 +17,7 @@ import Chip from '@mui/material/Chip'; import TaskAltIcon from '@mui/icons-material/TaskAlt'; import Tooltip from '@mui/material/Tooltip'; +import React from 'react'; import { ExtensionsAnnotation, ExtensionsPlugin, @@ -59,7 +60,7 @@ const getBadgeOptions = ( }), }; } - if (supportLevel === ExtensionsSupportLevel.GENERALLY_AVAILABLE) { + if (supportLevel === ExtensionsSupportLevel.PRODUCTION) { return { isBadge: true, color: colors.generallyAvailable, diff --git a/workspaces/extensions/plugins/extensions/src/hooks/useFilteredSupportTypes.ts b/workspaces/extensions/plugins/extensions/src/hooks/useFilteredSupportTypes.ts index 2c6929ac34..815777e387 100644 --- a/workspaces/extensions/plugins/extensions/src/hooks/useFilteredSupportTypes.ts +++ b/workspaces/extensions/plugins/extensions/src/hooks/useFilteredSupportTypes.ts @@ -173,7 +173,7 @@ export const useFilteredSupportTypes = () => { }); Object.entries(supportLevelCounts).forEach(([level, count]) => { - if (level === ExtensionsSupportLevel.GENERALLY_AVAILABLE) { + if (level === ExtensionsSupportLevel.PRODUCTION) { allSupportTypeItems.push({ label: t('badges.generallyAvailable'), value: `support-level=${level}`, From 9ba53c2da5306906ed894665ecd1f1801368132a Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Fri, 27 Feb 2026 14:17:01 +0100 Subject: [PATCH 5/9] fix(extensions): resolve Badges.tsx React import tsc error Remove unused React runtime import and disable legacy react-in-jsx-scope lint rule for this file so TypeScript and lint checks both pass with modern JSX transform. Made-with: Cursor --- .../extensions/plugins/extensions/src/components/Badges.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/extensions/plugins/extensions/src/components/Badges.tsx b/workspaces/extensions/plugins/extensions/src/components/Badges.tsx index f500341b22..89dcbc54b9 100644 --- a/workspaces/extensions/plugins/extensions/src/components/Badges.tsx +++ b/workspaces/extensions/plugins/extensions/src/components/Badges.tsx @@ -14,10 +14,11 @@ * limitations under the License. */ +/* eslint-disable react/react-in-jsx-scope */ + import Chip from '@mui/material/Chip'; import TaskAltIcon from '@mui/icons-material/TaskAlt'; import Tooltip from '@mui/material/Tooltip'; -import React from 'react'; import { ExtensionsAnnotation, ExtensionsPlugin, From 4be82b3d14b7c1d11dce983a484b84ea248ab2d8 Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Fri, 27 Feb 2026 17:36:12 +0100 Subject: [PATCH 6/9] chore(extensions): refresh generated API reports Regenerate and commit API extractor report files after support-level and translation surface changes so API report checks pass in CI. Made-with: Cursor --- .../plugins/extensions-common/report.api.md | 4 +- .../plugins/extensions/report-alpha.api.md | 242 +++++++++--------- 2 files changed, 123 insertions(+), 123 deletions(-) diff --git a/workspaces/extensions/plugins/extensions-common/report.api.md b/workspaces/extensions/plugins/extensions-common/report.api.md index e20e7a88a7..e4b89fff59 100644 --- a/workspaces/extensions/plugins/extensions-common/report.api.md +++ b/workspaces/extensions/plugins/extensions-common/report.api.md @@ -440,10 +440,10 @@ export enum ExtensionsSupportLevel { // (undocumented) DEV_PREVIEW = "dev-preview", // (undocumented) - PRODUCTION = "production", - // (undocumented) NONE = "none", // (undocumented) + PRODUCTION = "production", + // (undocumented) TECH_PREVIEW = "tech-preview" } diff --git a/workspaces/extensions/plugins/extensions/report-alpha.api.md b/workspaces/extensions/plugins/extensions/report-alpha.api.md index 65977c4a81..e5c7a70620 100644 --- a/workspaces/extensions/plugins/extensions/report-alpha.api.md +++ b/workspaces/extensions/plugins/extensions/report-alpha.api.md @@ -9,17 +9,30 @@ import { TranslationResource } from '@backstage/core-plugin-api/alpha'; // @alpha export const extensionsTranslationRef: TranslationRef<"plugin.extensions", { +readonly "search.filter": string; +readonly "search.clear": string; +readonly "search.placeholder": string; +readonly "search.author": string; +readonly "search.clearFilter": string; +readonly "search.category": string; +readonly "search.supportType": string; +readonly "search.noResults": string; +readonly "search.filterBy": string; +readonly "search.clearFilters": string; +readonly "search.noResultsFound": string; +readonly error: string; +readonly "button.close": string; readonly "button.update": string; +readonly "button.restart": string; +readonly "button.disable": string; readonly "button.install": string; readonly "button.uninstall": string; readonly "button.enable": string; -readonly "button.disable": string; readonly "button.save": string; -readonly "button.close": string; readonly "button.viewAll": string; readonly "button.viewDocumentation": string; readonly "button.viewInstalledPlugins": string; -readonly "button.restart": string; +readonly loading: string; readonly "dialog.backendRestartRequired": string; readonly "dialog.packageRestartMessage": string; readonly "dialog.pluginRestartMessage": string; @@ -31,37 +44,26 @@ readonly "header.installedPackagesWithCount": string; readonly "header.pluginsPage": string; readonly "header.packagesPage": string; readonly "header.collectionsPage": string; -readonly "search.filter": string; -readonly "search.author": string; -readonly "search.placeholder": string; -readonly "search.clear": string; -readonly "search.clearFilter": string; -readonly "search.category": string; -readonly "search.supportType": string; -readonly "search.noResults": string; -readonly "search.filterBy": string; -readonly "search.clearFilters": string; -readonly "search.noResultsFound": string; -readonly "table.plugins": string; -readonly "table.packageName": string; -readonly "table.version": string; -readonly "table.role": string; readonly "table.name": string; -readonly "table.packages": string; +readonly "table.action": string; +readonly "table.role": string; readonly "table.description": string; readonly "table.status": string; -readonly "table.supportedVersion": string; -readonly "table.action": string; +readonly "table.version": string; +readonly "table.plugins": string; +readonly "table.packageName": string; readonly "table.versions": string; +readonly "table.packages": string; +readonly "table.supportedVersion": string; readonly "table.pluginsCount": string; readonly "table.packagesCount": string; readonly "table.pluginsTable": string; readonly "metadata.about": string; -readonly "metadata.highlights": string; -readonly "metadata.category": string; readonly "metadata.by": string; -readonly "metadata.comma": string; readonly "metadata.versions": string; +readonly "metadata.highlights": string; +readonly "metadata.comma": string; +readonly "metadata.category": string; readonly "metadata.pluginNotFound": string; readonly "metadata.pluginNotAvailable": string; readonly "metadata.ensureCatalogEntityPlugin": string; @@ -73,24 +75,102 @@ readonly "metadata.backstageCompatibility": string; readonly "role.backend": string; readonly "role.backendModule": string; readonly "role.frontend": string; +readonly "status.disabled": string; +readonly "status.installed": string; +readonly "status.notInstalled": string; +readonly "status.partiallyInstalled": string; +readonly "status.updateAvailable": string; +readonly "alert.productionDisabled": string; +readonly "alert.installationDisabled": string; +readonly "alert.missingDynamicArtifact": string; +readonly "alert.missingDynamicArtifactTitle": string; +readonly "alert.missingDynamicArtifactForPlugin": string; +readonly "alert.missingDynamicArtifactTitlePlugin": string; +readonly "alert.extensionsExample": string; +readonly "alert.singlePluginRestart": string; +readonly "alert.multiplePluginRestart": string; +readonly "alert.singlePackageRestart": string; +readonly "alert.multiplePackageRestart": string; +readonly "alert.restartRequired": string; +readonly "alert.backendRestartRequired": string; +readonly "alert.viewPlugins": string; +readonly "alert.viewPackages": string; +readonly "errors.missingConfigFile": string; +readonly "errors.missingConfigMessage": string; +readonly "errors.invalidConfigFile": string; +readonly "errors.invalidConfigMessage": string; +readonly "errors.fileNotExists": string; +readonly "errors.fileNotExistsMessage": string; +readonly "errors.unknownError": string; +readonly "common.close": string; +readonly "common.by": string; +readonly "common.links": string; +readonly "common.comma": string; +readonly "common.noDescriptionAvailable": string; +readonly "common.readMore": string; +readonly "common.apply": string; +readonly "common.couldNotApplyYaml": string; +readonly "actions.view": string; +readonly "actions.actions": string; +readonly "actions.edit": string; +readonly "actions.disable": string; +readonly "actions.install": string; +readonly "actions.enable": string; +readonly "actions.editConfiguration": string; +readonly "actions.pluginConfigurations": string; +readonly "actions.packageConfiguration": string; +readonly "actions.pluginCurrentlyEnabled": string; +readonly "actions.pluginCurrentlyDisabled": string; +readonly "actions.packageCurrentlyEnabled": string; +readonly "actions.packageCurrentlyDisabled": string; +readonly "actions.installTitle": string; +readonly "actions.editTitle": string; +readonly "package.name": string; +readonly "package.about": string; +readonly "package.version": string; +readonly "package.lifecycle": string; +readonly "package.author": string; +readonly "package.support": string; +readonly "package.supportedVersions": string; +readonly "package.highlights": string; +readonly "package.dynamicPluginPath": string; +readonly "package.backstageRole": string; +readonly "package.notFound": string; +readonly "package.notAvailable": string; +readonly "package.ensureCatalogEntity": string; +readonly "plugin.description": string; +readonly "plugin.version": string; +readonly "plugin.tags": string; +readonly "plugin.repository": string; +readonly "plugin.installation": string; +readonly "plugin.license": string; +readonly "plugin.author": string; +readonly "plugin.dependencies": string; +readonly "plugin.documentation": string; +readonly "plugin.configuration": string; +readonly "plugin.authors": string; +readonly "install.required": string; +readonly "install.optional": string; +readonly "install.error": string; +readonly "install.cancel": string; readonly "install.title": string; +readonly "install.reset": string; +readonly "install.success": string; +readonly "install.download": string; +readonly "install.errors.missingPluginsList": string; +readonly "install.errors.missingPackageItem": string; +readonly "install.errors.missingPackageField": string; +readonly "install.errors.failedToSave": string; +readonly "install.examples": string; readonly "install.configurationRequired": string; -readonly "install.optional": string; -readonly "install.required": string; readonly "install.selectPackages": string; readonly "install.allPackages": string; readonly "install.customConfiguration": string; readonly "install.installProgress": string; -readonly "install.success": string; -readonly "install.error": string; readonly "install.installFrontend": string; readonly "install.installBackend": string; readonly "install.installTemplates": string; readonly "install.installationInstructions": string; -readonly "install.download": string; -readonly "install.examples": string; -readonly "install.cancel": string; -readonly "install.reset": string; readonly "install.pluginTabs": string; readonly "install.settingUpPlugin": string; readonly "install.aboutPlugin": string; @@ -104,17 +184,13 @@ readonly "install.packageEnabled": string; readonly "install.packageDisabled": string; readonly "install.pluginEnabled": string; readonly "install.pluginDisabled": string; -readonly "install.errors.missingPluginsList": string; -readonly "install.errors.missingPackageItem": string; -readonly "install.errors.missingPackageField": string; -readonly "install.errors.failedToSave": string; -readonly "installedPackages.table.title": string; -readonly "installedPackages.table.searchPlaceholder": string; -readonly "installedPackages.table.columns.packageName": string; -readonly "installedPackages.table.columns.version": string; -readonly "installedPackages.table.columns.role": string; readonly "installedPackages.table.columns.name": string; +readonly "installedPackages.table.columns.role": string; +readonly "installedPackages.table.columns.version": string; readonly "installedPackages.table.columns.actions": string; +readonly "installedPackages.table.columns.packageName": string; +readonly "installedPackages.table.title": string; +readonly "installedPackages.table.searchPlaceholder": string; readonly "installedPackages.table.tooltips.installationDisabled": string; readonly "installedPackages.table.tooltips.packageProductionDisabled": string; readonly "installedPackages.table.tooltips.enableActions": string; @@ -127,77 +203,10 @@ readonly "installedPackages.table.tooltips.enablePackage": string; readonly "installedPackages.table.tooltips.disablePackage": string; readonly "installedPackages.table.emptyMessages.noResults": string; readonly "installedPackages.table.emptyMessages.noRecords": string; -readonly "status.notInstalled": string; -readonly "status.installed": string; -readonly "status.disabled": string; -readonly "status.partiallyInstalled": string; -readonly "status.updateAvailable": string; readonly "emptyState.noPluginsFound": string; readonly "emptyState.mustEnableBackend": string; readonly "emptyState.noPluginsDescription": string; readonly "emptyState.configureBackend": string; -readonly "alert.productionDisabled": string; -readonly "alert.installationDisabled": string; -readonly "alert.missingDynamicArtifact": string; -readonly "alert.missingDynamicArtifactTitle": string; -readonly "alert.missingDynamicArtifactForPlugin": string; -readonly "alert.missingDynamicArtifactTitlePlugin": string; -readonly "alert.extensionsExample": string; -readonly "alert.singlePluginRestart": string; -readonly "alert.multiplePluginRestart": string; -readonly "alert.singlePackageRestart": string; -readonly "alert.multiplePackageRestart": string; -readonly "alert.restartRequired": string; -readonly "alert.backendRestartRequired": string; -readonly "alert.viewPlugins": string; -readonly "alert.viewPackages": string; -readonly "common.close": string; -readonly "common.links": string; -readonly "common.by": string; -readonly "common.comma": string; -readonly "common.noDescriptionAvailable": string; -readonly "common.readMore": string; -readonly "common.apply": string; -readonly "common.couldNotApplyYaml": string; -readonly "plugin.version": string; -readonly "plugin.author": string; -readonly "plugin.installation": string; -readonly "plugin.configuration": string; -readonly "plugin.authors": string; -readonly "plugin.description": string; -readonly "plugin.documentation": string; -readonly "plugin.repository": string; -readonly "plugin.license": string; -readonly "plugin.tags": string; -readonly "plugin.dependencies": string; -readonly "package.version": string; -readonly "package.author": string; -readonly "package.support": string; -readonly "package.lifecycle": string; -readonly "package.supportedVersions": string; -readonly "package.about": string; -readonly "package.name": string; -readonly "package.highlights": string; -readonly "package.dynamicPluginPath": string; -readonly "package.backstageRole": string; -readonly "package.notFound": string; -readonly "package.notAvailable": string; -readonly "package.ensureCatalogEntity": string; -readonly "actions.view": string; -readonly "actions.install": string; -readonly "actions.enable": string; -readonly "actions.disable": string; -readonly "actions.actions": string; -readonly "actions.edit": string; -readonly "actions.editConfiguration": string; -readonly "actions.pluginConfigurations": string; -readonly "actions.packageConfiguration": string; -readonly "actions.pluginCurrentlyEnabled": string; -readonly "actions.pluginCurrentlyDisabled": string; -readonly "actions.packageCurrentlyEnabled": string; -readonly "actions.packageCurrentlyDisabled": string; -readonly "actions.installTitle": string; -readonly "actions.editTitle": string; readonly "tooltips.productionDisabled": string; readonly "tooltips.missingDynamicArtifact": string; readonly "tooltips.extensionsDisabled": string; @@ -205,22 +214,13 @@ readonly "tooltips.noPermissions": string; readonly "supportTypes.certifiedBy": string; readonly "supportTypes.verifiedBy": string; readonly "supportTypes.customPlugins": string; +readonly "collection.security": string; +readonly "collection.featured.title": string; +readonly "collection.featured.description": string; readonly "collection.kubernetes": string; readonly "collection.monitoring": string; -readonly "collection.security": string; readonly "collection.viewMore": string; readonly "collection.pluginCount": string; -readonly "collection.featured.title": string; -readonly "collection.featured.description": string; -readonly error: string; -readonly "errors.missingConfigFile": string; -readonly "errors.missingConfigMessage": string; -readonly "errors.invalidConfigFile": string; -readonly "errors.invalidConfigMessage": string; -readonly "errors.fileNotExists": string; -readonly "errors.fileNotExistsMessage": string; -readonly "errors.unknownError": string; -readonly loading: string; readonly retry: string; readonly "aria.filterBy": string; readonly "aria.openPlugin": string; @@ -228,10 +228,10 @@ readonly "aria.closeDialog": string; readonly "aria.expandSection": string; readonly "aria.collapseSection": string; readonly "aria.sortBy": string; +readonly "badges.verified": string; readonly "badges.certifiedBy": string; readonly "badges.verifiedBy": string; readonly "badges.certified": string; -readonly "badges.verified": string; readonly "badges.customPlugin": string; readonly "badges.stableAndSecured": string; readonly "badges.generallyAvailable": string; From 72ba122f57e362e25ed8c2566a6bd2261801c6eb Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Fri, 27 Feb 2026 17:54:09 +0100 Subject: [PATCH 7/9] fix(extensions): regenerate report-alpha.api.md from tsc:full output The report was generated by build:api-reports internal compilation which produces a different key ordering than tsc:full. CI runs tsc:full first, then build:api-reports:only --ci, so the committed report must match the tsc:full declaration output ordering. Made-with: Cursor --- .../plugins/extensions/report-alpha.api.md | 242 +++++++++--------- 1 file changed, 121 insertions(+), 121 deletions(-) diff --git a/workspaces/extensions/plugins/extensions/report-alpha.api.md b/workspaces/extensions/plugins/extensions/report-alpha.api.md index e5c7a70620..65977c4a81 100644 --- a/workspaces/extensions/plugins/extensions/report-alpha.api.md +++ b/workspaces/extensions/plugins/extensions/report-alpha.api.md @@ -9,30 +9,17 @@ import { TranslationResource } from '@backstage/core-plugin-api/alpha'; // @alpha export const extensionsTranslationRef: TranslationRef<"plugin.extensions", { -readonly "search.filter": string; -readonly "search.clear": string; -readonly "search.placeholder": string; -readonly "search.author": string; -readonly "search.clearFilter": string; -readonly "search.category": string; -readonly "search.supportType": string; -readonly "search.noResults": string; -readonly "search.filterBy": string; -readonly "search.clearFilters": string; -readonly "search.noResultsFound": string; -readonly error: string; -readonly "button.close": string; readonly "button.update": string; -readonly "button.restart": string; -readonly "button.disable": string; readonly "button.install": string; readonly "button.uninstall": string; readonly "button.enable": string; +readonly "button.disable": string; readonly "button.save": string; +readonly "button.close": string; readonly "button.viewAll": string; readonly "button.viewDocumentation": string; readonly "button.viewInstalledPlugins": string; -readonly loading: string; +readonly "button.restart": string; readonly "dialog.backendRestartRequired": string; readonly "dialog.packageRestartMessage": string; readonly "dialog.pluginRestartMessage": string; @@ -44,26 +31,37 @@ readonly "header.installedPackagesWithCount": string; readonly "header.pluginsPage": string; readonly "header.packagesPage": string; readonly "header.collectionsPage": string; -readonly "table.name": string; -readonly "table.action": string; -readonly "table.role": string; -readonly "table.description": string; -readonly "table.status": string; -readonly "table.version": string; +readonly "search.filter": string; +readonly "search.author": string; +readonly "search.placeholder": string; +readonly "search.clear": string; +readonly "search.clearFilter": string; +readonly "search.category": string; +readonly "search.supportType": string; +readonly "search.noResults": string; +readonly "search.filterBy": string; +readonly "search.clearFilters": string; +readonly "search.noResultsFound": string; readonly "table.plugins": string; readonly "table.packageName": string; -readonly "table.versions": string; +readonly "table.version": string; +readonly "table.role": string; +readonly "table.name": string; readonly "table.packages": string; +readonly "table.description": string; +readonly "table.status": string; readonly "table.supportedVersion": string; +readonly "table.action": string; +readonly "table.versions": string; readonly "table.pluginsCount": string; readonly "table.packagesCount": string; readonly "table.pluginsTable": string; readonly "metadata.about": string; -readonly "metadata.by": string; -readonly "metadata.versions": string; readonly "metadata.highlights": string; -readonly "metadata.comma": string; readonly "metadata.category": string; +readonly "metadata.by": string; +readonly "metadata.comma": string; +readonly "metadata.versions": string; readonly "metadata.pluginNotFound": string; readonly "metadata.pluginNotAvailable": string; readonly "metadata.ensureCatalogEntityPlugin": string; @@ -75,102 +73,24 @@ readonly "metadata.backstageCompatibility": string; readonly "role.backend": string; readonly "role.backendModule": string; readonly "role.frontend": string; -readonly "status.disabled": string; -readonly "status.installed": string; -readonly "status.notInstalled": string; -readonly "status.partiallyInstalled": string; -readonly "status.updateAvailable": string; -readonly "alert.productionDisabled": string; -readonly "alert.installationDisabled": string; -readonly "alert.missingDynamicArtifact": string; -readonly "alert.missingDynamicArtifactTitle": string; -readonly "alert.missingDynamicArtifactForPlugin": string; -readonly "alert.missingDynamicArtifactTitlePlugin": string; -readonly "alert.extensionsExample": string; -readonly "alert.singlePluginRestart": string; -readonly "alert.multiplePluginRestart": string; -readonly "alert.singlePackageRestart": string; -readonly "alert.multiplePackageRestart": string; -readonly "alert.restartRequired": string; -readonly "alert.backendRestartRequired": string; -readonly "alert.viewPlugins": string; -readonly "alert.viewPackages": string; -readonly "errors.missingConfigFile": string; -readonly "errors.missingConfigMessage": string; -readonly "errors.invalidConfigFile": string; -readonly "errors.invalidConfigMessage": string; -readonly "errors.fileNotExists": string; -readonly "errors.fileNotExistsMessage": string; -readonly "errors.unknownError": string; -readonly "common.close": string; -readonly "common.by": string; -readonly "common.links": string; -readonly "common.comma": string; -readonly "common.noDescriptionAvailable": string; -readonly "common.readMore": string; -readonly "common.apply": string; -readonly "common.couldNotApplyYaml": string; -readonly "actions.view": string; -readonly "actions.actions": string; -readonly "actions.edit": string; -readonly "actions.disable": string; -readonly "actions.install": string; -readonly "actions.enable": string; -readonly "actions.editConfiguration": string; -readonly "actions.pluginConfigurations": string; -readonly "actions.packageConfiguration": string; -readonly "actions.pluginCurrentlyEnabled": string; -readonly "actions.pluginCurrentlyDisabled": string; -readonly "actions.packageCurrentlyEnabled": string; -readonly "actions.packageCurrentlyDisabled": string; -readonly "actions.installTitle": string; -readonly "actions.editTitle": string; -readonly "package.name": string; -readonly "package.about": string; -readonly "package.version": string; -readonly "package.lifecycle": string; -readonly "package.author": string; -readonly "package.support": string; -readonly "package.supportedVersions": string; -readonly "package.highlights": string; -readonly "package.dynamicPluginPath": string; -readonly "package.backstageRole": string; -readonly "package.notFound": string; -readonly "package.notAvailable": string; -readonly "package.ensureCatalogEntity": string; -readonly "plugin.description": string; -readonly "plugin.version": string; -readonly "plugin.tags": string; -readonly "plugin.repository": string; -readonly "plugin.installation": string; -readonly "plugin.license": string; -readonly "plugin.author": string; -readonly "plugin.dependencies": string; -readonly "plugin.documentation": string; -readonly "plugin.configuration": string; -readonly "plugin.authors": string; -readonly "install.required": string; -readonly "install.optional": string; -readonly "install.error": string; -readonly "install.cancel": string; readonly "install.title": string; -readonly "install.reset": string; -readonly "install.success": string; -readonly "install.download": string; -readonly "install.errors.missingPluginsList": string; -readonly "install.errors.missingPackageItem": string; -readonly "install.errors.missingPackageField": string; -readonly "install.errors.failedToSave": string; -readonly "install.examples": string; readonly "install.configurationRequired": string; +readonly "install.optional": string; +readonly "install.required": string; readonly "install.selectPackages": string; readonly "install.allPackages": string; readonly "install.customConfiguration": string; readonly "install.installProgress": string; +readonly "install.success": string; +readonly "install.error": string; readonly "install.installFrontend": string; readonly "install.installBackend": string; readonly "install.installTemplates": string; readonly "install.installationInstructions": string; +readonly "install.download": string; +readonly "install.examples": string; +readonly "install.cancel": string; +readonly "install.reset": string; readonly "install.pluginTabs": string; readonly "install.settingUpPlugin": string; readonly "install.aboutPlugin": string; @@ -184,13 +104,17 @@ readonly "install.packageEnabled": string; readonly "install.packageDisabled": string; readonly "install.pluginEnabled": string; readonly "install.pluginDisabled": string; -readonly "installedPackages.table.columns.name": string; -readonly "installedPackages.table.columns.role": string; -readonly "installedPackages.table.columns.version": string; -readonly "installedPackages.table.columns.actions": string; -readonly "installedPackages.table.columns.packageName": string; +readonly "install.errors.missingPluginsList": string; +readonly "install.errors.missingPackageItem": string; +readonly "install.errors.missingPackageField": string; +readonly "install.errors.failedToSave": string; readonly "installedPackages.table.title": string; readonly "installedPackages.table.searchPlaceholder": string; +readonly "installedPackages.table.columns.packageName": string; +readonly "installedPackages.table.columns.version": string; +readonly "installedPackages.table.columns.role": string; +readonly "installedPackages.table.columns.name": string; +readonly "installedPackages.table.columns.actions": string; readonly "installedPackages.table.tooltips.installationDisabled": string; readonly "installedPackages.table.tooltips.packageProductionDisabled": string; readonly "installedPackages.table.tooltips.enableActions": string; @@ -203,10 +127,77 @@ readonly "installedPackages.table.tooltips.enablePackage": string; readonly "installedPackages.table.tooltips.disablePackage": string; readonly "installedPackages.table.emptyMessages.noResults": string; readonly "installedPackages.table.emptyMessages.noRecords": string; +readonly "status.notInstalled": string; +readonly "status.installed": string; +readonly "status.disabled": string; +readonly "status.partiallyInstalled": string; +readonly "status.updateAvailable": string; readonly "emptyState.noPluginsFound": string; readonly "emptyState.mustEnableBackend": string; readonly "emptyState.noPluginsDescription": string; readonly "emptyState.configureBackend": string; +readonly "alert.productionDisabled": string; +readonly "alert.installationDisabled": string; +readonly "alert.missingDynamicArtifact": string; +readonly "alert.missingDynamicArtifactTitle": string; +readonly "alert.missingDynamicArtifactForPlugin": string; +readonly "alert.missingDynamicArtifactTitlePlugin": string; +readonly "alert.extensionsExample": string; +readonly "alert.singlePluginRestart": string; +readonly "alert.multiplePluginRestart": string; +readonly "alert.singlePackageRestart": string; +readonly "alert.multiplePackageRestart": string; +readonly "alert.restartRequired": string; +readonly "alert.backendRestartRequired": string; +readonly "alert.viewPlugins": string; +readonly "alert.viewPackages": string; +readonly "common.close": string; +readonly "common.links": string; +readonly "common.by": string; +readonly "common.comma": string; +readonly "common.noDescriptionAvailable": string; +readonly "common.readMore": string; +readonly "common.apply": string; +readonly "common.couldNotApplyYaml": string; +readonly "plugin.version": string; +readonly "plugin.author": string; +readonly "plugin.installation": string; +readonly "plugin.configuration": string; +readonly "plugin.authors": string; +readonly "plugin.description": string; +readonly "plugin.documentation": string; +readonly "plugin.repository": string; +readonly "plugin.license": string; +readonly "plugin.tags": string; +readonly "plugin.dependencies": string; +readonly "package.version": string; +readonly "package.author": string; +readonly "package.support": string; +readonly "package.lifecycle": string; +readonly "package.supportedVersions": string; +readonly "package.about": string; +readonly "package.name": string; +readonly "package.highlights": string; +readonly "package.dynamicPluginPath": string; +readonly "package.backstageRole": string; +readonly "package.notFound": string; +readonly "package.notAvailable": string; +readonly "package.ensureCatalogEntity": string; +readonly "actions.view": string; +readonly "actions.install": string; +readonly "actions.enable": string; +readonly "actions.disable": string; +readonly "actions.actions": string; +readonly "actions.edit": string; +readonly "actions.editConfiguration": string; +readonly "actions.pluginConfigurations": string; +readonly "actions.packageConfiguration": string; +readonly "actions.pluginCurrentlyEnabled": string; +readonly "actions.pluginCurrentlyDisabled": string; +readonly "actions.packageCurrentlyEnabled": string; +readonly "actions.packageCurrentlyDisabled": string; +readonly "actions.installTitle": string; +readonly "actions.editTitle": string; readonly "tooltips.productionDisabled": string; readonly "tooltips.missingDynamicArtifact": string; readonly "tooltips.extensionsDisabled": string; @@ -214,13 +205,22 @@ readonly "tooltips.noPermissions": string; readonly "supportTypes.certifiedBy": string; readonly "supportTypes.verifiedBy": string; readonly "supportTypes.customPlugins": string; -readonly "collection.security": string; -readonly "collection.featured.title": string; -readonly "collection.featured.description": string; readonly "collection.kubernetes": string; readonly "collection.monitoring": string; +readonly "collection.security": string; readonly "collection.viewMore": string; readonly "collection.pluginCount": string; +readonly "collection.featured.title": string; +readonly "collection.featured.description": string; +readonly error: string; +readonly "errors.missingConfigFile": string; +readonly "errors.missingConfigMessage": string; +readonly "errors.invalidConfigFile": string; +readonly "errors.invalidConfigMessage": string; +readonly "errors.fileNotExists": string; +readonly "errors.fileNotExistsMessage": string; +readonly "errors.unknownError": string; +readonly loading: string; readonly retry: string; readonly "aria.filterBy": string; readonly "aria.openPlugin": string; @@ -228,10 +228,10 @@ readonly "aria.closeDialog": string; readonly "aria.expandSection": string; readonly "aria.collapseSection": string; readonly "aria.sortBy": string; -readonly "badges.verified": string; readonly "badges.certifiedBy": string; readonly "badges.verifiedBy": string; readonly "badges.certified": string; +readonly "badges.verified": string; readonly "badges.customPlugin": string; readonly "badges.stableAndSecured": string; readonly "badges.generallyAvailable": string; From 01956dfb356915d90cadbb5af8d2cfd8b4a087a8 Mon Sep 17 00:00:00 2001 From: Martin Polasko Date: Mon, 2 Mar 2026 14:57:30 +0100 Subject: [PATCH 8/9] chore(changeset): mark extensions-common support-level update as major Record the production terminology migration as a breaking change for extensions-common and document migration guidance for generally-available metadata. Made-with: Cursor --- workspaces/extensions/.changeset/few-bugs-teach.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workspaces/extensions/.changeset/few-bugs-teach.md b/workspaces/extensions/.changeset/few-bugs-teach.md index f465ebf273..a3d56b0df7 100644 --- a/workspaces/extensions/.changeset/few-bugs-teach.md +++ b/workspaces/extensions/.changeset/few-bugs-teach.md @@ -1,5 +1,7 @@ --- -'@red-hat-developer-hub/backstage-plugin-extensions-common': patch +'@red-hat-developer-hub/backstage-plugin-extensions-common': major --- Normalize support-level terminology from `generally-available` to `production` in extensions schemas, shared support-level types, and related examples/docs. + +**BREAKING**: Plugin metadata using `spec.support.level: generally-available` is no longer treated as GA by the extensions UI badge/filter logic. Migrate custom plugin metadata to `spec.support.level: production` to keep the same behavior. From 5bcb2f987ac2db6305c7d04fb76f809a21ec4bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pola=C5=A1ko?= <50864147+polasudo@users.noreply.github.com> Date: Mon, 2 Mar 2026 16:13:49 +0100 Subject: [PATCH 9/9] Normalize support-level terminology in extensions Change support-level terminology from 'generally-available' to 'production' in various schemas and documentation. --- workspaces/extensions/.changeset/few-bugs-teach.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/extensions/.changeset/few-bugs-teach.md b/workspaces/extensions/.changeset/few-bugs-teach.md index a3d56b0df7..b4075a223c 100644 --- a/workspaces/extensions/.changeset/few-bugs-teach.md +++ b/workspaces/extensions/.changeset/few-bugs-teach.md @@ -1,5 +1,5 @@ --- -'@red-hat-developer-hub/backstage-plugin-extensions-common': major +'@red-hat-developer-hub/backstage-plugin-extensions-common': minor --- Normalize support-level terminology from `generally-available` to `production` in extensions schemas, shared support-level types, and related examples/docs.