Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions workspaces/boost/.changeset/ai-catalog-rename.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
'@red-hat-developer-hub/backstage-plugin-ai-catalog': minor
'@red-hat-developer-hub/backstage-plugin-ai-catalog-common': minor
'@red-hat-developer-hub/backstage-plugin-ai-catalog-connector-utils': minor
'@red-hat-developer-hub/backstage-plugin-ai-catalog-entity-provider-sdk': minor
'@red-hat-developer-hub/backstage-plugin-ogx-entity-provider': minor
'@red-hat-developer-hub/backstage-plugin-boost-backend': patch
'@red-hat-developer-hub/backstage-plugin-boost-backend-module-kagenti': patch
'@red-hat-developer-hub/backstage-plugin-boost-backend-module-ogx': patch
'@red-hat-developer-hub/backstage-plugin-boost-node': patch
'@red-hat-developer-hub/backstage-plugin-boost-responses-api-toolkit': patch
'@red-hat-developer-hub/backstage-plugin-boost-migration-readiness': patch
'@red-hat-developer-hub/backstage-plugin-boost-toolscope': patch
---

Rename the first-release AI Catalog package family and update consumers to the new public package identities.

Move standalone OGX configuration to `ai-catalog.entityProviders.ogx`; the old
Boost configuration paths are no longer read by this module. Update frontend
extension IDs to the `ai-catalog` namespace and translation overrides to
`plugin.ai-catalog`. See the workspace README's consumer migration instructions.
10 changes: 9 additions & 1 deletion workspaces/boost/.changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@
"$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"fixed": [
[
"@red-hat-developer-hub/backstage-plugin-ai-catalog",
"@red-hat-developer-hub/backstage-plugin-ai-catalog-common",
"@red-hat-developer-hub/backstage-plugin-ai-catalog-connector-utils",
"@red-hat-developer-hub/backstage-plugin-ai-catalog-entity-provider-sdk",
"@red-hat-developer-hub/backstage-plugin-ogx-entity-provider"
]
],
"linked": [],
"access": "public",
"baseBranch": "main",
Expand Down
29 changes: 15 additions & 14 deletions workspaces/boost/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,18 +197,19 @@ Connector schema migrations (`migrateConnectorSchemas` in

### Package structure

| Package | Purpose |
| ------------------------------ | --------------------------------------------------------------------------------------------- |
| `boost` | Chat UI, agent gallery, admin panels, composable routable extensions |
| `boost-common` | Shared types, permissions (browser-safe, `common-library` role) |
| `boost-node` | `boostAiProviderServiceRef`, extension points (`node-library` role) |
| `boost-connector-utils` | Shared connector utils (`node-library` role) — CA bundle, fault isolation, startup validation |
| `boost-backend` | Core routes, services, middleware, ProviderManager |
| `boost-backend-module-ogx` | OGX provider module |
| `boost-backend-module-kagenti` | Kagenti provider module |
| `ogx-entity-provider` | Independently deployable catalog entity provider |
| `kagenti-entity-provider` | Independently deployable catalog entity provider |
| `boost-migration-readiness` | Migration-readiness CLI tool (`node-library` role with custom CLI build) |
| Package | Purpose |
| -------------------------------- | --------------------------------------------------------------------------------------------- |
| `ai-catalog` | AI Catalog browse UI and composable routable extensions |
| `ai-catalog-common` | Shared types, permissions (browser-safe, `common-library` role) |
| `boost-node` | `boostAiProviderServiceRef`, extension points (`node-library` role) |
| `ai-catalog-connector-utils` | Shared connector utils (`node-library` role) — CA bundle, fault isolation, startup validation |
| `boost-backend` | Core routes, services, middleware, ProviderManager |
| `boost-backend-module-ogx` | OGX provider module |
| `boost-backend-module-kagenti` | Kagenti provider module |
| `ai-catalog-entity-provider-sdk` | Shared entity-provider SDK (`node-library` role) — annotations, validation, and sync adapters |
| `ogx-entity-provider` | Independently deployable catalog entity provider |
| `kagenti-entity-provider` | Independently deployable catalog entity provider |
| `boost-migration-readiness` | Migration-readiness CLI tool (`node-library` role with custom CLI build) |

### CLI binary packages

Expand Down Expand Up @@ -287,10 +288,10 @@ value is an empty string (e.g., from env var substitution like
`${UNSET_ENV_VAR:-}`), rather than returning `undefined`. When reading
config values that may come from environment variable substitution, use
`safeGetOptionalString` from
`@red-hat-developer-hub/backstage-plugin-boost-connector-utils`:
`@red-hat-developer-hub/backstage-plugin-ai-catalog-connector-utils`:

```ts
import { safeGetOptionalString } from '@red-hat-developer-hub/backstage-plugin-boost-connector-utils';
import { safeGetOptionalString } from '@red-hat-developer-hub/backstage-plugin-ai-catalog-connector-utils';

const endpoint = safeGetOptionalString(config, 'endpoint');
```
Expand Down
53 changes: 41 additions & 12 deletions workspaces/boost/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,47 @@ planning unless [`CURRENT.md`](specifications/CURRENT.md) says otherwise.

## Plugins

| Plugin | Package | Description |
| ---------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| boost | `@red-hat-developer-hub/backstage-plugin-boost` | Frontend plugin — AI Catalog browse page and entity extensions |
| boost-backend | `@red-hat-developer-hub/backstage-plugin-boost-backend` | Backend plugin — chat, agent lifecycle, MCP, admin APIs |
| boost-common | `@red-hat-developer-hub/backstage-plugin-boost-common` | Shared types and permissions |
| boost-node | `@red-hat-developer-hub/backstage-plugin-boost-node` | Node library — service refs and extension points |
| boost-connector-utils | `@red-hat-developer-hub/backstage-plugin-boost-connector-utils` | Shared CA/fault-isolation/startup helpers for AI catalog connectors |
| boost-backend-module-ogx | `@red-hat-developer-hub/backstage-plugin-boost-backend-module-ogx` | OGX provider module |
| boost-backend-module-kagenti | `@red-hat-developer-hub/backstage-plugin-boost-backend-module-kagenti` | Kagenti provider module |
| ogx-entity-provider | `@red-hat-developer-hub/backstage-plugin-ogx-entity-provider` | OGX catalog entity provider |
| kagenti-entity-provider | `@red-hat-developer-hub/backstage-plugin-kagenti-entity-provider` | Kagenti catalog entity provider |
| boost-migration-readiness | `@red-hat-developer-hub/backstage-plugin-boost-migration-readiness` | Read-only CLI assessing AI asset entities against upstream Backstage kinds |
| Plugin | Package | Description |
| ------------------------------ | ------------------------------------------------------------------------ | -------------------------------------------------------------------------- |
| ai-catalog | `@red-hat-developer-hub/backstage-plugin-ai-catalog` | Frontend plugin — AI Catalog browse page and entity extensions |
| boost-backend | `@red-hat-developer-hub/backstage-plugin-boost-backend` | Backend plugin — chat, agent lifecycle, MCP, admin APIs |
| ai-catalog-common | `@red-hat-developer-hub/backstage-plugin-ai-catalog-common` | Shared types and permissions |
| boost-node | `@red-hat-developer-hub/backstage-plugin-boost-node` | Node library — service refs and extension points |
| ai-catalog-connector-utils | `@red-hat-developer-hub/backstage-plugin-ai-catalog-connector-utils` | Shared CA/fault-isolation/startup helpers for AI Catalog connectors |
| ai-catalog-entity-provider-sdk | `@red-hat-developer-hub/backstage-plugin-ai-catalog-entity-provider-sdk` | SDK for AI Catalog entity providers |
| boost-backend-module-ogx | `@red-hat-developer-hub/backstage-plugin-boost-backend-module-ogx` | OGX provider module |
| boost-backend-module-kagenti | `@red-hat-developer-hub/backstage-plugin-boost-backend-module-kagenti` | Kagenti provider module |
| ogx-entity-provider | `@red-hat-developer-hub/backstage-plugin-ogx-entity-provider` | OGX catalog entity provider |
| kagenti-entity-provider | `@red-hat-developer-hub/backstage-plugin-kagenti-entity-provider` | Kagenti catalog entity provider |
| boost-migration-readiness | `@red-hat-developer-hub/backstage-plugin-boost-migration-readiness` | Read-only CLI assessing AI asset entities against upstream Backstage kinds |

## Consumer migration

For the first release, install `@red-hat-developer-hub/backstage-plugin-ai-catalog`
and `@red-hat-developer-hub/backstage-plugin-ogx-entity-provider`; the common,
connector-utils, and entity-provider-sdk packages are supporting dependencies.
Update frontend imports and the dynamic-plugin export path from `boost` to
`ai-catalog`, and configure the standalone OGX provider under
`ai-catalog.entityProviders.ogx`. The old package names and standalone Boost
configuration paths are not compatibility aliases. Deferred Boost backend
contracts such as `/api/boost`, `boost.providers.ogx`, and `BOOST_*` environment
variables remain unchanged.

Update configured frontend extension IDs from `page:boost/ai-catalog` to
`page:ai-catalog/ai-catalog`, and replace the `boost` namespace in
`ai-catalog-filter:boost/{category,owner,provider,tags}` and
`entity-card:boost/{ai-asset-details,agent-instructions,usage}` with `ai-catalog`.
The route remains `/ai-catalog`; existing catalog entities need no migration.
Import `aiCatalogTranslationRef`, `aiCatalogTranslations`, and
`aiCatalogTranslationsModule` instead of their `boost`-prefixed exports.
The `./translations` entry point still exports the translation module as its
default, and translation overrides now target `plugin.ai-catalog`.
Custom CSS overrides must use `--ai-catalog-*` instead of `--boost-*`.

For standalone OGX, move the endpoint, credentials, TLS, agents, and refresh
settings together to `ai-catalog.entityProviders.ogx`. A configured block requires
`baseUrl`; an absent block retains the localhost default. The old paths are
ignored, including when old and new values coexist.

## Compatibility

Expand Down
16 changes: 8 additions & 8 deletions workspaces/boost/app-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ app:
defaultLanguage: en
availableLanguages: [en, de, es, fr, it, ja]
# Example: disable a built-in filter
# - ai-catalog-filter:boost/owner: false
# - ai-catalog-filter:ai-catalog/owner: false

organization:
name: Red Hat
Expand Down Expand Up @@ -77,13 +77,7 @@ catalog:
User,
]

boost:
security:
mode: 'development-only-no-auth'
adminUsers:
- 'user:default/admin'
- 'user:default/guest'

ai-catalog:
entityProviders:
ogx:
baseUrl: ${BOOST_OGX_URL:-http://localhost:8321}
Expand Down Expand Up @@ -228,6 +222,12 @@ boost:
lifecycleStage: published
createdBy: user:default/admin

boost:
security:
mode: 'development-only-no-auth'
adminUsers:
- 'user:default/admin'
- 'user:default/guest'
providers:
ogx:
baseUrl: ${BOOST_OGX_URL:-http://localhost:8321}
Expand Down
2 changes: 1 addition & 1 deletion workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ async function loadTwoAssetCatalog(page: Page) {
await expect(catalogCount(page, 2)).toBeVisible();
}

test.describe('Boost AI Catalog', () => {
test.describe('AI Catalog', () => {
test('renders the AI Catalog heading after guest sign-in', async ({
page,
}, testInfo) => {
Expand Down
8 changes: 4 additions & 4 deletions workspaces/boost/e2e-tests/boost.translations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import { expect, test, type Page, type Route } from '@playwright/test';

import { runAccessibilityTests } from './utils/accessibility';
import { getTranslations, type BoostMessages } from './utils/translations';
import { getTranslations, type AiCatalogMessages } from './utils/translations';

const LOCALE_DISPLAY_NAMES: Record<string, string> = {
en: 'English',
Expand Down Expand Up @@ -102,15 +102,15 @@ async function signInAndSwitchLocale(
}
}

test.describe('Boost AI Catalog translations', () => {
test.describe('AI Catalog translations', () => {
test('renders representative strings in the configured locale', async ({
page,
}) => {
const currentLocale = await page.evaluate(
() => globalThis.navigator.language,
);
const baseLocale = currentLocale.split('-')[0];
const translations: BoostMessages = getTranslations(baseLocale);
const translations: AiCatalogMessages = getTranslations(baseLocale);

await mockCatalogEntities(page, [skillEntity]);
await signInAndSwitchLocale(page, currentLocale);
Expand Down Expand Up @@ -141,7 +141,7 @@ test.describe('Boost AI Catalog translations', () => {
() => globalThis.navigator.language,
);
const baseLocale = currentLocale.split('-')[0];
const translations: BoostMessages = getTranslations(baseLocale);
const translations: AiCatalogMessages = getTranslations(baseLocale);

await mockCatalogEntities(page, []);
await signInAndSwitchLocale(page, currentLocale);
Expand Down
34 changes: 17 additions & 17 deletions workspaces/boost/e2e-tests/utils/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,18 @@

// These translation files are not exported by the package, so relative imports are necessary for e2e tests
/* eslint-disable @backstage/no-relative-monorepo-imports */
import { boostMessages } from '../../plugins/boost/src/translations/ref.js';
import boostTranslationDe from '../../plugins/boost/src/translations/de.js';
import boostTranslationEs from '../../plugins/boost/src/translations/es.js';
import boostTranslationFr from '../../plugins/boost/src/translations/fr.js';
import boostTranslationIt from '../../plugins/boost/src/translations/it.js';
import boostTranslationJa from '../../plugins/boost/src/translations/ja.js';
import { aiCatalogMessages } from '../../plugins/ai-catalog/src/translations/ref.js';
import aiCatalogTranslationDe from '../../plugins/ai-catalog/src/translations/de.js';
import aiCatalogTranslationEs from '../../plugins/ai-catalog/src/translations/es.js';
import aiCatalogTranslationFr from '../../plugins/ai-catalog/src/translations/fr.js';
import aiCatalogTranslationIt from '../../plugins/ai-catalog/src/translations/it.js';
import aiCatalogTranslationJa from '../../plugins/ai-catalog/src/translations/ja.js';
/* eslint-enable @backstage/no-relative-monorepo-imports */

export type BoostMessages = typeof boostMessages;
export type AiCatalogMessages = typeof aiCatalogMessages;

function transformFlatMessagesIntoTree(
flatMessages: typeof boostTranslationDe.messages,
flatMessages: typeof aiCatalogTranslationDe.messages,
) {
const messages = {} as Record<string, any>;
for (const key of Object.keys(flatMessages)) {
Expand All @@ -40,24 +40,24 @@ function transformFlatMessagesIntoTree(
current[path[path.length - 1]] =
flatMessages[key as keyof typeof flatMessages];
}
return messages as BoostMessages;
return messages as AiCatalogMessages;
}

export function getTranslations(locale: string): BoostMessages {
export function getTranslations(locale: string): AiCatalogMessages {
switch (locale) {
case 'en':
return boostMessages;
return aiCatalogMessages;
case 'de':
return transformFlatMessagesIntoTree(boostTranslationDe.messages);
return transformFlatMessagesIntoTree(aiCatalogTranslationDe.messages);
case 'es':
return transformFlatMessagesIntoTree(boostTranslationEs.messages);
return transformFlatMessagesIntoTree(aiCatalogTranslationEs.messages);
case 'fr':
return transformFlatMessagesIntoTree(boostTranslationFr.messages);
return transformFlatMessagesIntoTree(aiCatalogTranslationFr.messages);
case 'it':
return transformFlatMessagesIntoTree(boostTranslationIt.messages);
return transformFlatMessagesIntoTree(aiCatalogTranslationIt.messages);
case 'ja':
return transformFlatMessagesIntoTree(boostTranslationJa.messages);
return transformFlatMessagesIntoTree(aiCatalogTranslationJa.messages);
default:
return boostMessages;
return aiCatalogMessages;
}
}
4 changes: 2 additions & 2 deletions workspaces/boost/examples/app-config.connectors.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Reference App-Config for AI Catalog Connectors
#
# This file demonstrates the configurable fields for Boost AI catalog
# This file demonstrates the configurable fields for AI Catalog
# connectors under ai-catalog.providers (RHOAI MCP Catalog, OCI Skill
# Registry). Copy the relevant sections into your app-config.yaml and
# adjust values for your deployment environment.
Expand All @@ -12,7 +12,7 @@
# Each connector reads its own Config subtree — shared utilities do not
# hard-code config paths.
#
# See also: workspaces/boost/plugins/boost-connector-utils/README.md
# See also: workspaces/boost/plugins/ai-catalog-connector-utils/README.md

# --------------------------------------------------------------------------
# Internet-Connected Deployment (default)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

> **Status: Implemented** — Current RHDH 2.1 release source of truth.
>
> **Scope:** `plugins/boost` AI Catalog browse page. This spec describes
> **Scope:** `plugins/ai-catalog` AI Catalog browse page. This spec describes
> shipped frontend behavior, not backend ingestion or authorization.

## Purpose

This specification describes the shipped AI Catalog browse page in
`plugins/boost`, including entity discovery, card/table presentation, search,
`plugins/ai-catalog`, including entity discovery, card/table presentation, search,
filtering, pagination, and its loading, empty, and error states.

## Requirements
Expand Down
Loading
Loading