This skill should be used when the user asks to "generate frontend wiring", "show frontend wiring", "create RHDH binding", "generate dynamic plugin config", "show plugin wiring for RHDH", "create app-config for frontend plugin", or wants to generate the RHDH dynamic plugin wiring configuration for an existing Backstage frontend plugin. The skill analyzes the plugin's source code and generates the appropriate configuration.
Resources
1Install
npx skillscat add kadel/claude-plugins/generate-frontend-wiring Install via the SkillsCat registry.
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: todoApiRefConfiguration 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 textMount Points
mountPoints:
- mountPoint: entity.page.overview/cards
importName: MyCard
config:
layout:
gridColumn: '1 / -1' # Full width
if:
allOf:
- isKind: component
- hasAnnotation: my-plugin/enabledAPI Factories
apiFactories:
- importName: myApiFactory # Or myApiRef if plugin exports itApp Icons
appIcons:
- name: myIcon
importName: MyIconComponentCommon Patterns
Page Plugin
Plugin that adds a standalone page:
dynamicRoutes:
- path: /my-plugin
importName: MyPluginPage
menuItem:
icon: extension
text: My PluginEntity Card Plugin
Plugin that adds a card to entity pages:
mountPoints:
- mountPoint: entity.page.overview/cards
importName: MyEntityCard
config:
if:
allOf:
- isKind: componentPage + 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: MyIconNotes
- 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