Purpose
Analyze an existing Backstage frontend plugin and generate the RHDH dynamic plugin wiring configuration. This skill inspects the plugin's source files to determine exports and generates the corresponding app-config.yaml configuration.
When to Use
Use this skill when:
- User has an existing Backstage frontend plugin
- User wants to deploy it to RHDH as a dynamic plugin
- User needs the wiring configuration for
dynamic-plugins.yaml
Prerequisites
The plugin directory must contain:
package.jsonwith plugin metadatasrc/plugin.tsorsrc/plugin.tsxwith plugin definitionsrc/index.tsexporting plugin components
Workflow
Step 1: Locate Plugin Files
Find and read the essential plugin files:
package.json- Get package namesrc/plugin.ts- Find exported extensions (pages, cards)src/index.ts- Find public exports (APIs, components)dist-dynamic/dist-scalprum/plugin-manifest.json- Get scalprum name if built
Step 2: Determine Scalprum Name
The scalprum name is used to reference the plugin in RHDH configuration:
- If
plugin-manifest.jsonexists: Use thenamefield - If
scalpruminpackage.json: Usescalprum.name - Otherwise derive from package name:
@my-org/backstage-plugin-foobecomesmy-org.backstage-plugin-foo@internal/backstage-plugin-foobecomesinternal.backstage-plugin-foo
Step 3: Identify Exports
Analyze the plugin source to find:
Routable Extensions (pages):
- Look for
createRoutableExtensioninplugin.ts - These become
dynamicRoutesentries - Extract the export name (e.g.,
MyPluginPage)
Entity Cards/Content:
- Look for
createComponentExtensioninplugin.ts - These become
mountPointsentries - Identify if they use
useEntity(entity-scoped)
API Factories:
- Look for
createApiFactoryandcreateApiRefinplugin.tsorapi.ts - These become
apiFactoriesentries - Extract the
apiRefexport name
Icons:
- Look for icon exports (React components returning SVG/Icon)
- These become
appIconsentries
Step 4: Generate Configuration
Output the complete wiring configuration in YAML format:
# RHDH Dynamic Plugin Configuration
# Add to your dynamic-plugins.yaml or app-config.yaml
dynamicPlugins:
frontend:
<scalprum-name>:
dynamicRoutes:
- path: /<plugin-id>
importName: <PageComponentName>
menuItem:
icon: <icon-name>
text: <Plugin Display Name>
mountPoints:
- mountPoint: entity.page.overview/cards
importName: <CardComponentName>
config:
if:
allOf:
- isKind: component
apiFactories:
- importName: <apiRefName>
appIcons:
- name: <iconName>
importName: <IconComponentName>
Step 5: Present to User
Show the generated configuration with:
- The YAML configuration block
- A table explaining each entry and its source
- Notes about any optional configurations
- Ask if it should be saved to a file
Example Output
For a plugin with:
- Package:
@internal/backstage-plugin-demoplugin - Page:
DemopluginPage - API:
todoApiRef
Generate:
dynamicPlugins:
frontend:
internal.backstage-plugin-demoplugin:
dynamicRoutes:
- path: /demoplugin
importName: DemopluginPage
menuItem:
icon: extension
text: Demo Plugin
apiFactories:
- importName: todoApiRef
Configuration Options Reference
Dynamic Routes
dynamicRoutes:
- path: /my-plugin # URL path
importName: MyPage # Exported component name
module: PluginRoot # Optional: scalprum module (default: PluginRoot)
menuItem:
icon: dashboard # System icon or custom appIcon
text: My Plugin # Sidebar menu text
Mount Points
mountPoints:
- mountPoint: entity.page.overview/cards
importName: MyCard
config:
layout:
gridColumn: '1 / -1' # Full width
if:
allOf:
- isKind: component
- hasAnnotation: my-plugin/enabled
API Factories
apiFactories:
- importName: myApiFactory # Or myApiRef if plugin exports it
App Icons
appIcons:
- name: myIcon
importName: MyIconComponent
Common Patterns
Page Plugin
Plugin that adds a standalone page:
dynamicRoutes:
- path: /my-plugin
importName: MyPluginPage
menuItem:
icon: extension
text: My Plugin
Entity Card Plugin
Plugin that adds a card to entity pages:
mountPoints:
- mountPoint: entity.page.overview/cards
importName: MyEntityCard
config:
if:
allOf:
- isKind: component
Page + Card Plugin
Plugin with both page and entity integration:
dynamicRoutes:
- path: /my-plugin
importName: MyPluginPage
menuItem:
icon: myIcon
text: My Plugin
mountPoints:
- mountPoint: entity.page.overview/cards
importName: MyEntityCard
appIcons:
- name: myIcon
importName: MyIcon
Notes
- The generated configuration is a starting point; adjust as needed
- Use
references/frontend-wiring.mdfor complete configuration options - Entity cards may need condition tuning based on target entity kinds
- Custom icons must be exported from the plugin's index.ts
Reference Files
references/frontend-wiring.md- Complete mount points, routes, bindingsreferences/entity-page.md- Entity page customization