[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-red-hat-developer-nfs-migration":3,"mdc--d7gix1-key":34,"related-repo-red-hat-developer-nfs-migration":1161,"related-org-red-hat-developer-nfs-migration":1271},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"nfs-migration","migrate plugins to New Frontend System","Migrate Backstage frontend plugins from the legacy system to the New Frontend System (NFS). Use when asked to \"migrate to NFS\", \"new frontend system\", \"convert plugin to NFS\", \"createFrontendPlugin\", \"PageBlueprint\", \"ApiBlueprint\", \"SubPageBlueprint\", \"alpha to GA\", \"legacy to NFS\", \"frontend migration\", \"extension blueprints\", \"migrate frontend plugin\", \"NFS support\", \"graduate alpha\", or mentions migrating a Backstage plugin to the new frontend system for RHDH.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"red-hat-developer","Red Hat Developer","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fred-hat-developer.png","redhat-developer",[13,17,20],{"name":14,"slug":15,"type":16},"Migration","migration","tag",{"name":18,"slug":19,"type":16},"Engineering","engineering",{"name":21,"slug":22,"type":16},"Frontend","frontend",15,"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill","2026-07-16T06:03:27.078987",null,28,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Claude Code skill for RHDH plugin lifecycle management","https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill\u002Ftree\u002FHEAD\u002Fskills\u002Fnfs-migration","---\nname: nfs-migration\ndescription: >\n  Migrate Backstage frontend plugins from the legacy system to the New Frontend\n  System (NFS). Use when asked to \"migrate to NFS\", \"new frontend system\",\n  \"convert plugin to NFS\", \"createFrontendPlugin\", \"PageBlueprint\",\n  \"ApiBlueprint\", \"SubPageBlueprint\", \"alpha to GA\", \"legacy to NFS\",\n  \"frontend migration\", \"extension blueprints\", \"migrate frontend plugin\",\n  \"NFS support\", \"graduate alpha\", or mentions migrating a Backstage plugin\n  to the new frontend system for RHDH.\n---\n\n\u003Cessential_principles>\n\n\u003Cprinciple name=\"discover_first\">\nAlways read the plugin's `package.json`, `src\u002Fplugin.ts` (or `src\u002Fplugin.tsx`), route refs, API factories, and exported components before making any changes. Understand what exists before migrating.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"nfs_at_alpha\">\nNFS is not GA yet. The default approach is to add NFS at `.\u002Falpha` while keeping legacy at the root export (`.`). This avoids breaking existing consumers.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"upstream_apis\">\nUse `@backstage\u002Ffrontend-plugin-api` for core blueprints. RHDH-specific blueprints (`AppDrawerContentBlueprint`, `GlobalHeaderMenuItemBlueprint`) come from `@red-hat-developer-hub\u002F*` packages. Don't mix them up.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"modules_not_plugins\">\nEntity content and cards can go directly in the plugin's `extensions` array — the blueprint declares its own attach point. Use `createFrontendModule` only for extensions that target a different plugin (translations → `pluginId: 'app'`, homepage widgets → `pluginId: 'home'`) or when injecting content from outside a plugin you don't own.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"shared_components\">\nKeep component imports (`useApi`, `useRouteRef`, etc.) on `@backstage\u002Fcore-plugin-api` — they work in both legacy and NFS contexts. This lets the same components serve both export paths. Only use `compatWrapper()` when a component depends on legacy context providers (e.g. old `SidebarContext`) that aren't available in NFS. Don't migrate component imports to `@backstage\u002Ffrontend-plugin-api` if you need to support legacy consumers.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"keep_legacy\">\nLegacy exports must remain available since NFS is not GA. With the alpha approach, legacy stays at root unchanged. With the colocated approach, legacy source moves to `legacy.ts` but is re-exported from `index.ts` so existing consumers don't break.\n\u003C\u002Fprinciple>\n\n\u003C\u002Fessential_principles>\n\n\u003Cintake>\n\n## What would you like to do?\n\n1. **Migrate a plugin to NFS** — Analyze your existing plugin and convert it to the New Frontend System\n2. **Test a migrated plugin in RHDH** — Deploy and verify in a local or cluster RHDH instance\n3. **Learn about NFS migration** — Read the migration guide\n\n**Wait for response before proceeding.**\n\n\u003C\u002Fintake>\n\n\u003Crouting>\n\n| Response | Action |\n|----------|--------|\n| 1, \"migrate\", \"convert\", \"NFS\" | Follow the migration workflow below |\n| 2, \"test\", \"verify\", \"deploy\" | Read `workflows\u002Ftest-nfs-plugin.md` |\n| 3, \"learn\", \"guide\", \"overview\" | Read `references\u002Foverview.md` and present key sections to the user |\n\n\u003C\u002Frouting>\n\n\u003Cmigration_workflow>\n\n### Step 1: Discover\n\nRead `package.json` and `src\u002Fplugin.ts` (or `src\u002Fplugin.tsx`). Identify:\n- Plugin ID\n- Routes and route refs\n- API factories\n- Routable extensions (pages)\n- Component extensions (entity cards, tabs)\n- Sidebar\u002Fnav items\n- Translations\n- RHDH-specific extensions (drawers, header items, homepage widgets)\n- RHDH dynamic plugin mount points (`app-config.dynamic.yaml` — see `references\u002Fmount-point-mapping.md`)\n\nList all findings to the user before proceeding.\n\nIf the plugin's `@backstage\u002F*` dependencies are outdated, upgrade them first using the `backstage-upgrade` skill (`..\u002Fbackstage-upgrade\u002FSKILL.md`) before proceeding with migration.\n\n### Step 2: Choose Approach\n\nNFS is not GA yet. Use the **Alpha** approach by default: NFS at `.\u002Falpha`, legacy stays at root (`.`).\n\nThe **Colocated** approach is the alternative: NFS as default export in `index.ts`, legacy source in `legacy.ts` but re-exported from `index.ts` for backward compatibility. Use this when the user wants NFS and legacy APIs available from the same import path.\n\n### Step 3: Migrate Extensions\n\nFor each extension type found in Step 1, load the appropriate reference:\n\n| Extension type | Reference to load |\n|----------------|-------------------|\n| Pages, API factories | `references\u002Fmigrate-page.md` |\n| Entity content tabs or cards | `references\u002Fmigrate-entity-content.md` |\n| Translations \u002F i18n | `references\u002Fmigrate-translations.md` |\n| RHDH drawers, header items, homepage widgets | `references\u002Fmigrate-rhdh-extensions.md` |\n| App-level wrappers or root elements | `references\u002Fmigrate-app-level.md` |\n\nApply each reference's patterns to the discovered extensions. For page plugins, create NFS variants of page components without the page shell (dual header pattern in `migrate-page.md`).\n\n### Step 4: Update package.json\n\nLoad `references\u002Fpackage-json.md` and apply the export configuration matching the chosen approach (alpha or colocated).\n\n### Step 5: Update App Wiring\n\nLoad `references\u002Fapp-setup.md` and:\n- Add an NFS dev app at `dev\u002Findex.tsx` (or `dev\u002Fnfs.tsx`) using `createApp` from `@backstage\u002Ffrontend-defaults`\n- Keep the existing legacy dev app working\n- Verify consumer imports still resolve (alpha approach: no changes needed; colocated approach: legacy re-exports from `index.ts` maintain compatibility)\n\n### Step 6: Verify\n\nLoad `references\u002Fverification.md` and run all checks. Run `yarn tsc` from the **workspace root** (not just the plugin directory) to catch consumer import issues.\n\n\u003C\u002Fmigration_workflow>\n\n\u003Creference_index>\n\n| Reference | Load when... |\n|-----------|-------------|\n| `references\u002Fmigrate-page.md` | Plugin has pages or API factories |\n| `references\u002Fapi-changes.md` | Updating a plugin migrated against an older NFS version |\n| `references\u002Fmigrate-entity-content.md` | Plugin has entity tabs or cards |\n| `references\u002Fmigrate-translations.md` | Plugin has i18n\u002Ftranslations |\n| `references\u002Fmigrate-rhdh-extensions.md` | Plugin uses RHDH drawer, header, or homepage widgets |\n| `references\u002Fmount-point-mapping.md` | Plugin uses RHDH dynamic plugin mount points (legacy config) |\n| `references\u002Fmigrate-app-level.md` | Plugin has app-level wrappers or root elements |\n| `references\u002Fpackage-json.md` | Updating package.json exports |\n| `references\u002Fapp-setup.md` | Setting up or updating the NFS dev app |\n| `references\u002Fverification.md` | Verifying the migration |\n| `references\u002Ftesting-rhdh.md` | Testing with a real RHDH instance |\n| `references\u002Fgotchas.md` | Troubleshooting migration issues |\n| `references\u002Freference-prs.md` | Looking for real migration examples |\n| `references\u002Foperator-config.md` | Plugin uses RHDH operator config or needs `app.extensions` \u002F `app.routes.bindings` reference |\n| `references\u002Foverview.md` | User wants to learn about NFS before migrating |\n| `references\u002Fsupport.md` | User needs help beyond what the skill covers |\n\n\u003C\u002Freference_index>\n\n\u003Csuccess_criteria>\n\n- `.\u002Falpha` (or root, for colocated) default-exports a `createFrontendPlugin` result\n- All legacy extensions have NFS Blueprint equivalents\n- Pages that need nav entries have `title` and `icon` set (on `PageBlueprint` or `createFrontendPlugin`)\n- `package.json` exports NFS at `.\u002Falpha` (alpha approach) or `.` (colocated approach)\n- Translations are in a `createFrontendModule` with `pluginId: 'app'`\n- Entity content extensions are in the plugin's `extensions` array (or a catalog module if injecting from outside)\n- `yarn tsc` and `yarn build` pass\n- Legacy exports remain available (unchanged at root for alpha; re-exported from `index.ts` for colocated)\n\n\u003C\u002Fsuccess_criteria>\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,54,60,66,72,78,84,89,144,229,234,241,269,334,339,368,374,402,437,443,448,555,567,573,586,592,604,658,664,691,696,701,1001,1006,1011,1156],{"type":40,"tag":41,"props":42,"children":43},"element","p",{},[44],{"type":45,"value":46},"text","\u003Cessential_principles>",{"type":40,"tag":48,"props":49,"children":51},"principle",{"name":50},"discover_first",[52],{"type":45,"value":53},"\nAlways read the plugin's `package.json`, `src\u002Fplugin.ts` (or `src\u002Fplugin.tsx`), route refs, API factories, and exported components before making any changes. Understand what exists before migrating.\n",{"type":40,"tag":48,"props":55,"children":57},{"name":56},"nfs_at_alpha",[58],{"type":45,"value":59},"\nNFS is not GA yet. The default approach is to add NFS at `.\u002Falpha` while keeping legacy at the root export (`.`). This avoids breaking existing consumers.\n",{"type":40,"tag":48,"props":61,"children":63},{"name":62},"upstream_apis",[64],{"type":45,"value":65},"\nUse `@backstage\u002Ffrontend-plugin-api` for core blueprints. RHDH-specific blueprints (`AppDrawerContentBlueprint`, `GlobalHeaderMenuItemBlueprint`) come from `@red-hat-developer-hub\u002F*` packages. Don't mix them up.\n",{"type":40,"tag":48,"props":67,"children":69},{"name":68},"modules_not_plugins",[70],{"type":45,"value":71},"\nEntity content and cards can go directly in the plugin's `extensions` array — the blueprint declares its own attach point. Use `createFrontendModule` only for extensions that target a different plugin (translations → `pluginId: 'app'`, homepage widgets → `pluginId: 'home'`) or when injecting content from outside a plugin you don't own.\n",{"type":40,"tag":48,"props":73,"children":75},{"name":74},"shared_components",[76],{"type":45,"value":77},"\nKeep component imports (`useApi`, `useRouteRef`, etc.) on `@backstage\u002Fcore-plugin-api` — they work in both legacy and NFS contexts. This lets the same components serve both export paths. Only use `compatWrapper()` when a component depends on legacy context providers (e.g. old `SidebarContext`) that aren't available in NFS. Don't migrate component imports to `@backstage\u002Ffrontend-plugin-api` if you need to support legacy consumers.\n",{"type":40,"tag":48,"props":79,"children":81},{"name":80},"keep_legacy",[82],{"type":45,"value":83},"\nLegacy exports must remain available since NFS is not GA. With the alpha approach, legacy stays at root unchanged. With the colocated approach, legacy source moves to `legacy.ts` but is re-exported from `index.ts` so existing consumers don't break.\n",{"type":40,"tag":41,"props":85,"children":86},{},[87],{"type":45,"value":88},"\u003C\u002Fessential_principles>",{"type":40,"tag":90,"props":91,"children":92},"intake",{},[93,100,136],{"type":40,"tag":94,"props":95,"children":97},"h2",{"id":96},"what-would-you-like-to-do",[98],{"type":45,"value":99},"What would you like to do?",{"type":40,"tag":101,"props":102,"children":103},"ol",{},[104,116,126],{"type":40,"tag":105,"props":106,"children":107},"li",{},[108,114],{"type":40,"tag":109,"props":110,"children":111},"strong",{},[112],{"type":45,"value":113},"Migrate a plugin to NFS",{"type":45,"value":115}," — Analyze your existing plugin and convert it to the New Frontend System",{"type":40,"tag":105,"props":117,"children":118},{},[119,124],{"type":40,"tag":109,"props":120,"children":121},{},[122],{"type":45,"value":123},"Test a migrated plugin in RHDH",{"type":45,"value":125}," — Deploy and verify in a local or cluster RHDH instance",{"type":40,"tag":105,"props":127,"children":128},{},[129,134],{"type":40,"tag":109,"props":130,"children":131},{},[132],{"type":45,"value":133},"Learn about NFS migration",{"type":45,"value":135}," — Read the migration guide",{"type":40,"tag":41,"props":137,"children":138},{},[139],{"type":40,"tag":109,"props":140,"children":141},{},[142],{"type":45,"value":143},"Wait for response before proceeding.",{"type":40,"tag":145,"props":146,"children":147},"routing",{},[148],{"type":40,"tag":149,"props":150,"children":151},"table",{},[152,171],{"type":40,"tag":153,"props":154,"children":155},"thead",{},[156],{"type":40,"tag":157,"props":158,"children":159},"tr",{},[160,166],{"type":40,"tag":161,"props":162,"children":163},"th",{},[164],{"type":45,"value":165},"Response",{"type":40,"tag":161,"props":167,"children":168},{},[169],{"type":45,"value":170},"Action",{"type":40,"tag":172,"props":173,"children":174},"tbody",{},[175,189,209],{"type":40,"tag":157,"props":176,"children":177},{},[178,184],{"type":40,"tag":179,"props":180,"children":181},"td",{},[182],{"type":45,"value":183},"1, \"migrate\", \"convert\", \"NFS\"",{"type":40,"tag":179,"props":185,"children":186},{},[187],{"type":45,"value":188},"Follow the migration workflow below",{"type":40,"tag":157,"props":190,"children":191},{},[192,197],{"type":40,"tag":179,"props":193,"children":194},{},[195],{"type":45,"value":196},"2, \"test\", \"verify\", \"deploy\"",{"type":40,"tag":179,"props":198,"children":199},{},[200,202],{"type":45,"value":201},"Read ",{"type":40,"tag":203,"props":204,"children":206},"code",{"className":205},[],[207],{"type":45,"value":208},"workflows\u002Ftest-nfs-plugin.md",{"type":40,"tag":157,"props":210,"children":211},{},[212,217],{"type":40,"tag":179,"props":213,"children":214},{},[215],{"type":45,"value":216},"3, \"learn\", \"guide\", \"overview\"",{"type":40,"tag":179,"props":218,"children":219},{},[220,221,227],{"type":45,"value":201},{"type":40,"tag":203,"props":222,"children":224},{"className":223},[],[225],{"type":45,"value":226},"references\u002Foverview.md",{"type":45,"value":228}," and present key sections to the user",{"type":40,"tag":41,"props":230,"children":231},{},[232],{"type":45,"value":233},"\u003Cmigration_workflow>",{"type":40,"tag":235,"props":236,"children":238},"h3",{"id":237},"step-1-discover",[239],{"type":45,"value":240},"Step 1: Discover",{"type":40,"tag":41,"props":242,"children":243},{},[244,245,251,253,259,261,267],{"type":45,"value":201},{"type":40,"tag":203,"props":246,"children":248},{"className":247},[],[249],{"type":45,"value":250},"package.json",{"type":45,"value":252}," and ",{"type":40,"tag":203,"props":254,"children":256},{"className":255},[],[257],{"type":45,"value":258},"src\u002Fplugin.ts",{"type":45,"value":260}," (or ",{"type":40,"tag":203,"props":262,"children":264},{"className":263},[],[265],{"type":45,"value":266},"src\u002Fplugin.tsx",{"type":45,"value":268},"). Identify:",{"type":40,"tag":270,"props":271,"children":272},"ul",{},[273,278,283,288,293,298,303,308,313],{"type":40,"tag":105,"props":274,"children":275},{},[276],{"type":45,"value":277},"Plugin ID",{"type":40,"tag":105,"props":279,"children":280},{},[281],{"type":45,"value":282},"Routes and route refs",{"type":40,"tag":105,"props":284,"children":285},{},[286],{"type":45,"value":287},"API factories",{"type":40,"tag":105,"props":289,"children":290},{},[291],{"type":45,"value":292},"Routable extensions (pages)",{"type":40,"tag":105,"props":294,"children":295},{},[296],{"type":45,"value":297},"Component extensions (entity cards, tabs)",{"type":40,"tag":105,"props":299,"children":300},{},[301],{"type":45,"value":302},"Sidebar\u002Fnav items",{"type":40,"tag":105,"props":304,"children":305},{},[306],{"type":45,"value":307},"Translations",{"type":40,"tag":105,"props":309,"children":310},{},[311],{"type":45,"value":312},"RHDH-specific extensions (drawers, header items, homepage widgets)",{"type":40,"tag":105,"props":314,"children":315},{},[316,318,324,326,332],{"type":45,"value":317},"RHDH dynamic plugin mount points (",{"type":40,"tag":203,"props":319,"children":321},{"className":320},[],[322],{"type":45,"value":323},"app-config.dynamic.yaml",{"type":45,"value":325}," — see ",{"type":40,"tag":203,"props":327,"children":329},{"className":328},[],[330],{"type":45,"value":331},"references\u002Fmount-point-mapping.md",{"type":45,"value":333},")",{"type":40,"tag":41,"props":335,"children":336},{},[337],{"type":45,"value":338},"List all findings to the user before proceeding.",{"type":40,"tag":41,"props":340,"children":341},{},[342,344,350,352,358,360,366],{"type":45,"value":343},"If the plugin's ",{"type":40,"tag":203,"props":345,"children":347},{"className":346},[],[348],{"type":45,"value":349},"@backstage\u002F*",{"type":45,"value":351}," dependencies are outdated, upgrade them first using the ",{"type":40,"tag":203,"props":353,"children":355},{"className":354},[],[356],{"type":45,"value":357},"backstage-upgrade",{"type":45,"value":359}," skill (",{"type":40,"tag":203,"props":361,"children":363},{"className":362},[],[364],{"type":45,"value":365},"..\u002Fbackstage-upgrade\u002FSKILL.md",{"type":45,"value":367},") before proceeding with migration.",{"type":40,"tag":235,"props":369,"children":371},{"id":370},"step-2-choose-approach",[372],{"type":45,"value":373},"Step 2: Choose Approach",{"type":40,"tag":41,"props":375,"children":376},{},[377,379,384,386,392,394,400],{"type":45,"value":378},"NFS is not GA yet. Use the ",{"type":40,"tag":109,"props":380,"children":381},{},[382],{"type":45,"value":383},"Alpha",{"type":45,"value":385}," approach by default: NFS at ",{"type":40,"tag":203,"props":387,"children":389},{"className":388},[],[390],{"type":45,"value":391},".\u002Falpha",{"type":45,"value":393},", legacy stays at root (",{"type":40,"tag":203,"props":395,"children":397},{"className":396},[],[398],{"type":45,"value":399},".",{"type":45,"value":401},").",{"type":40,"tag":41,"props":403,"children":404},{},[405,407,412,414,420,422,428,430,435],{"type":45,"value":406},"The ",{"type":40,"tag":109,"props":408,"children":409},{},[410],{"type":45,"value":411},"Colocated",{"type":45,"value":413}," approach is the alternative: NFS as default export in ",{"type":40,"tag":203,"props":415,"children":417},{"className":416},[],[418],{"type":45,"value":419},"index.ts",{"type":45,"value":421},", legacy source in ",{"type":40,"tag":203,"props":423,"children":425},{"className":424},[],[426],{"type":45,"value":427},"legacy.ts",{"type":45,"value":429}," but re-exported from ",{"type":40,"tag":203,"props":431,"children":433},{"className":432},[],[434],{"type":45,"value":419},{"type":45,"value":436}," for backward compatibility. Use this when the user wants NFS and legacy APIs available from the same import path.",{"type":40,"tag":235,"props":438,"children":440},{"id":439},"step-3-migrate-extensions",[441],{"type":45,"value":442},"Step 3: Migrate Extensions",{"type":40,"tag":41,"props":444,"children":445},{},[446],{"type":45,"value":447},"For each extension type found in Step 1, load the appropriate reference:",{"type":40,"tag":149,"props":449,"children":450},{},[451,467],{"type":40,"tag":153,"props":452,"children":453},{},[454],{"type":40,"tag":157,"props":455,"children":456},{},[457,462],{"type":40,"tag":161,"props":458,"children":459},{},[460],{"type":45,"value":461},"Extension type",{"type":40,"tag":161,"props":463,"children":464},{},[465],{"type":45,"value":466},"Reference to load",{"type":40,"tag":172,"props":468,"children":469},{},[470,487,504,521,538],{"type":40,"tag":157,"props":471,"children":472},{},[473,478],{"type":40,"tag":179,"props":474,"children":475},{},[476],{"type":45,"value":477},"Pages, API factories",{"type":40,"tag":179,"props":479,"children":480},{},[481],{"type":40,"tag":203,"props":482,"children":484},{"className":483},[],[485],{"type":45,"value":486},"references\u002Fmigrate-page.md",{"type":40,"tag":157,"props":488,"children":489},{},[490,495],{"type":40,"tag":179,"props":491,"children":492},{},[493],{"type":45,"value":494},"Entity content tabs or cards",{"type":40,"tag":179,"props":496,"children":497},{},[498],{"type":40,"tag":203,"props":499,"children":501},{"className":500},[],[502],{"type":45,"value":503},"references\u002Fmigrate-entity-content.md",{"type":40,"tag":157,"props":505,"children":506},{},[507,512],{"type":40,"tag":179,"props":508,"children":509},{},[510],{"type":45,"value":511},"Translations \u002F i18n",{"type":40,"tag":179,"props":513,"children":514},{},[515],{"type":40,"tag":203,"props":516,"children":518},{"className":517},[],[519],{"type":45,"value":520},"references\u002Fmigrate-translations.md",{"type":40,"tag":157,"props":522,"children":523},{},[524,529],{"type":40,"tag":179,"props":525,"children":526},{},[527],{"type":45,"value":528},"RHDH drawers, header items, homepage widgets",{"type":40,"tag":179,"props":530,"children":531},{},[532],{"type":40,"tag":203,"props":533,"children":535},{"className":534},[],[536],{"type":45,"value":537},"references\u002Fmigrate-rhdh-extensions.md",{"type":40,"tag":157,"props":539,"children":540},{},[541,546],{"type":40,"tag":179,"props":542,"children":543},{},[544],{"type":45,"value":545},"App-level wrappers or root elements",{"type":40,"tag":179,"props":547,"children":548},{},[549],{"type":40,"tag":203,"props":550,"children":552},{"className":551},[],[553],{"type":45,"value":554},"references\u002Fmigrate-app-level.md",{"type":40,"tag":41,"props":556,"children":557},{},[558,560,566],{"type":45,"value":559},"Apply each reference's patterns to the discovered extensions. For page plugins, create NFS variants of page components without the page shell (dual header pattern in ",{"type":40,"tag":203,"props":561,"children":563},{"className":562},[],[564],{"type":45,"value":565},"migrate-page.md",{"type":45,"value":401},{"type":40,"tag":235,"props":568,"children":570},{"id":569},"step-4-update-packagejson",[571],{"type":45,"value":572},"Step 4: Update package.json",{"type":40,"tag":41,"props":574,"children":575},{},[576,578,584],{"type":45,"value":577},"Load ",{"type":40,"tag":203,"props":579,"children":581},{"className":580},[],[582],{"type":45,"value":583},"references\u002Fpackage-json.md",{"type":45,"value":585}," and apply the export configuration matching the chosen approach (alpha or colocated).",{"type":40,"tag":235,"props":587,"children":589},{"id":588},"step-5-update-app-wiring",[590],{"type":45,"value":591},"Step 5: Update App Wiring",{"type":40,"tag":41,"props":593,"children":594},{},[595,596,602],{"type":45,"value":577},{"type":40,"tag":203,"props":597,"children":599},{"className":598},[],[600],{"type":45,"value":601},"references\u002Fapp-setup.md",{"type":45,"value":603}," and:",{"type":40,"tag":270,"props":605,"children":606},{},[607,641,646],{"type":40,"tag":105,"props":608,"children":609},{},[610,612,618,619,625,627,633,635],{"type":45,"value":611},"Add an NFS dev app at ",{"type":40,"tag":203,"props":613,"children":615},{"className":614},[],[616],{"type":45,"value":617},"dev\u002Findex.tsx",{"type":45,"value":260},{"type":40,"tag":203,"props":620,"children":622},{"className":621},[],[623],{"type":45,"value":624},"dev\u002Fnfs.tsx",{"type":45,"value":626},") using ",{"type":40,"tag":203,"props":628,"children":630},{"className":629},[],[631],{"type":45,"value":632},"createApp",{"type":45,"value":634}," from ",{"type":40,"tag":203,"props":636,"children":638},{"className":637},[],[639],{"type":45,"value":640},"@backstage\u002Ffrontend-defaults",{"type":40,"tag":105,"props":642,"children":643},{},[644],{"type":45,"value":645},"Keep the existing legacy dev app working",{"type":40,"tag":105,"props":647,"children":648},{},[649,651,656],{"type":45,"value":650},"Verify consumer imports still resolve (alpha approach: no changes needed; colocated approach: legacy re-exports from ",{"type":40,"tag":203,"props":652,"children":654},{"className":653},[],[655],{"type":45,"value":419},{"type":45,"value":657}," maintain compatibility)",{"type":40,"tag":235,"props":659,"children":661},{"id":660},"step-6-verify",[662],{"type":45,"value":663},"Step 6: Verify",{"type":40,"tag":41,"props":665,"children":666},{},[667,668,674,676,682,684,689],{"type":45,"value":577},{"type":40,"tag":203,"props":669,"children":671},{"className":670},[],[672],{"type":45,"value":673},"references\u002Fverification.md",{"type":45,"value":675}," and run all checks. Run ",{"type":40,"tag":203,"props":677,"children":679},{"className":678},[],[680],{"type":45,"value":681},"yarn tsc",{"type":45,"value":683}," from the ",{"type":40,"tag":109,"props":685,"children":686},{},[687],{"type":45,"value":688},"workspace root",{"type":45,"value":690}," (not just the plugin directory) to catch consumer import issues.",{"type":40,"tag":41,"props":692,"children":693},{},[694],{"type":45,"value":695},"\u003C\u002Fmigration_workflow>",{"type":40,"tag":41,"props":697,"children":698},{},[699],{"type":45,"value":700},"\u003Creference_index>",{"type":40,"tag":149,"props":702,"children":703},{},[704,720],{"type":40,"tag":153,"props":705,"children":706},{},[707],{"type":40,"tag":157,"props":708,"children":709},{},[710,715],{"type":40,"tag":161,"props":711,"children":712},{},[713],{"type":45,"value":714},"Reference",{"type":40,"tag":161,"props":716,"children":717},{},[718],{"type":45,"value":719},"Load when...",{"type":40,"tag":172,"props":721,"children":722},{},[723,739,756,772,788,804,820,836,852,868,884,901,918,935,968,984],{"type":40,"tag":157,"props":724,"children":725},{},[726,734],{"type":40,"tag":179,"props":727,"children":728},{},[729],{"type":40,"tag":203,"props":730,"children":732},{"className":731},[],[733],{"type":45,"value":486},{"type":40,"tag":179,"props":735,"children":736},{},[737],{"type":45,"value":738},"Plugin has pages or API factories",{"type":40,"tag":157,"props":740,"children":741},{},[742,751],{"type":40,"tag":179,"props":743,"children":744},{},[745],{"type":40,"tag":203,"props":746,"children":748},{"className":747},[],[749],{"type":45,"value":750},"references\u002Fapi-changes.md",{"type":40,"tag":179,"props":752,"children":753},{},[754],{"type":45,"value":755},"Updating a plugin migrated against an older NFS version",{"type":40,"tag":157,"props":757,"children":758},{},[759,767],{"type":40,"tag":179,"props":760,"children":761},{},[762],{"type":40,"tag":203,"props":763,"children":765},{"className":764},[],[766],{"type":45,"value":503},{"type":40,"tag":179,"props":768,"children":769},{},[770],{"type":45,"value":771},"Plugin has entity tabs or cards",{"type":40,"tag":157,"props":773,"children":774},{},[775,783],{"type":40,"tag":179,"props":776,"children":777},{},[778],{"type":40,"tag":203,"props":779,"children":781},{"className":780},[],[782],{"type":45,"value":520},{"type":40,"tag":179,"props":784,"children":785},{},[786],{"type":45,"value":787},"Plugin has i18n\u002Ftranslations",{"type":40,"tag":157,"props":789,"children":790},{},[791,799],{"type":40,"tag":179,"props":792,"children":793},{},[794],{"type":40,"tag":203,"props":795,"children":797},{"className":796},[],[798],{"type":45,"value":537},{"type":40,"tag":179,"props":800,"children":801},{},[802],{"type":45,"value":803},"Plugin uses RHDH drawer, header, or homepage widgets",{"type":40,"tag":157,"props":805,"children":806},{},[807,815],{"type":40,"tag":179,"props":808,"children":809},{},[810],{"type":40,"tag":203,"props":811,"children":813},{"className":812},[],[814],{"type":45,"value":331},{"type":40,"tag":179,"props":816,"children":817},{},[818],{"type":45,"value":819},"Plugin uses RHDH dynamic plugin mount points (legacy config)",{"type":40,"tag":157,"props":821,"children":822},{},[823,831],{"type":40,"tag":179,"props":824,"children":825},{},[826],{"type":40,"tag":203,"props":827,"children":829},{"className":828},[],[830],{"type":45,"value":554},{"type":40,"tag":179,"props":832,"children":833},{},[834],{"type":45,"value":835},"Plugin has app-level wrappers or root elements",{"type":40,"tag":157,"props":837,"children":838},{},[839,847],{"type":40,"tag":179,"props":840,"children":841},{},[842],{"type":40,"tag":203,"props":843,"children":845},{"className":844},[],[846],{"type":45,"value":583},{"type":40,"tag":179,"props":848,"children":849},{},[850],{"type":45,"value":851},"Updating package.json exports",{"type":40,"tag":157,"props":853,"children":854},{},[855,863],{"type":40,"tag":179,"props":856,"children":857},{},[858],{"type":40,"tag":203,"props":859,"children":861},{"className":860},[],[862],{"type":45,"value":601},{"type":40,"tag":179,"props":864,"children":865},{},[866],{"type":45,"value":867},"Setting up or updating the NFS dev app",{"type":40,"tag":157,"props":869,"children":870},{},[871,879],{"type":40,"tag":179,"props":872,"children":873},{},[874],{"type":40,"tag":203,"props":875,"children":877},{"className":876},[],[878],{"type":45,"value":673},{"type":40,"tag":179,"props":880,"children":881},{},[882],{"type":45,"value":883},"Verifying the migration",{"type":40,"tag":157,"props":885,"children":886},{},[887,896],{"type":40,"tag":179,"props":888,"children":889},{},[890],{"type":40,"tag":203,"props":891,"children":893},{"className":892},[],[894],{"type":45,"value":895},"references\u002Ftesting-rhdh.md",{"type":40,"tag":179,"props":897,"children":898},{},[899],{"type":45,"value":900},"Testing with a real RHDH instance",{"type":40,"tag":157,"props":902,"children":903},{},[904,913],{"type":40,"tag":179,"props":905,"children":906},{},[907],{"type":40,"tag":203,"props":908,"children":910},{"className":909},[],[911],{"type":45,"value":912},"references\u002Fgotchas.md",{"type":40,"tag":179,"props":914,"children":915},{},[916],{"type":45,"value":917},"Troubleshooting migration issues",{"type":40,"tag":157,"props":919,"children":920},{},[921,930],{"type":40,"tag":179,"props":922,"children":923},{},[924],{"type":40,"tag":203,"props":925,"children":927},{"className":926},[],[928],{"type":45,"value":929},"references\u002Freference-prs.md",{"type":40,"tag":179,"props":931,"children":932},{},[933],{"type":45,"value":934},"Looking for real migration examples",{"type":40,"tag":157,"props":936,"children":937},{},[938,947],{"type":40,"tag":179,"props":939,"children":940},{},[941],{"type":40,"tag":203,"props":942,"children":944},{"className":943},[],[945],{"type":45,"value":946},"references\u002Foperator-config.md",{"type":40,"tag":179,"props":948,"children":949},{},[950,952,958,960,966],{"type":45,"value":951},"Plugin uses RHDH operator config or needs ",{"type":40,"tag":203,"props":953,"children":955},{"className":954},[],[956],{"type":45,"value":957},"app.extensions",{"type":45,"value":959}," \u002F ",{"type":40,"tag":203,"props":961,"children":963},{"className":962},[],[964],{"type":45,"value":965},"app.routes.bindings",{"type":45,"value":967}," reference",{"type":40,"tag":157,"props":969,"children":970},{},[971,979],{"type":40,"tag":179,"props":972,"children":973},{},[974],{"type":40,"tag":203,"props":975,"children":977},{"className":976},[],[978],{"type":45,"value":226},{"type":40,"tag":179,"props":980,"children":981},{},[982],{"type":45,"value":983},"User wants to learn about NFS before migrating",{"type":40,"tag":157,"props":985,"children":986},{},[987,996],{"type":40,"tag":179,"props":988,"children":989},{},[990],{"type":40,"tag":203,"props":991,"children":993},{"className":992},[],[994],{"type":45,"value":995},"references\u002Fsupport.md",{"type":40,"tag":179,"props":997,"children":998},{},[999],{"type":45,"value":1000},"User needs help beyond what the skill covers",{"type":40,"tag":41,"props":1002,"children":1003},{},[1004],{"type":45,"value":1005},"\u003C\u002Freference_index>",{"type":40,"tag":41,"props":1007,"children":1008},{},[1009],{"type":45,"value":1010},"\u003Csuccess_criteria>",{"type":40,"tag":270,"props":1012,"children":1013},{},[1014,1032,1037,1071,1095,1114,1127,1144],{"type":40,"tag":105,"props":1015,"children":1016},{},[1017,1022,1024,1030],{"type":40,"tag":203,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":45,"value":391},{"type":45,"value":1023}," (or root, for colocated) default-exports a ",{"type":40,"tag":203,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":45,"value":1029},"createFrontendPlugin",{"type":45,"value":1031}," result",{"type":40,"tag":105,"props":1033,"children":1034},{},[1035],{"type":45,"value":1036},"All legacy extensions have NFS Blueprint equivalents",{"type":40,"tag":105,"props":1038,"children":1039},{},[1040,1042,1048,1049,1055,1057,1063,1065,1070],{"type":45,"value":1041},"Pages that need nav entries have ",{"type":40,"tag":203,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":45,"value":1047},"title",{"type":45,"value":252},{"type":40,"tag":203,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":45,"value":1054},"icon",{"type":45,"value":1056}," set (on ",{"type":40,"tag":203,"props":1058,"children":1060},{"className":1059},[],[1061],{"type":45,"value":1062},"PageBlueprint",{"type":45,"value":1064}," or ",{"type":40,"tag":203,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":45,"value":1029},{"type":45,"value":333},{"type":40,"tag":105,"props":1072,"children":1073},{},[1074,1079,1081,1086,1088,1093],{"type":40,"tag":203,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":45,"value":250},{"type":45,"value":1080}," exports NFS at ",{"type":40,"tag":203,"props":1082,"children":1084},{"className":1083},[],[1085],{"type":45,"value":391},{"type":45,"value":1087}," (alpha approach) or ",{"type":40,"tag":203,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":45,"value":399},{"type":45,"value":1094}," (colocated approach)",{"type":40,"tag":105,"props":1096,"children":1097},{},[1098,1100,1106,1108],{"type":45,"value":1099},"Translations are in a ",{"type":40,"tag":203,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":45,"value":1105},"createFrontendModule",{"type":45,"value":1107}," with ",{"type":40,"tag":203,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":45,"value":1113},"pluginId: 'app'",{"type":40,"tag":105,"props":1115,"children":1116},{},[1117,1119,1125],{"type":45,"value":1118},"Entity content extensions are in the plugin's ",{"type":40,"tag":203,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":45,"value":1124},"extensions",{"type":45,"value":1126}," array (or a catalog module if injecting from outside)",{"type":40,"tag":105,"props":1128,"children":1129},{},[1130,1135,1136,1142],{"type":40,"tag":203,"props":1131,"children":1133},{"className":1132},[],[1134],{"type":45,"value":681},{"type":45,"value":252},{"type":40,"tag":203,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":45,"value":1141},"yarn build",{"type":45,"value":1143}," pass",{"type":40,"tag":105,"props":1145,"children":1146},{},[1147,1149,1154],{"type":45,"value":1148},"Legacy exports remain available (unchanged at root for alpha; re-exported from ",{"type":40,"tag":203,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":45,"value":419},{"type":45,"value":1155}," for colocated)",{"type":40,"tag":41,"props":1157,"children":1158},{},[1159],{"type":45,"value":1160},"\u003C\u002Fsuccess_criteria>",{"items":1162,"total":1270},[1163,1177,1188,1207,1223,1240,1251],{"slug":1164,"name":1164,"fn":1165,"description":1166,"org":1167,"tags":1168,"stars":23,"repoUrl":24,"updatedAt":1176},"agent-ready","assess repository readiness for AI agents","Assesses a git repository's readiness for use by AI coding agents using the agentready CLI, then walks through and addresses each gap. RHDH-aware: detects RHDH repositories and uses rhdh-repos.md context to pre-fill AGENTS.md and skip inapplicable findings. Use when asked to \"assess agent readiness\", \"run agentready\", \"check how agent-ready this repo is\", \"make this repo agent-ready\", \"improve agent readiness score\", \"assess all RHDH repos\", \"batch agent readiness\", or \"onboard this repo for agents\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1169,1172,1175],{"name":1170,"slug":1171,"type":16},"Agents","agents",{"name":1173,"slug":1174,"type":16},"Code Analysis","code-analysis",{"name":18,"slug":19,"type":16},"2026-07-16T06:03:24.758348",{"slug":357,"name":357,"fn":1178,"description":1179,"org":1180,"tags":1181,"stars":23,"repoUrl":24,"updatedAt":1187},"upgrade Backstage dependencies","Upgrade @backstage\u002F* dependencies in a plugin or app to a target version. Use when asked to \"upgrade backstage\", \"bump backstage\", \"update @backstage\", \"align backstage deps\", \"backstage version bump\", \"upgrade dependencies\", \"backstage-cli versions:bump\", \"update to latest backstage\", \"fix version mismatch\", \"backstage version alignment\", \"upgrade before migration\", or any request to update Backstage package versions in a project.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1182,1183,1186],{"name":18,"slug":19,"type":16},{"name":1184,"slug":1185,"type":16},"Maintenance","maintenance",{"name":14,"slug":15,"type":16},"2026-07-16T06:03:24.067361",{"slug":1189,"name":1189,"fn":1190,"description":1191,"org":1192,"tags":1193,"stars":23,"repoUrl":24,"updatedAt":1206},"base-images-and-rpms","update base images and lockfiles","Updates base images with updateBaseImages.sh and regenerates rpms.lock.yaml with rpm-lockfile-prototype in redhat-developer\u002Frhdh, rhdh-must-gather, and rhdh-operator. Use --analyze for read-only Containerfile\u002FDockerfile scan (current vs latest tags, UBI skew). Use for weekly upstream maintenance, UBI\u002FRHEL base image bumps, RPM lockfile refresh, base-images-and-rpms, main, release-*, or analyzing base images before updating.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1194,1197,1200,1203],{"name":1195,"slug":1196,"type":16},"Automation","automation",{"name":1198,"slug":1199,"type":16},"Configuration","configuration",{"name":1201,"slug":1202,"type":16},"Containers","containers",{"name":1204,"slug":1205,"type":16},"Deployment","deployment","2026-07-16T06:03:27.784453",{"slug":1208,"name":1208,"fn":1209,"description":1210,"org":1211,"tags":1212,"stars":23,"repoUrl":24,"updatedAt":1222},"bug-fix","diagnose and fix plugin bugs","Reproduce, diagnose, fix, and PR plugin bugs from Jira tickets or GitHub issues. Works with both rhdh-plugins and community-plugins. Supports UI bugs (Playwright e2e with before\u002Fafter recordings) and backend bugs (unit\u002Fintegration test verification). Triages issues for agent-readiness before attempting a fix. Accepts a Jira key (RHDHBUGS-1934), Jira URL (redhat.atlassian.net\u002Fbrowse\u002F...), GitHub issue URL (github.com\u002F...\u002Fissues\u002FN), or a request to \"fix this bug\", \"reproduce and fix\", \"\u002Fbug-fix\". By default, stops after the fix for user verification before PR creation. Supports --no-verify mode to skip the verification gate and auto-create the PR. Chains into raise-pr for the full PR lifecycle.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1213,1216,1219],{"name":1214,"slug":1215,"type":16},"Debugging","debugging",{"name":1217,"slug":1218,"type":16},"QA","qa",{"name":1220,"slug":1221,"type":16},"Testing","testing","2026-07-29T06:00:33.054762",{"slug":1224,"name":1224,"fn":1225,"description":1226,"org":1227,"tags":1228,"stars":23,"repoUrl":24,"updatedAt":1239},"compute-plugin-package-overlay-cve-list","generate CVE management reports","Builds an RHDH CVE Management CSV from GA plugin workspace changes in rhdh-plugin-export-overlays since a version tag (patches, source.json, plugins-list). One row per CVE × plugins-list package (multi-workspace CVEs expand). Use for \"CVE CSV\", \"workspace CVEs since tag\", \"collect overlay CVEs\", \"CVE management CSV\", orchestrator\u002Flightspeed CVE review, or plugin package overlay CVE list.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1229,1232,1233,1236],{"name":1230,"slug":1231,"type":16},"Compliance","compliance",{"name":18,"slug":19,"type":16},{"name":1234,"slug":1235,"type":16},"Reporting","reporting",{"name":1237,"slug":1238,"type":16},"Security","security","2026-08-01T05:41:57.852801",{"slug":1241,"name":1241,"fn":1242,"description":1243,"org":1244,"tags":1245,"stars":23,"repoUrl":24,"updatedAt":1250},"create-plugin","scaffold and package RHDH dynamic plugins","Full lifecycle for RHDH dynamic plugins — scaffold, implement, export, package, and configure. Use when asked to \"create RHDH plugin\", \"bootstrap dynamic plugin\", \"create backend plugin\", \"create frontend plugin\", \"export dynamic plugin\", \"package plugin as OCI\", \"generate frontend wiring\", \"create plugin container image\", \"configure mount points\", \"create dynamic route\", \"add entity card\", \"scaffold RHDH plugin\", \"publish plugin to registry\", \"create tgz archive\", or mentions creating, exporting, packaging, or wiring a Backstage plugin for Red Hat Developer Hub. Also use when asked to \"build a plugin from scratch\", \"dynamic plugin tutorial\", \"RHDH plugin from scratch\", or \"build Backstage plugin for RHDH\". Covers backend plugins (APIs, scaffolder actions, processors), frontend plugins (pages, cards, themes), export\u002Fpackaging (OCI, tgz, npm), and frontend wiring configuration (mount points, routes, entity tabs, themes).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1246,1247],{"name":1204,"slug":1205,"type":16},{"name":1248,"slug":1249,"type":16},"Plugin Development","plugin-development","2026-07-16T06:02:28.983498",{"slug":1252,"name":1252,"fn":1253,"description":1254,"org":1255,"tags":1256,"stars":23,"repoUrl":24,"updatedAt":1269},"cursor-mcp-auth","authenticate Atlassian MCP for Jira","Ensures Cursor Atlassian MCP (plugin-atlassian-atlassian → mcp.atlassian.com) is authenticated for redhat.atlassian.net via OAuth. Use for \"authenticate Jira\", \"Atlassian MCP\", \"jira auth failed\", \"mcp_auth Atlassian\", \"cursor MCP auth\", or when another skill needs working Jira access through Cursor MCP.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1257,1260,1263,1266],{"name":1258,"slug":1259,"type":16},"Auth","auth",{"name":1261,"slug":1262,"type":16},"Jira","jira",{"name":1264,"slug":1265,"type":16},"MCP","mcp",{"name":1267,"slug":1268,"type":16},"OAuth","oauth","2026-07-29T06:00:33.525179",24,{"items":1272,"total":1270},[1273,1279,1285,1292,1298,1305,1310,1317,1329,1342,1354,1360],{"slug":1164,"name":1164,"fn":1165,"description":1166,"org":1274,"tags":1275,"stars":23,"repoUrl":24,"updatedAt":1176},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1276,1277,1278],{"name":1170,"slug":1171,"type":16},{"name":1173,"slug":1174,"type":16},{"name":18,"slug":19,"type":16},{"slug":357,"name":357,"fn":1178,"description":1179,"org":1280,"tags":1281,"stars":23,"repoUrl":24,"updatedAt":1187},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1282,1283,1284],{"name":18,"slug":19,"type":16},{"name":1184,"slug":1185,"type":16},{"name":14,"slug":15,"type":16},{"slug":1189,"name":1189,"fn":1190,"description":1191,"org":1286,"tags":1287,"stars":23,"repoUrl":24,"updatedAt":1206},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1288,1289,1290,1291],{"name":1195,"slug":1196,"type":16},{"name":1198,"slug":1199,"type":16},{"name":1201,"slug":1202,"type":16},{"name":1204,"slug":1205,"type":16},{"slug":1208,"name":1208,"fn":1209,"description":1210,"org":1293,"tags":1294,"stars":23,"repoUrl":24,"updatedAt":1222},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1295,1296,1297],{"name":1214,"slug":1215,"type":16},{"name":1217,"slug":1218,"type":16},{"name":1220,"slug":1221,"type":16},{"slug":1224,"name":1224,"fn":1225,"description":1226,"org":1299,"tags":1300,"stars":23,"repoUrl":24,"updatedAt":1239},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1301,1302,1303,1304],{"name":1230,"slug":1231,"type":16},{"name":18,"slug":19,"type":16},{"name":1234,"slug":1235,"type":16},{"name":1237,"slug":1238,"type":16},{"slug":1241,"name":1241,"fn":1242,"description":1243,"org":1306,"tags":1307,"stars":23,"repoUrl":24,"updatedAt":1250},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1308,1309],{"name":1204,"slug":1205,"type":16},{"name":1248,"slug":1249,"type":16},{"slug":1252,"name":1252,"fn":1253,"description":1254,"org":1311,"tags":1312,"stars":23,"repoUrl":24,"updatedAt":1269},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1313,1314,1315,1316],{"name":1258,"slug":1259,"type":16},{"name":1261,"slug":1262,"type":16},{"name":1264,"slug":1265,"type":16},{"name":1267,"slug":1268,"type":16},{"slug":1318,"name":1318,"fn":1319,"description":1320,"org":1321,"tags":1322,"stars":23,"repoUrl":24,"updatedAt":1328},"konflux-release-data-rpa","update release tags in konflux-release-data","Bumps RHDH ReleasePlanAdmission tag versions in konflux-release-data for a stream release (e.g. 1.9.7), opens a GitLab merge request, and launches it in the browser. Use when updating RPA tags, konflux-release-data, ReleasePlanAdmission, rhdh-1-9-*.yaml, rhdh-plugin-catalog-1-9-*.yaml, or preparing an RHDH patch release.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1323,1324,1325],{"name":1195,"slug":1196,"type":16},{"name":1204,"slug":1205,"type":16},{"name":1326,"slug":1327,"type":16},"GitLab","gitlab","2026-07-16T06:00:19.516231",{"slug":1330,"name":1330,"fn":1331,"description":1332,"org":1333,"tags":1334,"stars":23,"repoUrl":24,"updatedAt":1341},"konflux-tekton-updates","update Konflux Tekton task digests","Bumps Konflux Tekton task digests with .tekton\u002FupdateDigests.sh --minor --no-push, applies konflux-ci\u002Fbuild-definitions MIGRATION.md pipeline fixes, and regenerates PipelineRuns. Use for rhdh-plugin-catalog, RHDH midstream (4-rhdh), Konflux task minor bumps, prefetch-dependencies-oci-ta, build-image-index, or updateDigests.sh.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1335,1336,1339,1340],{"name":1195,"slug":1196,"type":16},{"name":1337,"slug":1338,"type":16},"CI\u002FCD","ci-cd",{"name":1204,"slug":1205,"type":16},{"name":18,"slug":19,"type":16},"2026-07-16T06:03:28.123118",{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1346,"tags":1347,"stars":23,"repoUrl":24,"updatedAt":1353},"lifecycle","check Red Hat product lifecycle status","Check version lifecycle and support status for platforms and integrations used by RHDH. Covers OCP, AKS, EKS, GKE, RHDH releases, RHBK, Quay, PostgreSQL, and any Red Hat product via the Product Life Cycles API. Use when asking about version support, EOL dates, GA dates, support phases, or planning version upgrades. Also use for \"is X still supported\", \"what versions should we test\", or \"when does X reach EOL\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1348,1349,1350],{"name":1230,"slug":1231,"type":16},{"name":1184,"slug":1185,"type":16},{"name":1351,"slug":1352,"type":16},"Operations","operations","2026-07-16T06:03:19.344038",{"slug":4,"name":4,"fn":5,"description":6,"org":1355,"tags":1356,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1357,1358,1359],{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"slug":1361,"name":1361,"fn":1362,"description":1363,"org":1364,"tags":1365,"stars":23,"repoUrl":24,"updatedAt":1372},"overlay","manage RHDH plugin export overlays","Manages the rhdh-plugin-export-overlays repository — onboards plugins to the Extensions Catalog, updates plugin versions, fixes overlay build failures, triages and analyzes PRs, triggers publishes, and manages plugin workspaces. Use when working with overlays, importing plugins, debugging CI, checking PRs, bumping versions, or mentions \"Extensions Catalog\", \"overlay build failed\", \"plugin registry\", \"overlay PR\", \"overlay doctor\", \"plugin import\", \"add plugin to catalog\", \"onboard plugin\", or \"plugin workspace\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1366,1367,1370,1371],{"name":1195,"slug":1196,"type":16},{"name":1368,"slug":1369,"type":16},"Code Review","code-review",{"name":1204,"slug":1205,"type":16},{"name":18,"slug":19,"type":16},"2026-07-16T06:03:20.380044"]