[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-red-hat-developer-rhdh-pr-review":3,"mdc--a5fqzp-key":37,"related-org-red-hat-developer-rhdh-pr-review":862,"related-repo-red-hat-developer-rhdh-pr-review":1033},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"rhdh-pr-review","review pull requests for RHDH","Review pull requests: code-level analysis with inline comments, and live cluster testing for rhdh-operator PRs. Supports GitHub (GitLab planned). Use when asked to review a PR, review code, post review comments, test PR changes on a cluster, deploy PR images for testing, or do a full PR review. Also use when given a PR URL or number and asked for feedback, or when user mentions \"review this PR\", \"PR review\", \"code review\", or \"test this PR on my cluster\".\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,23],{"name":14,"slug":15,"type":16},"GitHub","github","tag",{"name":18,"slug":19,"type":16},"Code Review","code-review",{"name":21,"slug":22,"type":16},"QA","qa",{"name":24,"slug":25,"type":16},"Engineering","engineering",15,"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill","2026-07-16T06:03:27.430486",null,28,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Claude Code skill for RHDH plugin lifecycle management","https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill\u002Ftree\u002FHEAD\u002Fskills\u002Frhdh-pr-review","---\nname: rhdh-pr-review\ndescription: >\n  Review pull requests: code-level analysis with inline comments, and live cluster testing for rhdh-operator PRs. Supports GitHub (GitLab planned). Use when asked to review a PR, review code, post review comments, test PR changes on a cluster, deploy PR images for testing, or do a full PR review. Also use when given a PR URL or number and asked for feedback, or when user mentions \"review this PR\", \"PR review\", \"code review\", or \"test this PR on my cluster\".\n---\n\n\u003Ccli_setup>\n\nFor cluster testing workflows, set up the orchestrator CLI:\n\n```bash\nRHDH=..\u002Frhdh\u002Fscripts\u002Frhdh\n```\n\n\u003C\u002Fcli_setup>\n\n\u003Cessential_principles>\n\n\u003Cprinciple name=\"layered_architecture\">\nReviews follow a three-layer pipeline: **fetch** (forge-specific) → **analyze** (agnostic) → **post** (forge-specific). Each layer produces a structured artifact for the next. The analyze layer never calls forge-specific CLIs.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"verify_findings\">\nReviewers will produce false positives. Verify every finding against actual code at HEAD before including it. Drop findings that reference non-existent code, duplicate existing comments, misread the code, or conflict with codebase conventions.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"user_confirms_before_posting\">\nPresent the full review draft — summary, inline comments with file:line, and event type — to the user before posting. Proceed only after confirmation.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"deploy_full_bundle\">\nFor cluster testing: deploy the full PR bundle\u002Fmanifests, not just the operator binary image. PR changes to CRDs, RBAC, default config, or bundle metadata are baked into the OLM bundle or install.yaml — a binary-only image swap misses them.\n\u003C\u002Fprinciple>\n\n\u003C\u002Fessential_principles>\n\n\u003Cintake>\n\n## What would you like to do?\n\n### Code Review\n\n1. **Review PR code** — Analyze a PR diff, generate findings, and post inline comments\n2. **Review PR code (analysis only)** — Analyze without posting (e.g., to review locally or post later)\n\n### Cluster Testing (rhdh-operator PRs)\n\n3. **Test PR on cluster** — Deploy PR operator bundle on a live RHDH cluster and verify changes\n\n### Combined\n\n4. **Full review** — Code review + post to GitHub + cluster testing\n\n**Wait for response before proceeding.**\n\n\u003C\u002Fintake>\n\n\u003Crouting>\n\n| Response | Workflow |\n|----------|----------|\n| 1, \"review\", \"review PR\", \"code review\", a PR URL or number | `workflows\u002Ffetch-github.md` → `workflows\u002Freview-code.md` → `workflows\u002Fpost-to-github.md` |\n| 2, \"analyze\", \"analysis only\", \"review locally\" | `workflows\u002Ffetch-github.md` → `workflows\u002Freview-code.md` (stop after findings) |\n| 3, \"test\", \"cluster\", \"deploy\", \"operator PR\", \"test on cluster\" | `workflows\u002Ffetch-github.md` → `workflows\u002Freview-operator-pr.md` |\n| 4, \"full\", \"full review\", \"both\" | `workflows\u002Ffetch-github.md` → `workflows\u002Freview-code.md` → `workflows\u002Fpost-to-github.md` → `workflows\u002Freview-operator-pr.md` |\n\n### Routing rules\n\n1. **PR URL or number with no other context**: default to route 1 (code review + post).\n2. **rhdh-operator PR detected** (repo is `redhat-developer\u002Frhdh-operator`): suggest route 4 (full review) but let the user choose.\n3. **\"review\" without \"post\" or \"cluster\"**: route 1.\n4. **All routes start with fetch.** The fetch workflow produces a context artifact consumed by all downstream workflows.\n\n### Forge detection\n\nCurrently GitHub only. Detect from URL pattern or `gh` CLI availability.\n\nWhen GitLab support is added: `fetch-gitlab.md` and `post-to-gitlab.md` will slot into the same pipeline. The analyze workflow (`review-code.md`) is forge-agnostic and needs no changes.\n\n\u003C\u002Frouting>\n\n\u003Cartifact_contracts>\n\n## Context artifact (fetch → analyze \u002F cluster test)\n\nProduced by the fetch workflow, consumed by all downstream workflows:\n\n```\ncontext artifact\n├── forge: \"github\"\n├── repo: \"owner\u002Frepo\"\n├── pr_number: 123\n├── head_sha: \"abc123...\"\n├── base_ref, head_ref, title, body, author, state, url\n├── labels: [...]\n├── files: [{path, additions, deletions}, ...]\n├── total_additions, total_deletions\n├── diff: \"full unified diff\"\n├── linked_issues: [{number, title, body, labels, state}, ...]\n├── jira_keys: [\"RHIDP-1234\", ...]\n├── existing_comments: [{user, path, line, body, created_at}, ...]\n├── existing_reviews: [{user, state, body}, ...]\n└── ci_status: \"pass\" | \"fail\" | \"pending\" | \"unknown\"\n```\n\n## Findings artifact (analyze → post)\n\nProduced by the analysis workflow, consumed by the posting workflow:\n\n```\nfindings artifact\n├── pr: {repo, number, head_sha}\n├── summary: \"top-level review text\"\n├── event: \"COMMENT\" | \"APPROVE\" | \"REQUEST_CHANGES\"\n└── findings[]\n    ├── path, line, start_line\n    ├── type: \"suggestion\" | \"question\" | \"observation\"\n    └── body: \"comment text\"\n```\n\n\u003C\u002Fartifact_contracts>\n\n\u003Creference_index>\n\n| Reference | Purpose | Load when... | Path |\n|-----------|---------|--------------|------|\n| review-perspectives | Review perspective examples and signal hints | Running `review-code.md` | `references\u002Freview-perspectives.md` |\n| operator-pr-images | CI image extraction and validation | Running `review-operator-pr.md` | `references\u002Foperator-pr-images.md` |\n| github-reference | gh CLI patterns, PR queries | Running any GitHub workflow | `..\u002Frhdh\u002Freferences\u002Fgithub-reference.md` (if available) |\n| rhdh-repos | RHDH ecosystem repository map | Cluster testing | `..\u002Frhdh\u002Freferences\u002Frhdh-repos.md` (if available) |\n\n\u003C\u002Freference_index>\n\n\u003Cskills_index>\n\n| Skill | Purpose | Path |\n|-------|---------|------|\n| rhdh | Orchestrator, environment status, activity tracking | `..\u002Frhdh\u002FSKILL.md` |\n\n\u003C\u002Fskills_index>\n\n\u003Csuccess_criteria>\n\n### Code review\n\n- [ ] PR context fetched (metadata, diff, linked issues, existing comments)\n- [ ] Review perspectives chosen based on PR content\n- [ ] Findings verified against actual code at HEAD\n- [ ] False positives dropped with reasoning shown\n- [ ] Review draft presented to user with event type choice\n- [ ] Review posted to forge (if posting route selected)\n\n### Cluster testing\n\nSee `workflows\u002Freview-operator-pr.md` `\u003Csuccess_criteria>` for the full checklist.\n\n### Full review\n\nAll code review criteria + all cluster testing criteria.\n\n\u003C\u002Fsuccess_criteria>\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,55,91,96,101,108,114,120,126,131,221,471,476,482,487,497,503,508,517,522,527,680,685,690,737,742,747,753,817,822,841,846,851,856],{"type":43,"tag":44,"props":45,"children":46},"element","p",{},[47],{"type":48,"value":49},"text","\u003Ccli_setup>",{"type":43,"tag":44,"props":51,"children":52},{},[53],{"type":48,"value":54},"For cluster testing workflows, set up the orchestrator CLI:",{"type":43,"tag":56,"props":57,"children":62},"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","RHDH=..\u002Frhdh\u002Fscripts\u002Frhdh\n","bash","",[63],{"type":43,"tag":64,"props":65,"children":66},"code",{"__ignoreMap":61},[67],{"type":43,"tag":68,"props":69,"children":72},"span",{"class":70,"line":71},"line",1,[73,79,85],{"type":43,"tag":68,"props":74,"children":76},{"style":75},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[77],{"type":48,"value":78},"RHDH",{"type":43,"tag":68,"props":80,"children":82},{"style":81},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[83],{"type":48,"value":84},"=",{"type":43,"tag":68,"props":86,"children":88},{"style":87},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[89],{"type":48,"value":90},"..\u002Frhdh\u002Fscripts\u002Frhdh\n",{"type":43,"tag":44,"props":92,"children":93},{},[94],{"type":48,"value":95},"\u003C\u002Fcli_setup>",{"type":43,"tag":44,"props":97,"children":98},{},[99],{"type":48,"value":100},"\u003Cessential_principles>",{"type":43,"tag":102,"props":103,"children":105},"principle",{"name":104},"layered_architecture",[106],{"type":48,"value":107},"\nReviews follow a three-layer pipeline: **fetch** (forge-specific) → **analyze** (agnostic) → **post** (forge-specific). Each layer produces a structured artifact for the next. The analyze layer never calls forge-specific CLIs.\n",{"type":43,"tag":102,"props":109,"children":111},{"name":110},"verify_findings",[112],{"type":48,"value":113},"\nReviewers will produce false positives. Verify every finding against actual code at HEAD before including it. Drop findings that reference non-existent code, duplicate existing comments, misread the code, or conflict with codebase conventions.\n",{"type":43,"tag":102,"props":115,"children":117},{"name":116},"user_confirms_before_posting",[118],{"type":48,"value":119},"\nPresent the full review draft — summary, inline comments with file:line, and event type — to the user before posting. Proceed only after confirmation.\n",{"type":43,"tag":102,"props":121,"children":123},{"name":122},"deploy_full_bundle",[124],{"type":48,"value":125},"\nFor cluster testing: deploy the full PR bundle\u002Fmanifests, not just the operator binary image. PR changes to CRDs, RBAC, default config, or bundle metadata are baked into the OLM bundle or install.yaml — a binary-only image swap misses them.\n",{"type":43,"tag":44,"props":127,"children":128},{},[129],{"type":48,"value":130},"\u003C\u002Fessential_principles>",{"type":43,"tag":132,"props":133,"children":134},"intake",{},[135,142,147,173,179,193,199,213],{"type":43,"tag":136,"props":137,"children":139},"h2",{"id":138},"what-would-you-like-to-do",[140],{"type":48,"value":141},"What would you like to do?",{"type":43,"tag":143,"props":144,"children":145},"h3",{"id":19},[146],{"type":48,"value":18},{"type":43,"tag":148,"props":149,"children":150},"ol",{},[151,163],{"type":43,"tag":152,"props":153,"children":154},"li",{},[155,161],{"type":43,"tag":156,"props":157,"children":158},"strong",{},[159],{"type":48,"value":160},"Review PR code",{"type":48,"value":162}," — Analyze a PR diff, generate findings, and post inline comments",{"type":43,"tag":152,"props":164,"children":165},{},[166,171],{"type":43,"tag":156,"props":167,"children":168},{},[169],{"type":48,"value":170},"Review PR code (analysis only)",{"type":48,"value":172}," — Analyze without posting (e.g., to review locally or post later)",{"type":43,"tag":143,"props":174,"children":176},{"id":175},"cluster-testing-rhdh-operator-prs",[177],{"type":48,"value":178},"Cluster Testing (rhdh-operator PRs)",{"type":43,"tag":148,"props":180,"children":182},{"start":181},3,[183],{"type":43,"tag":152,"props":184,"children":185},{},[186,191],{"type":43,"tag":156,"props":187,"children":188},{},[189],{"type":48,"value":190},"Test PR on cluster",{"type":48,"value":192}," — Deploy PR operator bundle on a live RHDH cluster and verify changes",{"type":43,"tag":143,"props":194,"children":196},{"id":195},"combined",[197],{"type":48,"value":198},"Combined",{"type":43,"tag":148,"props":200,"children":202},{"start":201},4,[203],{"type":43,"tag":152,"props":204,"children":205},{},[206,211],{"type":43,"tag":156,"props":207,"children":208},{},[209],{"type":48,"value":210},"Full review",{"type":48,"value":212}," — Code review + post to GitHub + cluster testing",{"type":43,"tag":44,"props":214,"children":215},{},[216],{"type":43,"tag":156,"props":217,"children":218},{},[219],{"type":48,"value":220},"Wait for response before proceeding.",{"type":43,"tag":222,"props":223,"children":224},"routing",{},[225,366,372,423,429,442],{"type":43,"tag":226,"props":227,"children":228},"table",{},[229,248],{"type":43,"tag":230,"props":231,"children":232},"thead",{},[233],{"type":43,"tag":234,"props":235,"children":236},"tr",{},[237,243],{"type":43,"tag":238,"props":239,"children":240},"th",{},[241],{"type":48,"value":242},"Response",{"type":43,"tag":238,"props":244,"children":245},{},[246],{"type":48,"value":247},"Workflow",{"type":43,"tag":249,"props":250,"children":251},"tbody",{},[252,285,309,332],{"type":43,"tag":234,"props":253,"children":254},{},[255,261],{"type":43,"tag":256,"props":257,"children":258},"td",{},[259],{"type":48,"value":260},"1, \"review\", \"review PR\", \"code review\", a PR URL or number",{"type":43,"tag":256,"props":262,"children":263},{},[264,270,272,278,279],{"type":43,"tag":64,"props":265,"children":267},{"className":266},[],[268],{"type":48,"value":269},"workflows\u002Ffetch-github.md",{"type":48,"value":271}," → ",{"type":43,"tag":64,"props":273,"children":275},{"className":274},[],[276],{"type":48,"value":277},"workflows\u002Freview-code.md",{"type":48,"value":271},{"type":43,"tag":64,"props":280,"children":282},{"className":281},[],[283],{"type":48,"value":284},"workflows\u002Fpost-to-github.md",{"type":43,"tag":234,"props":286,"children":287},{},[288,293],{"type":43,"tag":256,"props":289,"children":290},{},[291],{"type":48,"value":292},"2, \"analyze\", \"analysis only\", \"review locally\"",{"type":43,"tag":256,"props":294,"children":295},{},[296,301,302,307],{"type":43,"tag":64,"props":297,"children":299},{"className":298},[],[300],{"type":48,"value":269},{"type":48,"value":271},{"type":43,"tag":64,"props":303,"children":305},{"className":304},[],[306],{"type":48,"value":277},{"type":48,"value":308}," (stop after findings)",{"type":43,"tag":234,"props":310,"children":311},{},[312,317],{"type":43,"tag":256,"props":313,"children":314},{},[315],{"type":48,"value":316},"3, \"test\", \"cluster\", \"deploy\", \"operator PR\", \"test on cluster\"",{"type":43,"tag":256,"props":318,"children":319},{},[320,325,326],{"type":43,"tag":64,"props":321,"children":323},{"className":322},[],[324],{"type":48,"value":269},{"type":48,"value":271},{"type":43,"tag":64,"props":327,"children":329},{"className":328},[],[330],{"type":48,"value":331},"workflows\u002Freview-operator-pr.md",{"type":43,"tag":234,"props":333,"children":334},{},[335,340],{"type":43,"tag":256,"props":336,"children":337},{},[338],{"type":48,"value":339},"4, \"full\", \"full review\", \"both\"",{"type":43,"tag":256,"props":341,"children":342},{},[343,348,349,354,355,360,361],{"type":43,"tag":64,"props":344,"children":346},{"className":345},[],[347],{"type":48,"value":269},{"type":48,"value":271},{"type":43,"tag":64,"props":350,"children":352},{"className":351},[],[353],{"type":48,"value":277},{"type":48,"value":271},{"type":43,"tag":64,"props":356,"children":358},{"className":357},[],[359],{"type":48,"value":284},{"type":48,"value":271},{"type":43,"tag":64,"props":362,"children":364},{"className":363},[],[365],{"type":48,"value":331},{"type":43,"tag":143,"props":367,"children":369},{"id":368},"routing-rules",[370],{"type":48,"value":371},"Routing rules",{"type":43,"tag":148,"props":373,"children":374},{},[375,385,403,413],{"type":43,"tag":152,"props":376,"children":377},{},[378,383],{"type":43,"tag":156,"props":379,"children":380},{},[381],{"type":48,"value":382},"PR URL or number with no other context",{"type":48,"value":384},": default to route 1 (code review + post).",{"type":43,"tag":152,"props":386,"children":387},{},[388,393,395,401],{"type":43,"tag":156,"props":389,"children":390},{},[391],{"type":48,"value":392},"rhdh-operator PR detected",{"type":48,"value":394}," (repo is ",{"type":43,"tag":64,"props":396,"children":398},{"className":397},[],[399],{"type":48,"value":400},"redhat-developer\u002Frhdh-operator",{"type":48,"value":402},"): suggest route 4 (full review) but let the user choose.",{"type":43,"tag":152,"props":404,"children":405},{},[406,411],{"type":43,"tag":156,"props":407,"children":408},{},[409],{"type":48,"value":410},"\"review\" without \"post\" or \"cluster\"",{"type":48,"value":412},": route 1.",{"type":43,"tag":152,"props":414,"children":415},{},[416,421],{"type":43,"tag":156,"props":417,"children":418},{},[419],{"type":48,"value":420},"All routes start with fetch.",{"type":48,"value":422}," The fetch workflow produces a context artifact consumed by all downstream workflows.",{"type":43,"tag":143,"props":424,"children":426},{"id":425},"forge-detection",[427],{"type":48,"value":428},"Forge detection",{"type":43,"tag":44,"props":430,"children":431},{},[432,434,440],{"type":48,"value":433},"Currently GitHub only. Detect from URL pattern or ",{"type":43,"tag":64,"props":435,"children":437},{"className":436},[],[438],{"type":48,"value":439},"gh",{"type":48,"value":441}," CLI availability.",{"type":43,"tag":44,"props":443,"children":444},{},[445,447,453,455,461,463,469],{"type":48,"value":446},"When GitLab support is added: ",{"type":43,"tag":64,"props":448,"children":450},{"className":449},[],[451],{"type":48,"value":452},"fetch-gitlab.md",{"type":48,"value":454}," and ",{"type":43,"tag":64,"props":456,"children":458},{"className":457},[],[459],{"type":48,"value":460},"post-to-gitlab.md",{"type":48,"value":462}," will slot into the same pipeline. The analyze workflow (",{"type":43,"tag":64,"props":464,"children":466},{"className":465},[],[467],{"type":48,"value":468},"review-code.md",{"type":48,"value":470},") is forge-agnostic and needs no changes.",{"type":43,"tag":44,"props":472,"children":473},{},[474],{"type":48,"value":475},"\u003Cartifact_contracts>",{"type":43,"tag":136,"props":477,"children":479},{"id":478},"context-artifact-fetch-analyze-cluster-test",[480],{"type":48,"value":481},"Context artifact (fetch → analyze \u002F cluster test)",{"type":43,"tag":44,"props":483,"children":484},{},[485],{"type":48,"value":486},"Produced by the fetch workflow, consumed by all downstream workflows:",{"type":43,"tag":56,"props":488,"children":492},{"className":489,"code":491,"language":48},[490],"language-text","context artifact\n├── forge: \"github\"\n├── repo: \"owner\u002Frepo\"\n├── pr_number: 123\n├── head_sha: \"abc123...\"\n├── base_ref, head_ref, title, body, author, state, url\n├── labels: [...]\n├── files: [{path, additions, deletions}, ...]\n├── total_additions, total_deletions\n├── diff: \"full unified diff\"\n├── linked_issues: [{number, title, body, labels, state}, ...]\n├── jira_keys: [\"RHIDP-1234\", ...]\n├── existing_comments: [{user, path, line, body, created_at}, ...]\n├── existing_reviews: [{user, state, body}, ...]\n└── ci_status: \"pass\" | \"fail\" | \"pending\" | \"unknown\"\n",[493],{"type":43,"tag":64,"props":494,"children":495},{"__ignoreMap":61},[496],{"type":48,"value":491},{"type":43,"tag":136,"props":498,"children":500},{"id":499},"findings-artifact-analyze-post",[501],{"type":48,"value":502},"Findings artifact (analyze → post)",{"type":43,"tag":44,"props":504,"children":505},{},[506],{"type":48,"value":507},"Produced by the analysis workflow, consumed by the posting workflow:",{"type":43,"tag":56,"props":509,"children":512},{"className":510,"code":511,"language":48},[490],"findings artifact\n├── pr: {repo, number, head_sha}\n├── summary: \"top-level review text\"\n├── event: \"COMMENT\" | \"APPROVE\" | \"REQUEST_CHANGES\"\n└── findings[]\n    ├── path, line, start_line\n    ├── type: \"suggestion\" | \"question\" | \"observation\"\n    └── body: \"comment text\"\n",[513],{"type":43,"tag":64,"props":514,"children":515},{"__ignoreMap":61},[516],{"type":48,"value":511},{"type":43,"tag":44,"props":518,"children":519},{},[520],{"type":48,"value":521},"\u003C\u002Fartifact_contracts>",{"type":43,"tag":44,"props":523,"children":524},{},[525],{"type":48,"value":526},"\u003Creference_index>",{"type":43,"tag":226,"props":528,"children":529},{},[530,556],{"type":43,"tag":230,"props":531,"children":532},{},[533],{"type":43,"tag":234,"props":534,"children":535},{},[536,541,546,551],{"type":43,"tag":238,"props":537,"children":538},{},[539],{"type":48,"value":540},"Reference",{"type":43,"tag":238,"props":542,"children":543},{},[544],{"type":48,"value":545},"Purpose",{"type":43,"tag":238,"props":547,"children":548},{},[549],{"type":48,"value":550},"Load when...",{"type":43,"tag":238,"props":552,"children":553},{},[554],{"type":48,"value":555},"Path",{"type":43,"tag":249,"props":557,"children":558},{},[559,591,623,652],{"type":43,"tag":234,"props":560,"children":561},{},[562,567,572,582],{"type":43,"tag":256,"props":563,"children":564},{},[565],{"type":48,"value":566},"review-perspectives",{"type":43,"tag":256,"props":568,"children":569},{},[570],{"type":48,"value":571},"Review perspective examples and signal hints",{"type":43,"tag":256,"props":573,"children":574},{},[575,577],{"type":48,"value":576},"Running ",{"type":43,"tag":64,"props":578,"children":580},{"className":579},[],[581],{"type":48,"value":468},{"type":43,"tag":256,"props":583,"children":584},{},[585],{"type":43,"tag":64,"props":586,"children":588},{"className":587},[],[589],{"type":48,"value":590},"references\u002Freview-perspectives.md",{"type":43,"tag":234,"props":592,"children":593},{},[594,599,604,614],{"type":43,"tag":256,"props":595,"children":596},{},[597],{"type":48,"value":598},"operator-pr-images",{"type":43,"tag":256,"props":600,"children":601},{},[602],{"type":48,"value":603},"CI image extraction and validation",{"type":43,"tag":256,"props":605,"children":606},{},[607,608],{"type":48,"value":576},{"type":43,"tag":64,"props":609,"children":611},{"className":610},[],[612],{"type":48,"value":613},"review-operator-pr.md",{"type":43,"tag":256,"props":615,"children":616},{},[617],{"type":43,"tag":64,"props":618,"children":620},{"className":619},[],[621],{"type":48,"value":622},"references\u002Foperator-pr-images.md",{"type":43,"tag":234,"props":624,"children":625},{},[626,631,636,641],{"type":43,"tag":256,"props":627,"children":628},{},[629],{"type":48,"value":630},"github-reference",{"type":43,"tag":256,"props":632,"children":633},{},[634],{"type":48,"value":635},"gh CLI patterns, PR queries",{"type":43,"tag":256,"props":637,"children":638},{},[639],{"type":48,"value":640},"Running any GitHub workflow",{"type":43,"tag":256,"props":642,"children":643},{},[644,650],{"type":43,"tag":64,"props":645,"children":647},{"className":646},[],[648],{"type":48,"value":649},"..\u002Frhdh\u002Freferences\u002Fgithub-reference.md",{"type":48,"value":651}," (if available)",{"type":43,"tag":234,"props":653,"children":654},{},[655,660,665,670],{"type":43,"tag":256,"props":656,"children":657},{},[658],{"type":48,"value":659},"rhdh-repos",{"type":43,"tag":256,"props":661,"children":662},{},[663],{"type":48,"value":664},"RHDH ecosystem repository map",{"type":43,"tag":256,"props":666,"children":667},{},[668],{"type":48,"value":669},"Cluster testing",{"type":43,"tag":256,"props":671,"children":672},{},[673,679],{"type":43,"tag":64,"props":674,"children":676},{"className":675},[],[677],{"type":48,"value":678},"..\u002Frhdh\u002Freferences\u002Frhdh-repos.md",{"type":48,"value":651},{"type":43,"tag":44,"props":681,"children":682},{},[683],{"type":48,"value":684},"\u003C\u002Freference_index>",{"type":43,"tag":44,"props":686,"children":687},{},[688],{"type":48,"value":689},"\u003Cskills_index>",{"type":43,"tag":226,"props":691,"children":692},{},[693,712],{"type":43,"tag":230,"props":694,"children":695},{},[696],{"type":43,"tag":234,"props":697,"children":698},{},[699,704,708],{"type":43,"tag":238,"props":700,"children":701},{},[702],{"type":48,"value":703},"Skill",{"type":43,"tag":238,"props":705,"children":706},{},[707],{"type":48,"value":545},{"type":43,"tag":238,"props":709,"children":710},{},[711],{"type":48,"value":555},{"type":43,"tag":249,"props":713,"children":714},{},[715],{"type":43,"tag":234,"props":716,"children":717},{},[718,723,728],{"type":43,"tag":256,"props":719,"children":720},{},[721],{"type":48,"value":722},"rhdh",{"type":43,"tag":256,"props":724,"children":725},{},[726],{"type":48,"value":727},"Orchestrator, environment status, activity tracking",{"type":43,"tag":256,"props":729,"children":730},{},[731],{"type":43,"tag":64,"props":732,"children":734},{"className":733},[],[735],{"type":48,"value":736},"..\u002Frhdh\u002FSKILL.md",{"type":43,"tag":44,"props":738,"children":739},{},[740],{"type":48,"value":741},"\u003C\u002Fskills_index>",{"type":43,"tag":44,"props":743,"children":744},{},[745],{"type":48,"value":746},"\u003Csuccess_criteria>",{"type":43,"tag":143,"props":748,"children":750},{"id":749},"code-review-1",[751],{"type":48,"value":752},"Code review",{"type":43,"tag":754,"props":755,"children":758},"ul",{"className":756},[757],"contains-task-list",[759,772,781,790,799,808],{"type":43,"tag":152,"props":760,"children":763},{"className":761},[762],"task-list-item",[764,770],{"type":43,"tag":765,"props":766,"children":769},"input",{"disabled":767,"type":768},true,"checkbox",[],{"type":48,"value":771}," PR context fetched (metadata, diff, linked issues, existing comments)",{"type":43,"tag":152,"props":773,"children":775},{"className":774},[762],[776,779],{"type":43,"tag":765,"props":777,"children":778},{"disabled":767,"type":768},[],{"type":48,"value":780}," Review perspectives chosen based on PR content",{"type":43,"tag":152,"props":782,"children":784},{"className":783},[762],[785,788],{"type":43,"tag":765,"props":786,"children":787},{"disabled":767,"type":768},[],{"type":48,"value":789}," Findings verified against actual code at HEAD",{"type":43,"tag":152,"props":791,"children":793},{"className":792},[762],[794,797],{"type":43,"tag":765,"props":795,"children":796},{"disabled":767,"type":768},[],{"type":48,"value":798}," False positives dropped with reasoning shown",{"type":43,"tag":152,"props":800,"children":802},{"className":801},[762],[803,806],{"type":43,"tag":765,"props":804,"children":805},{"disabled":767,"type":768},[],{"type":48,"value":807}," Review draft presented to user with event type choice",{"type":43,"tag":152,"props":809,"children":811},{"className":810},[762],[812,815],{"type":43,"tag":765,"props":813,"children":814},{"disabled":767,"type":768},[],{"type":48,"value":816}," Review posted to forge (if posting route selected)",{"type":43,"tag":143,"props":818,"children":820},{"id":819},"cluster-testing",[821],{"type":48,"value":669},{"type":43,"tag":44,"props":823,"children":824},{},[825,827,832,834,839],{"type":48,"value":826},"See ",{"type":43,"tag":64,"props":828,"children":830},{"className":829},[],[831],{"type":48,"value":331},{"type":48,"value":833}," ",{"type":43,"tag":64,"props":835,"children":837},{"className":836},[],[838],{"type":48,"value":746},{"type":48,"value":840}," for the full checklist.",{"type":43,"tag":143,"props":842,"children":844},{"id":843},"full-review",[845],{"type":48,"value":210},{"type":43,"tag":44,"props":847,"children":848},{},[849],{"type":48,"value":850},"All code review criteria + all cluster testing criteria.",{"type":43,"tag":44,"props":852,"children":853},{},[854],{"type":48,"value":855},"\u003C\u002Fsuccess_criteria>",{"type":43,"tag":857,"props":858,"children":859},"style",{},[860],{"type":48,"value":861},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":863,"total":1032},[864,878,892,911,925,942,953,972,984,997,1009,1021],{"slug":865,"name":865,"fn":866,"description":867,"org":868,"tags":869,"stars":26,"repoUrl":27,"updatedAt":877},"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},[870,873,876],{"name":871,"slug":872,"type":16},"Agents","agents",{"name":874,"slug":875,"type":16},"Code Analysis","code-analysis",{"name":24,"slug":25,"type":16},"2026-07-16T06:03:24.758348",{"slug":879,"name":879,"fn":880,"description":881,"org":882,"tags":883,"stars":26,"repoUrl":27,"updatedAt":891},"backstage-upgrade","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},[884,885,888],{"name":24,"slug":25,"type":16},{"name":886,"slug":887,"type":16},"Maintenance","maintenance",{"name":889,"slug":890,"type":16},"Migration","migration","2026-07-16T06:03:24.067361",{"slug":893,"name":893,"fn":894,"description":895,"org":896,"tags":897,"stars":26,"repoUrl":27,"updatedAt":910},"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},[898,901,904,907],{"name":899,"slug":900,"type":16},"Automation","automation",{"name":902,"slug":903,"type":16},"Configuration","configuration",{"name":905,"slug":906,"type":16},"Containers","containers",{"name":908,"slug":909,"type":16},"Deployment","deployment","2026-07-16T06:03:27.784453",{"slug":912,"name":912,"fn":913,"description":914,"org":915,"tags":916,"stars":26,"repoUrl":27,"updatedAt":924},"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},[917,920,921],{"name":918,"slug":919,"type":16},"Debugging","debugging",{"name":21,"slug":22,"type":16},{"name":922,"slug":923,"type":16},"Testing","testing","2026-07-29T06:00:33.054762",{"slug":926,"name":926,"fn":927,"description":928,"org":929,"tags":930,"stars":26,"repoUrl":27,"updatedAt":941},"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},[931,934,935,938],{"name":932,"slug":933,"type":16},"Compliance","compliance",{"name":24,"slug":25,"type":16},{"name":936,"slug":937,"type":16},"Reporting","reporting",{"name":939,"slug":940,"type":16},"Security","security","2026-08-01T05:41:57.852801",{"slug":943,"name":943,"fn":944,"description":945,"org":946,"tags":947,"stars":26,"repoUrl":27,"updatedAt":952},"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},[948,949],{"name":908,"slug":909,"type":16},{"name":950,"slug":951,"type":16},"Plugin Development","plugin-development","2026-07-16T06:02:28.983498",{"slug":954,"name":954,"fn":955,"description":956,"org":957,"tags":958,"stars":26,"repoUrl":27,"updatedAt":971},"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},[959,962,965,968],{"name":960,"slug":961,"type":16},"Auth","auth",{"name":963,"slug":964,"type":16},"Jira","jira",{"name":966,"slug":967,"type":16},"MCP","mcp",{"name":969,"slug":970,"type":16},"OAuth","oauth","2026-07-29T06:00:33.525179",{"slug":973,"name":973,"fn":974,"description":975,"org":976,"tags":977,"stars":26,"repoUrl":27,"updatedAt":983},"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},[978,979,980],{"name":899,"slug":900,"type":16},{"name":908,"slug":909,"type":16},{"name":981,"slug":982,"type":16},"GitLab","gitlab","2026-07-16T06:00:19.516231",{"slug":985,"name":985,"fn":986,"description":987,"org":988,"tags":989,"stars":26,"repoUrl":27,"updatedAt":996},"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},[990,991,994,995],{"name":899,"slug":900,"type":16},{"name":992,"slug":993,"type":16},"CI\u002FCD","ci-cd",{"name":908,"slug":909,"type":16},{"name":24,"slug":25,"type":16},"2026-07-16T06:03:28.123118",{"slug":998,"name":998,"fn":999,"description":1000,"org":1001,"tags":1002,"stars":26,"repoUrl":27,"updatedAt":1008},"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},[1003,1004,1005],{"name":932,"slug":933,"type":16},{"name":886,"slug":887,"type":16},{"name":1006,"slug":1007,"type":16},"Operations","operations","2026-07-16T06:03:19.344038",{"slug":1010,"name":1010,"fn":1011,"description":1012,"org":1013,"tags":1014,"stars":26,"repoUrl":27,"updatedAt":1020},"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},[1015,1016,1019],{"name":24,"slug":25,"type":16},{"name":1017,"slug":1018,"type":16},"Frontend","frontend",{"name":889,"slug":890,"type":16},"2026-07-16T06:03:27.078987",{"slug":1022,"name":1022,"fn":1023,"description":1024,"org":1025,"tags":1026,"stars":26,"repoUrl":27,"updatedAt":1031},"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},[1027,1028,1029,1030],{"name":899,"slug":900,"type":16},{"name":18,"slug":19,"type":16},{"name":908,"slug":909,"type":16},{"name":24,"slug":25,"type":16},"2026-07-16T06:03:20.380044",24,{"items":1034,"total":1032},[1035,1041,1047,1054,1060,1067,1072],{"slug":865,"name":865,"fn":866,"description":867,"org":1036,"tags":1037,"stars":26,"repoUrl":27,"updatedAt":877},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1038,1039,1040],{"name":871,"slug":872,"type":16},{"name":874,"slug":875,"type":16},{"name":24,"slug":25,"type":16},{"slug":879,"name":879,"fn":880,"description":881,"org":1042,"tags":1043,"stars":26,"repoUrl":27,"updatedAt":891},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1044,1045,1046],{"name":24,"slug":25,"type":16},{"name":886,"slug":887,"type":16},{"name":889,"slug":890,"type":16},{"slug":893,"name":893,"fn":894,"description":895,"org":1048,"tags":1049,"stars":26,"repoUrl":27,"updatedAt":910},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1050,1051,1052,1053],{"name":899,"slug":900,"type":16},{"name":902,"slug":903,"type":16},{"name":905,"slug":906,"type":16},{"name":908,"slug":909,"type":16},{"slug":912,"name":912,"fn":913,"description":914,"org":1055,"tags":1056,"stars":26,"repoUrl":27,"updatedAt":924},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1057,1058,1059],{"name":918,"slug":919,"type":16},{"name":21,"slug":22,"type":16},{"name":922,"slug":923,"type":16},{"slug":926,"name":926,"fn":927,"description":928,"org":1061,"tags":1062,"stars":26,"repoUrl":27,"updatedAt":941},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1063,1064,1065,1066],{"name":932,"slug":933,"type":16},{"name":24,"slug":25,"type":16},{"name":936,"slug":937,"type":16},{"name":939,"slug":940,"type":16},{"slug":943,"name":943,"fn":944,"description":945,"org":1068,"tags":1069,"stars":26,"repoUrl":27,"updatedAt":952},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1070,1071],{"name":908,"slug":909,"type":16},{"name":950,"slug":951,"type":16},{"slug":954,"name":954,"fn":955,"description":956,"org":1073,"tags":1074,"stars":26,"repoUrl":27,"updatedAt":971},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1075,1076,1077,1078],{"name":960,"slug":961,"type":16},{"name":963,"slug":964,"type":16},{"name":966,"slug":967,"type":16},{"name":969,"slug":970,"type":16}]