diff --git a/workspaces/boost/.changeset/ai-catalog-rename.md b/workspaces/boost/.changeset/ai-catalog-rename.md new file mode 100644 index 00000000000..e72ba74567c --- /dev/null +++ b/workspaces/boost/.changeset/ai-catalog-rename.md @@ -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. diff --git a/workspaces/boost/.changeset/config.json b/workspaces/boost/.changeset/config.json index 8208df00f28..e7a51dfcbda 100644 --- a/workspaces/boost/.changeset/config.json +++ b/workspaces/boost/.changeset/config.json @@ -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", diff --git a/workspaces/boost/AGENTS.md b/workspaces/boost/AGENTS.md index fd2f829629c..8da3c9e9d2a 100644 --- a/workspaces/boost/AGENTS.md +++ b/workspaces/boost/AGENTS.md @@ -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 @@ -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'); ``` diff --git a/workspaces/boost/README.md b/workspaces/boost/README.md index 04c4a68ceca..76599945cb9 100644 --- a/workspaces/boost/README.md +++ b/workspaces/boost/README.md @@ -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 diff --git a/workspaces/boost/app-config.yaml b/workspaces/boost/app-config.yaml index 9bf94ba63ee..f3695c98ea2 100644 --- a/workspaces/boost/app-config.yaml +++ b/workspaces/boost/app-config.yaml @@ -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 @@ -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} @@ -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} diff --git a/workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts b/workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts index 7c45d5533f4..8e90266510f 100644 --- a/workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts +++ b/workspaces/boost/e2e-tests/boost.AiCatalogPage.test.ts @@ -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) => { diff --git a/workspaces/boost/e2e-tests/boost.translations.test.ts b/workspaces/boost/e2e-tests/boost.translations.test.ts index a36cd0fe41d..e702cd4e125 100644 --- a/workspaces/boost/e2e-tests/boost.translations.test.ts +++ b/workspaces/boost/e2e-tests/boost.translations.test.ts @@ -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 = { en: 'English', @@ -102,7 +102,7 @@ async function signInAndSwitchLocale( } } -test.describe('Boost AI Catalog translations', () => { +test.describe('AI Catalog translations', () => { test('renders representative strings in the configured locale', async ({ page, }) => { @@ -110,7 +110,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, [skillEntity]); await signInAndSwitchLocale(page, currentLocale); @@ -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); diff --git a/workspaces/boost/e2e-tests/utils/translations.ts b/workspaces/boost/e2e-tests/utils/translations.ts index 6c378bea045..d7bdec6e502 100644 --- a/workspaces/boost/e2e-tests/utils/translations.ts +++ b/workspaces/boost/e2e-tests/utils/translations.ts @@ -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; for (const key of Object.keys(flatMessages)) { @@ -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; } } diff --git a/workspaces/boost/examples/app-config.connectors.yaml b/workspaces/boost/examples/app-config.connectors.yaml index eb7b435a211..a8a29066ca6 100644 --- a/workspaces/boost/examples/app-config.connectors.yaml +++ b/workspaces/boost/examples/app-config.connectors.yaml @@ -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. @@ -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) diff --git a/workspaces/boost/openspec/specs/ai-catalog-browse-view/spec.md b/workspaces/boost/openspec/specs/ai-catalog-browse-view/spec.md index fe96069357b..ec97bd226e5 100644 --- a/workspaces/boost/openspec/specs/ai-catalog-browse-view/spec.md +++ b/workspaces/boost/openspec/specs/ai-catalog-browse-view/spec.md @@ -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 diff --git a/workspaces/boost/openspec/specs/ai-catalog-dynamic-plugin/spec.md b/workspaces/boost/openspec/specs/ai-catalog-dynamic-plugin/spec.md index 545b4f98606..10cd5d2eeea 100644 --- a/workspaces/boost/openspec/specs/ai-catalog-dynamic-plugin/spec.md +++ b/workspaces/boost/openspec/specs/ai-catalog-dynamic-plugin/spec.md @@ -2,12 +2,12 @@ > **Status: Implemented** — Current RHDH 2.1 release source of truth. > -> **Scope:** Dynamic-plugin packaging for `plugins/boost` through the RHDH +> **Scope:** Dynamic-plugin packaging for `plugins/ai-catalog` through the RHDH > overlay export pipeline. ## Purpose -This specification describes how the shipped `plugins/boost` frontend is +This specification describes how the shipped `plugins/ai-catalog` frontend is registered and exported as an RHDH dynamic plugin through the overlay CI pipeline. @@ -25,7 +25,7 @@ tooling. #### Scenario: Package has no local dynamic-export output -- **GIVEN** `plugins/boost/package.json` +- **GIVEN** `plugins/ai-catalog/package.json` - **THEN** its scripts do not define `export-dynamic` - **AND** its published `files` do not include `dist-dynamic/` @@ -36,25 +36,25 @@ The OCI-packaged plugin MUST load correctly in an RHDH deployment. #### Scenario: Plugin loads with Module Federation - **GIVEN** an RHDH deployment with `ENABLE_STANDARD_MODULE_FEDERATION=true` -- **AND** the boost frontend dynamic plugin is installed via `dynamic-plugins.yaml` with `enabled: true` +- **AND** the AI Catalog frontend dynamic plugin is installed via `dynamic-plugins.yaml` with `enabled: true` - **WHEN** a user navigates to the RHDH instance - **THEN** the "AI Catalog" nav item appears in the sidebar - **AND** navigating to `/ai-catalog` renders the browse page #### Scenario: Entity page extensions mount -- **GIVEN** the boost frontend dynamic plugin is installed +- **GIVEN** the AI Catalog frontend dynamic plugin is installed - **WHEN** a user navigates to a catalog entity page for an AI asset - **THEN** the AI asset details, agent instructions, and Usage cards render when their required entity data exists -- **AND** they use the `entity-card:boost/ai-asset-details`, - `entity-card:boost/agent-instructions`, and `entity-card:boost/usage` +- **AND** they use the `entity-card:ai-catalog/ai-asset-details`, + `entity-card:ai-catalog/agent-instructions`, and `entity-card:ai-catalog/usage` extension IDs #### Scenario: Extensions absent on non-AI entities -- **GIVEN** the boost frontend dynamic plugin is installed +- **GIVEN** the AI Catalog frontend dynamic plugin is installed - **WHEN** a user navigates to a catalog entity page for a non-AI entity (e.g., a regular Component) -- **THEN** no boost entity cards are rendered +- **THEN** no AI Catalog entity cards are rendered ### Requirement: Adopter Overrides @@ -62,20 +62,20 @@ Deployers MUST be able to customize the plugin via `app.extensions` in `app-conf #### Scenario: Disable an entity card -- **GIVEN** the deployer sets `entity-card:boost/ai-asset-details: false` in `app.extensions` +- **GIVEN** the deployer sets `entity-card:ai-catalog/ai-asset-details: false` in `app.extensions` - **WHEN** a user views an AI asset entity page - **THEN** the AI asset details card is not rendered -- **AND** other boost cards still render +- **AND** other AI Catalog cards still render #### Scenario: Change entity filter on a card -- **GIVEN** the deployer sets `entity-card:boost/ai-asset-details` with a `config.filter` that excludes AI asset kinds +- **GIVEN** the deployer sets `entity-card:ai-catalog/ai-asset-details` with a `config.filter` that excludes AI asset kinds - **WHEN** a user views an AiResource entity page - **THEN** the AI asset details card is not rendered (filter excludes AiResource) #### Scenario: Disable the page -- **GIVEN** the deployer sets `page:boost/ai-catalog: false` in `app.extensions` +- **GIVEN** the deployer sets `page:ai-catalog/ai-catalog: false` in `app.extensions` - **WHEN** a user views the RHDH sidebar - **THEN** the "AI Catalog" nav item is not present - **AND** navigating to `/ai-catalog` shows a 404 or redirects diff --git a/workspaces/boost/openspec/specs/ai-catalog-entity-extensions/spec.md b/workspaces/boost/openspec/specs/ai-catalog-entity-extensions/spec.md index 76c4569c513..7f83d1bde48 100644 --- a/workspaces/boost/openspec/specs/ai-catalog-entity-extensions/spec.md +++ b/workspaces/boost/openspec/specs/ai-catalog-entity-extensions/spec.md @@ -2,7 +2,7 @@ > **Status: Implemented** — Current RHDH 2.1 release source of truth. > -> **Scope:** `plugins/boost` entity-page cards for AI catalog assets. Catalog +> **Scope:** `plugins/ai-catalog` entity-page cards for AI catalog assets. Catalog > entity visibility remains a Catalog/RHDH concern; this spec covers frontend > presentation only. @@ -31,7 +31,7 @@ It MUST omit itself when there is no supported content. - **WHEN** an AI asset has a description, rationale, version, or supported type-specific metadata -- **THEN** `entity-card:boost/ai-asset-details` renders the available fields +- **THEN** `entity-card:ai-catalog/ai-asset-details` renders the available fields #### Scenario: Description-only asset @@ -81,7 +81,7 @@ MUST render the instruction content as Markdown. #### Scenario: Agent instructions exist - **WHEN** an agent has non-empty instructions -- **THEN** `entity-card:boost/agent-instructions` renders the instructions +- **THEN** `entity-card:ai-catalog/agent-instructions` renders the instructions using Markdown content #### Scenario: Agent instructions are absent @@ -98,7 +98,7 @@ derived from the entity. It MUST NOT call a Boost backend. - **WHEN** the entity has a supported skill command, OCI pull command, model server endpoint, MCP endpoint, Git archive, or Git source location -- **THEN** `entity-card:boost/usage` exposes the corresponding copy or link +- **THEN** `entity-card:ai-catalog/usage` exposes the corresponding copy or link action #### Scenario: Git subpath source @@ -135,4 +135,4 @@ through the host application's normal entity-page extensions. - **WHEN** a user views an AI asset with TechDocs configured - **THEN** the host application's standard TechDocs experience remains available -- **AND** the Boost plugin does not add a separate Usage tab for it +- **AND** the AI Catalog plugin does not add a separate Usage tab for it diff --git a/workspaces/boost/openspec/specs/ai-catalog-filter-customization/spec.md b/workspaces/boost/openspec/specs/ai-catalog-filter-customization/spec.md index cecefebcd9d..64ede8bc747 100644 --- a/workspaces/boost/openspec/specs/ai-catalog-filter-customization/spec.md +++ b/workspaces/boost/openspec/specs/ai-catalog-filter-customization/spec.md @@ -2,7 +2,7 @@ > **Status: Implemented** — Current RHDH 2.1 release source of truth. > -> **Scope:** The `plugins/boost` filter extension contract and built-in AI +> **Scope:** The `plugins/ai-catalog` filter extension contract and built-in AI > Catalog filters. ## Purpose @@ -32,7 +32,7 @@ A `FilterDefinition` interface MUST define the contract, and a Blueprint MUST wr - **GIVEN** a filter created via `AiCatalogFilterBlueprint.make` - **THEN** it outputs a `FilterDefinition` via a single extension data ref - **AND** the extension kind is `ai-catalog-filter` -- **AND** the extension attaches to `page:boost/ai-catalog` input `filters` +- **AND** the extension attaches to `page:ai-catalog/ai-catalog` input `filters` - **AND** the Blueprint has no `config` schema (no deployer YAML config per filter) #### Scenario: CatalogFilters renders generic Select for each filter @@ -65,7 +65,7 @@ Deployers MUST be able to disable any built-in filter using NFS extension disabl #### Scenario: Disable a single filter -- **GIVEN** the deployer sets `ai-catalog-filter:boost/owner: false` in `app.extensions` +- **GIVEN** the deployer sets `ai-catalog-filter:ai-catalog/owner: false` in `app.extensions` - **WHEN** the developer navigates to `/ai-catalog` - **THEN** the owner filter is not rendered in the sidebar - **AND** the `owner` URL param has no effect on filtering @@ -73,7 +73,7 @@ Deployers MUST be able to disable any built-in filter using NFS extension disabl #### Scenario: Disable multiple filters -- **GIVEN** the deployer disables both `ai-catalog-filter:boost/tags` and `ai-catalog-filter:boost/owner` +- **GIVEN** the deployer disables both `ai-catalog-filter:ai-catalog/tags` and `ai-catalog-filter:ai-catalog/owner` - **WHEN** the developer navigates to `/ai-catalog` - **THEN** neither filter appears in the sidebar - **AND** the category and provider filters render normally @@ -92,7 +92,7 @@ Third-party plugins MUST be able to contribute new filters by providing a `Filte #### Scenario: Third-party filter appears in sidebar -- **GIVEN** a third-party plugin registers a filter via `createFrontendModule({ pluginId: 'boost' })` using `AiCatalogFilterBlueprint.make` +- **GIVEN** a third-party plugin registers a filter via `createFrontendModule({ pluginId: 'ai-catalog' })` using `AiCatalogFilterBlueprint.make` - **AND** the filter provides a `FilterDefinition` with `urlParam: 'team'`, `getOptions`, and `matchEntity` - **WHEN** the developer navigates to `/ai-catalog` - **THEN** the custom "team" filter appears as a `