backstage-plugin-createlisted
Install: claude install-skill bendaamerahmed/backstage-idp-plugin
# Create a Backstage plugin
Scaffold a new plugin package in a Backstage monorepo and wire it into `packages/app`
and/or `packages/backend` so it actually loads.
## Preconditions
- Repo generation is known. Run `backstage-repo-discovery` first, or determine it yourself:
- **NFS** (new frontend system): `packages/app/src/App.tsx` uses `createApp` from
`@backstage/frontend-defaults`; plugins use `createFrontendPlugin`, blueprints,
`/alpha` imports.
- **Legacy frontend**: `createApp` from `@backstage/app-defaults`, `<FlatRoutes>`,
`bindRoutes`, `createPlugin` / `createRoutableExtension`.
- **New backend**: `packages/backend/src/index.ts` is a short `createBackend()` +
`backend.add(...)` file. `createServiceBuilder` or `plugins/*.ts` env wiring means the
removed legacy backend — stop and report BLOCKED.
- Release line read from `backstage.json`. Node 22 or 24 only.
- Plugin ID decided: lowercase, dash-separated, stable (it becomes the URL path, the
backend mount point `/api/<pluginId>`, and `backstage.pluginId`). If the ID or the
package split cannot be determined from the task, return BLOCKED rather than guessing.
- `yarn` unless the repo's `packageManager` field says otherwise.
## Procedure
1. **Decide the package split** before generating anything. Follow ADR011 naming, where
`x` is `plugin-<id>`:
- `x` — frontend plugin (React, extensions/blueprints, pages).
- `x-backend` — HTTP routes, DB, service dependencies. Never imported by fr