[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-red-hat-developer-base-images-and-rpms":3,"mdc--t02f17-key":37,"related-repo-red-hat-developer-base-images-and-rpms":2307,"related-org-red-hat-developer-base-images-and-rpms":2410},{"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},"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},"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},"Containers","containers","tag",{"name":18,"slug":19,"type":16},"Configuration","configuration",{"name":21,"slug":22,"type":16},"Automation","automation",{"name":24,"slug":25,"type":16},"Deployment","deployment",15,"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill","2026-07-16T06:03:27.784453",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\u002Fbase-images-and-rpms","---\nname: base-images-and-rpms\ndescription: >-\n  Updates base images with updateBaseImages.sh and regenerates rpms.lock.yaml with\n  rpm-lockfile-prototype in redhat-developer\u002Frhdh, rhdh-must-gather, and rhdh-operator.\n  Use --analyze for read-only Containerfile\u002FDockerfile scan (current vs latest tags, UBI skew).\n  Use for weekly upstream maintenance, UBI\u002FRHEL base image bumps, RPM lockfile refresh,\n  base-images-and-rpms, main, release-*, or analyzing base images before updating.\n---\n\n# Base images and RPMs\n\n## Goal\n\nRefresh **base images** and **RPM lockfiles** in the three upstream GitHub repos:\n\n| Repo | Node \u002F Go source | RPM containerfile |\n|------|------------------|-------------------|\n| rhdh | `build\u002Fcontainerfiles\u002FContainerfile` or `docker\u002FDockerfile` (release-1.9) | `build\u002Fcontainerfiles\u002FContainerfile` or `.rhdh\u002Fdocker\u002FDockerfile` |\n| rhdh-operator | `go.mod` aligned with `ubi9\u002Fgo-toolset` on **main** only | `.rhdh\u002Fdocker\u002FDockerfile` |\n| rhdh-must-gather | — | `Containerfile` |\n\nUpstream helper scripts live in GitLab midstream [rhidp\u002Frhdh](https:\u002F\u002Fgitlab.cee.redhat.com\u002Frhidp\u002Frhdh) on branch `rhdh-1-rhel-9` (see [updateBaseImages.sh](https:\u002F\u002Fgitlab.cee.redhat.com\u002Frhidp\u002Frhdh\u002F-\u002Fblob\u002Frhdh-1-rhel-9\u002Fbuild\u002Fscripts\u002FupdateBaseImages.sh)).\n\n## Prerequisites\n\n- `jq`, `skopeo`, `curl`, `git`\n- `podman` for rhdh node header version detection (see `.nvm\u002Freleases\u002FREADME.adoc`)\n- `gh` when `updateBaseImages.sh` opens PRs (`--pr`, the default)\n- `python3` and `pip` when `rpm-lockfile-prototype` is not already installed\n- Registry auth for base image queries: `docker login registry.redhat.io` (or `skopeo login`)\n\nInstall `rpm-lockfile-prototype` manually when needed:\n\n```bash\npython3 -m pip install --user https:\u002F\u002Fgithub.com\u002Fkonflux-ci\u002Frpm-lockfile-prototype\u002Farchive\u002Frefs\u002Fheads\u002Fmain.zip 2>\u002Fdev\u002Fnull\n```\n\nOn Fedora\u002FRHEL hosts, `dnf install podman skopeo python3-dnf` may also be required for lockfile generation.\n\n## Branch mapping\n\nAccepted `-b` values: `main` or any `release-*` branch (e.g. `release-1.9`, `release-1.10`, `release-2.1`).\n\n| GitHub branch (`-b`) | GitLab scripts branch (`-sb` for `updateBaseImages.sh`) |\n|----------------------|---------------------------------------------------------|\n| `main` | `rhdh-1-rhel-9` |\n| `release-X.Y` | `rhdh-X.Y-rhel-9` |\n\nVerify the target branch exists in each repo before running.\n\n## Run the bundled script\n\n**Execute** [scripts\u002Fbase-images-and-rpms.sh](scripts\u002Fbase-images-and-rpms.sh); do not reimplement the workflow inline.\n\n```bash\nSKILL=skills\u002Fbase-images-and-rpms   # under 1-rhdh-skill checkout\nchmod +x \"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\"\n\n# All three repos under a parent directory\n\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" -b release-1.10 --parent-dir ~\u002FRHDH\n\n# Explicit paths and on-disk tools\n\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" -b main \\\n  --update-base-images-script ~\u002FRHDH\u002Frhdh\u002Fbuild\u002Fscripts\u002FupdateBaseImages.sh \\\n  --rpm-lockfile-prototype ~\u002F.local\u002Fbin\u002Frpm-lockfile-prototype \\\n  ~\u002FRHDH\u002Frhdh \\\n  ~\u002FRHDH\u002Frhdh-operator \\\n  ~\u002FRHDH\u002Frhdh-must-gather\n```\n\n### Flags\n\n| Flag | Purpose |\n|------|---------|\n| `-b`, `--branch` | **Required.** `main` or `release-*` |\n| `--update-base-images-script PATH` | Use local `updateBaseImages.sh` (expects `createPR.sh` alongside; fetches if missing) |\n| `--rpm-lockfile-prototype PATH` | Use local binary; otherwise `~\u002F.local\u002Fbin\u002Frpm-lockfile-prototype` or pip install |\n| `--parent-dir PATH` | Auto-discover `1-rhdh`, `1-rhdh-operator`, `1-must-gather` (and common aliases) |\n| `REPO_DIR ...` | Explicit repo checkouts |\n| `--skip-base` \u002F `--skip-rpm` | Run only one half of the workflow |\n| `--dirty` | Allow dirty trees for `updateBaseImages.sh` |\n| `--push` | Let `updateBaseImages.sh` push when branch policy allows (still uses `--pr` fallback) |\n| `--no-pr` | Commit locally with `--no-push` only |\n| `--dry-run` | Print commands without executing |\n| `--analyze` | Read-only scan via `analyze-base-images.sh` (no `-b` required; defaults scripts to `main`) |\n\n**Default:** base image updates use `--pr --no-push` (local commits + PR creation, no push). RPM lockfile and node header changes are committed and **pushed to the same open `chore\u002Fautomated-update-base-images-*` PR branch** when one exists; otherwise a `chore\u002Fautomated-update-rpm-lockfile\u002F\u003Cbranch>` PR is opened.\n\n## Analyze without updating\n\nUse `--analyze` to scan Containerfiles and Dockerfiles without checkout, commits, or registry writes:\n\n```bash\n\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" --analyze --parent-dir ~\u002FRHDH\n\n# Optional: match GitLab scripts branch to a release line\n\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" --analyze -b release-1.10 --parent-dir ~\u002FRHDH\n```\n\nOr run the analyzer directly:\n\n```bash\n\"${SKILL}\u002Fscripts\u002Fanalyze-base-images.sh\" \\\n  -s \u002Fpath\u002Fto\u002Frhidp\u002Frhdh\u002Fbuild\u002Fscripts \\\n  -w ~\u002FRHDH\u002Frhdh \\\n  -w ~\u002FRHDH\u002Frhdh-operator\n```\n\nThe analyzer reports **current vs latest** per `FROM` line, flags malformed tags, and warns on **UBI minor skew** within a file. Tags must be `major.minor-buildid` or `x.y.z-buildid`; bare numeric registry tags are ignored (same rules as `updateBaseImages.sh`). Requires `skopeo login registry.redhat.io`.\n\nEach registry `FROM` needs a comment URL on the line above:\n\n```containerfile\n# https:\u002F\u002Fregistry.access.redhat.com\u002Fubi9\u002Fnodejs-24\nFROM registry.access.redhat.com\u002Fubi9\u002Fnodejs-24:9.8-...@sha256:... AS skeleton\n```\n\nFor **rhdh**, paths under `e2e-tests\u002F` and `.ci\u002F` are excluded from scans.\n\n## Workflow\n\n1. Pick branch (`-b`).\n2. Ensure local clones are fetched and clean enough for `updateBaseImages.sh` (or pass `--dirty`).\n3. Run the script on all three repos.\n4. Review open PRs — each should include base image, `rpms.lock.yaml`, and (for rhdh) node header updates when applicable.\n5. Human merges PRs; do **not** push directly to protected branches without review.\n\n## What each step does\n\n### Base images (`updateBaseImages.sh`)\n\nMirrors [weekly-maintenance.sh](https:\u002F\u002Fgitlab.cee.redhat.com\u002Frhidp\u002Frhdh\u002F-\u002Fblob\u002Frhdh-1-rhel-9\u002Fbuild\u002Fci\u002Fweekly-maintenance.sh) upstream section:\n\n```bash\nupdateBaseImages.sh -w REPO_ROOT -b BRANCH -sb SCRIPTS_BRANCH -maxdepth 5 --pr\n```\n\n`-maxdepth 5` reaches `.rhdh\u002Fdocker\u002FDockerfile` in the operator repo as well as top-level containerfiles.\n\n`updateBaseImages.sh` calls `createPr()` once per image bump; upstream `createPR.sh` runs `gh pr view --web` on **every** call, which re-opens the same PR URL. This skill sets `GITLAB_PIPELINE=true` during `updateBaseImages.sh` to suppress that, then opens each repo's PR once in the browser when `--pr` is in effect.\n\n### RPM lockfiles (`rpm-lockfile-prototype`)\n\nMatches each repo's GitHub Action, then commits and pushes to the automation PR:\n\n```bash\nrpm-lockfile-prototype -f CONTAINERFILE rpms.in.yaml\ngit add rpms.lock.yaml\ngit commit -s -m \"chore: update rpms.lock.yaml [skip-build]\"\ngit push origin \u003Cchore\u002Fautomated-update-base-images-*>   # same PR as base images\n```\n\nWhen no base-images PR exists (e.g. `--skip-base`), the script uses `chore\u002Fautomated-update-rpm-lockfile\u002F\u003Cbranch>` and opens a PR.\n\n### Node headers (rhdh only)\n\nWhen the `ubi9\u002Fnodejs-*` builder image in `build\u002Fcontainerfiles\u002FContainerfile` ships a different Node version than `.nvmrc` \u002F `.nvm\u002Freleases\u002F`, the script:\n\n1. Reads `node --version` from the updated builder image (`podman`\u002F`docker`)\n2. Downloads `https:\u002F\u002Fnodejs.org\u002Fdist\u002F\u003Cversion>\u002Fnode-\u003Cversion>-headers.tar.gz` into `.nvm\u002Freleases\u002F`\n3. Updates `.nvmrc` (version without `v` prefix) and `.nvm\u002Freleases\u002FREADME.adoc` (date + version)\n4. Removes stale `node-v*-headers.tar.gz` files and pushes to the same automation PR\n\nSee [rhdh `.nvm\u002Freleases\u002FREADME.adoc`](https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh\u002Fblob\u002Fmain\u002F.nvm\u002Freleases\u002FREADME.adoc). On **release-1.9**, headers come from `docker\u002FDockerfile` (`ubi9\u002Fnodejs-22`), not Node 24.\n\n### Go toolchain (rhdh-operator, main only)\n\nOn **main** only (not `release-*`), after base image bumps, reads `go version` from the `ubi9\u002Fgo-toolset` image in `.rhdh\u002Fdocker\u002FDockerfile` and updates `go.mod`:\n\n```text\ngo 1.26.0\ntoolchain go1.26.4\n```\n\n## Anti-patterns\n\n- Pushing without human review.\n- Running on a branch that does not exist in one of the three repos.\n- Omitting `registry.redhat.io` login before base image updates.\n- Committing `rpms.lock.yaml` without checking the base image minor (e.g. UBI `9.8`) still matches `rpms.in.yaml` repo URLs.\n\n## Additional resources\n\n- Per-repo notes: [references\u002Frepos.md](references\u002Frepos.md)\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,57,78,218,251,257,383,395,454,467,473,522,604,609,615,632,894,901,1231,1272,1278,1290,1391,1396,1477,1534,1546,1571,1597,1603,1666,1672,1684,1698,1757,1775,1836,1848,1853,1971,1990,1996,2031,2119,2159,2165,2212,2222,2228,2282,2288,2301],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Base images and RPMs",{"type":43,"tag":51,"props":52,"children":54},"h2",{"id":53},"goal",[55],{"type":48,"value":56},"Goal",{"type":43,"tag":58,"props":59,"children":60},"p",{},[61,63,69,71,76],{"type":48,"value":62},"Refresh ",{"type":43,"tag":64,"props":65,"children":66},"strong",{},[67],{"type":48,"value":68},"base images",{"type":48,"value":70}," and ",{"type":43,"tag":64,"props":72,"children":73},{},[74],{"type":48,"value":75},"RPM lockfiles",{"type":48,"value":77}," in the three upstream GitHub repos:",{"type":43,"tag":79,"props":80,"children":81},"table",{},[82,106],{"type":43,"tag":83,"props":84,"children":85},"thead",{},[86],{"type":43,"tag":87,"props":88,"children":89},"tr",{},[90,96,101],{"type":43,"tag":91,"props":92,"children":93},"th",{},[94],{"type":48,"value":95},"Repo",{"type":43,"tag":91,"props":97,"children":98},{},[99],{"type":48,"value":100},"Node \u002F Go source",{"type":43,"tag":91,"props":102,"children":103},{},[104],{"type":48,"value":105},"RPM containerfile",{"type":43,"tag":107,"props":108,"children":109},"tbody",{},[110,154,196],{"type":43,"tag":87,"props":111,"children":112},{},[113,119,139],{"type":43,"tag":114,"props":115,"children":116},"td",{},[117],{"type":48,"value":118},"rhdh",{"type":43,"tag":114,"props":120,"children":121},{},[122,129,131,137],{"type":43,"tag":123,"props":124,"children":126},"code",{"className":125},[],[127],{"type":48,"value":128},"build\u002Fcontainerfiles\u002FContainerfile",{"type":48,"value":130}," or ",{"type":43,"tag":123,"props":132,"children":134},{"className":133},[],[135],{"type":48,"value":136},"docker\u002FDockerfile",{"type":48,"value":138}," (release-1.9)",{"type":43,"tag":114,"props":140,"children":141},{},[142,147,148],{"type":43,"tag":123,"props":143,"children":145},{"className":144},[],[146],{"type":48,"value":128},{"type":48,"value":130},{"type":43,"tag":123,"props":149,"children":151},{"className":150},[],[152],{"type":48,"value":153},".rhdh\u002Fdocker\u002FDockerfile",{"type":43,"tag":87,"props":155,"children":156},{},[157,162,188],{"type":43,"tag":114,"props":158,"children":159},{},[160],{"type":48,"value":161},"rhdh-operator",{"type":43,"tag":114,"props":163,"children":164},{},[165,171,173,179,181,186],{"type":43,"tag":123,"props":166,"children":168},{"className":167},[],[169],{"type":48,"value":170},"go.mod",{"type":48,"value":172}," aligned with ",{"type":43,"tag":123,"props":174,"children":176},{"className":175},[],[177],{"type":48,"value":178},"ubi9\u002Fgo-toolset",{"type":48,"value":180}," on ",{"type":43,"tag":64,"props":182,"children":183},{},[184],{"type":48,"value":185},"main",{"type":48,"value":187}," only",{"type":43,"tag":114,"props":189,"children":190},{},[191],{"type":43,"tag":123,"props":192,"children":194},{"className":193},[],[195],{"type":48,"value":153},{"type":43,"tag":87,"props":197,"children":198},{},[199,204,209],{"type":43,"tag":114,"props":200,"children":201},{},[202],{"type":48,"value":203},"rhdh-must-gather",{"type":43,"tag":114,"props":205,"children":206},{},[207],{"type":48,"value":208},"—",{"type":43,"tag":114,"props":210,"children":211},{},[212],{"type":43,"tag":123,"props":213,"children":215},{"className":214},[],[216],{"type":48,"value":217},"Containerfile",{"type":43,"tag":58,"props":219,"children":220},{},[221,223,232,234,240,242,249],{"type":48,"value":222},"Upstream helper scripts live in GitLab midstream ",{"type":43,"tag":224,"props":225,"children":229},"a",{"href":226,"rel":227},"https:\u002F\u002Fgitlab.cee.redhat.com\u002Frhidp\u002Frhdh",[228],"nofollow",[230],{"type":48,"value":231},"rhidp\u002Frhdh",{"type":48,"value":233}," on branch ",{"type":43,"tag":123,"props":235,"children":237},{"className":236},[],[238],{"type":48,"value":239},"rhdh-1-rhel-9",{"type":48,"value":241}," (see ",{"type":43,"tag":224,"props":243,"children":246},{"href":244,"rel":245},"https:\u002F\u002Fgitlab.cee.redhat.com\u002Frhidp\u002Frhdh\u002F-\u002Fblob\u002Frhdh-1-rhel-9\u002Fbuild\u002Fscripts\u002FupdateBaseImages.sh",[228],[247],{"type":48,"value":248},"updateBaseImages.sh",{"type":48,"value":250},").",{"type":43,"tag":51,"props":252,"children":254},{"id":253},"prerequisites",[255],{"type":48,"value":256},"Prerequisites",{"type":43,"tag":258,"props":259,"children":260},"ul",{},[261,293,312,338,363],{"type":43,"tag":262,"props":263,"children":264},"li",{},[265,271,273,279,280,286,287],{"type":43,"tag":123,"props":266,"children":268},{"className":267},[],[269],{"type":48,"value":270},"jq",{"type":48,"value":272},", ",{"type":43,"tag":123,"props":274,"children":276},{"className":275},[],[277],{"type":48,"value":278},"skopeo",{"type":48,"value":272},{"type":43,"tag":123,"props":281,"children":283},{"className":282},[],[284],{"type":48,"value":285},"curl",{"type":48,"value":272},{"type":43,"tag":123,"props":288,"children":290},{"className":289},[],[291],{"type":48,"value":292},"git",{"type":43,"tag":262,"props":294,"children":295},{},[296,302,304,310],{"type":43,"tag":123,"props":297,"children":299},{"className":298},[],[300],{"type":48,"value":301},"podman",{"type":48,"value":303}," for rhdh node header version detection (see ",{"type":43,"tag":123,"props":305,"children":307},{"className":306},[],[308],{"type":48,"value":309},".nvm\u002Freleases\u002FREADME.adoc",{"type":48,"value":311},")",{"type":43,"tag":262,"props":313,"children":314},{},[315,321,323,328,330,336],{"type":43,"tag":123,"props":316,"children":318},{"className":317},[],[319],{"type":48,"value":320},"gh",{"type":48,"value":322}," when ",{"type":43,"tag":123,"props":324,"children":326},{"className":325},[],[327],{"type":48,"value":248},{"type":48,"value":329}," opens PRs (",{"type":43,"tag":123,"props":331,"children":333},{"className":332},[],[334],{"type":48,"value":335},"--pr",{"type":48,"value":337},", the default)",{"type":43,"tag":262,"props":339,"children":340},{},[341,347,348,354,355,361],{"type":43,"tag":123,"props":342,"children":344},{"className":343},[],[345],{"type":48,"value":346},"python3",{"type":48,"value":70},{"type":43,"tag":123,"props":349,"children":351},{"className":350},[],[352],{"type":48,"value":353},"pip",{"type":48,"value":322},{"type":43,"tag":123,"props":356,"children":358},{"className":357},[],[359],{"type":48,"value":360},"rpm-lockfile-prototype",{"type":48,"value":362}," is not already installed",{"type":43,"tag":262,"props":364,"children":365},{},[366,368,374,376,382],{"type":48,"value":367},"Registry auth for base image queries: ",{"type":43,"tag":123,"props":369,"children":371},{"className":370},[],[372],{"type":48,"value":373},"docker login registry.redhat.io",{"type":48,"value":375}," (or ",{"type":43,"tag":123,"props":377,"children":379},{"className":378},[],[380],{"type":48,"value":381},"skopeo login",{"type":48,"value":311},{"type":43,"tag":58,"props":384,"children":385},{},[386,388,393],{"type":48,"value":387},"Install ",{"type":43,"tag":123,"props":389,"children":391},{"className":390},[],[392],{"type":48,"value":360},{"type":48,"value":394}," manually when needed:",{"type":43,"tag":396,"props":397,"children":402},"pre",{"className":398,"code":399,"language":400,"meta":401,"style":401},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","python3 -m pip install --user https:\u002F\u002Fgithub.com\u002Fkonflux-ci\u002Frpm-lockfile-prototype\u002Farchive\u002Frefs\u002Fheads\u002Fmain.zip 2>\u002Fdev\u002Fnull\n","bash","",[403],{"type":43,"tag":123,"props":404,"children":405},{"__ignoreMap":401},[406],{"type":43,"tag":407,"props":408,"children":411},"span",{"class":409,"line":410},"line",1,[412,417,423,428,433,438,443,449],{"type":43,"tag":407,"props":413,"children":415},{"style":414},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[416],{"type":48,"value":346},{"type":43,"tag":407,"props":418,"children":420},{"style":419},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[421],{"type":48,"value":422}," -m",{"type":43,"tag":407,"props":424,"children":425},{"style":419},[426],{"type":48,"value":427}," pip",{"type":43,"tag":407,"props":429,"children":430},{"style":419},[431],{"type":48,"value":432}," install",{"type":43,"tag":407,"props":434,"children":435},{"style":419},[436],{"type":48,"value":437}," --user",{"type":43,"tag":407,"props":439,"children":440},{"style":419},[441],{"type":48,"value":442}," https:\u002F\u002Fgithub.com\u002Fkonflux-ci\u002Frpm-lockfile-prototype\u002Farchive\u002Frefs\u002Fheads\u002Fmain.zip",{"type":43,"tag":407,"props":444,"children":446},{"style":445},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[447],{"type":48,"value":448}," 2>",{"type":43,"tag":407,"props":450,"children":451},{"style":419},[452],{"type":48,"value":453},"\u002Fdev\u002Fnull\n",{"type":43,"tag":58,"props":455,"children":456},{},[457,459,465],{"type":48,"value":458},"On Fedora\u002FRHEL hosts, ",{"type":43,"tag":123,"props":460,"children":462},{"className":461},[],[463],{"type":48,"value":464},"dnf install podman skopeo python3-dnf",{"type":48,"value":466}," may also be required for lockfile generation.",{"type":43,"tag":51,"props":468,"children":470},{"id":469},"branch-mapping",[471],{"type":48,"value":472},"Branch mapping",{"type":43,"tag":58,"props":474,"children":475},{},[476,478,484,486,491,493,499,501,507,508,514,515,521],{"type":48,"value":477},"Accepted ",{"type":43,"tag":123,"props":479,"children":481},{"className":480},[],[482],{"type":48,"value":483},"-b",{"type":48,"value":485}," values: ",{"type":43,"tag":123,"props":487,"children":489},{"className":488},[],[490],{"type":48,"value":185},{"type":48,"value":492}," or any ",{"type":43,"tag":123,"props":494,"children":496},{"className":495},[],[497],{"type":48,"value":498},"release-*",{"type":48,"value":500}," branch (e.g. ",{"type":43,"tag":123,"props":502,"children":504},{"className":503},[],[505],{"type":48,"value":506},"release-1.9",{"type":48,"value":272},{"type":43,"tag":123,"props":509,"children":511},{"className":510},[],[512],{"type":48,"value":513},"release-1.10",{"type":48,"value":272},{"type":43,"tag":123,"props":516,"children":518},{"className":517},[],[519],{"type":48,"value":520},"release-2.1",{"type":48,"value":250},{"type":43,"tag":79,"props":523,"children":524},{},[525,561],{"type":43,"tag":83,"props":526,"children":527},{},[528],{"type":43,"tag":87,"props":529,"children":530},{},[531,542],{"type":43,"tag":91,"props":532,"children":533},{},[534,536,541],{"type":48,"value":535},"GitHub branch (",{"type":43,"tag":123,"props":537,"children":539},{"className":538},[],[540],{"type":48,"value":483},{"type":48,"value":311},{"type":43,"tag":91,"props":543,"children":544},{},[545,547,553,555,560],{"type":48,"value":546},"GitLab scripts branch (",{"type":43,"tag":123,"props":548,"children":550},{"className":549},[],[551],{"type":48,"value":552},"-sb",{"type":48,"value":554}," for ",{"type":43,"tag":123,"props":556,"children":558},{"className":557},[],[559],{"type":48,"value":248},{"type":48,"value":311},{"type":43,"tag":107,"props":562,"children":563},{},[564,583],{"type":43,"tag":87,"props":565,"children":566},{},[567,575],{"type":43,"tag":114,"props":568,"children":569},{},[570],{"type":43,"tag":123,"props":571,"children":573},{"className":572},[],[574],{"type":48,"value":185},{"type":43,"tag":114,"props":576,"children":577},{},[578],{"type":43,"tag":123,"props":579,"children":581},{"className":580},[],[582],{"type":48,"value":239},{"type":43,"tag":87,"props":584,"children":585},{},[586,595],{"type":43,"tag":114,"props":587,"children":588},{},[589],{"type":43,"tag":123,"props":590,"children":592},{"className":591},[],[593],{"type":48,"value":594},"release-X.Y",{"type":43,"tag":114,"props":596,"children":597},{},[598],{"type":43,"tag":123,"props":599,"children":601},{"className":600},[],[602],{"type":48,"value":603},"rhdh-X.Y-rhel-9",{"type":43,"tag":58,"props":605,"children":606},{},[607],{"type":48,"value":608},"Verify the target branch exists in each repo before running.",{"type":43,"tag":51,"props":610,"children":612},{"id":611},"run-the-bundled-script",[613],{"type":48,"value":614},"Run the bundled script",{"type":43,"tag":58,"props":616,"children":617},{},[618,623,625,630],{"type":43,"tag":64,"props":619,"children":620},{},[621],{"type":48,"value":622},"Execute",{"type":48,"value":624}," ",{"type":43,"tag":224,"props":626,"children":628},{"href":627},"scripts\u002Fbase-images-and-rpms.sh",[629],{"type":48,"value":627},{"type":48,"value":631},"; do not reimplement the workflow inline.",{"type":43,"tag":396,"props":633,"children":635},{"className":398,"code":634,"language":400,"meta":401,"style":401},"SKILL=skills\u002Fbase-images-and-rpms   # under 1-rhdh-skill checkout\nchmod +x \"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\"\n\n# All three repos under a parent directory\n\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" -b release-1.10 --parent-dir ~\u002FRHDH\n\n# Explicit paths and on-disk tools\n\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" -b main \\\n  --update-base-images-script ~\u002FRHDH\u002Frhdh\u002Fbuild\u002Fscripts\u002FupdateBaseImages.sh \\\n  --rpm-lockfile-prototype ~\u002F.local\u002Fbin\u002Frpm-lockfile-prototype \\\n  ~\u002FRHDH\u002Frhdh \\\n  ~\u002FRHDH\u002Frhdh-operator \\\n  ~\u002FRHDH\u002Frhdh-must-gather\n",[636],{"type":43,"tag":123,"props":637,"children":638},{"__ignoreMap":401},[639,664,702,712,721,768,776,785,823,841,859,872,885],{"type":43,"tag":407,"props":640,"children":641},{"class":409,"line":410},[642,648,653,658],{"type":43,"tag":407,"props":643,"children":645},{"style":644},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[646],{"type":48,"value":647},"SKILL",{"type":43,"tag":407,"props":649,"children":650},{"style":445},[651],{"type":48,"value":652},"=",{"type":43,"tag":407,"props":654,"children":655},{"style":419},[656],{"type":48,"value":657},"skills\u002Fbase-images-and-rpms",{"type":43,"tag":407,"props":659,"children":661},{"style":660},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[662],{"type":48,"value":663},"   # under 1-rhdh-skill checkout\n",{"type":43,"tag":407,"props":665,"children":667},{"class":409,"line":666},2,[668,673,678,683,687,692,697],{"type":43,"tag":407,"props":669,"children":670},{"style":414},[671],{"type":48,"value":672},"chmod",{"type":43,"tag":407,"props":674,"children":675},{"style":419},[676],{"type":48,"value":677}," +x",{"type":43,"tag":407,"props":679,"children":680},{"style":445},[681],{"type":48,"value":682}," \"${",{"type":43,"tag":407,"props":684,"children":685},{"style":644},[686],{"type":48,"value":647},{"type":43,"tag":407,"props":688,"children":689},{"style":445},[690],{"type":48,"value":691},"}",{"type":43,"tag":407,"props":693,"children":694},{"style":419},[695],{"type":48,"value":696},"\u002Fscripts\u002Fbase-images-and-rpms.sh",{"type":43,"tag":407,"props":698,"children":699},{"style":445},[700],{"type":48,"value":701},"\"\n",{"type":43,"tag":407,"props":703,"children":705},{"class":409,"line":704},3,[706],{"type":43,"tag":407,"props":707,"children":709},{"emptyLinePlaceholder":708},true,[710],{"type":48,"value":711},"\n",{"type":43,"tag":407,"props":713,"children":715},{"class":409,"line":714},4,[716],{"type":43,"tag":407,"props":717,"children":718},{"style":660},[719],{"type":48,"value":720},"# All three repos under a parent directory\n",{"type":43,"tag":407,"props":722,"children":724},{"class":409,"line":723},5,[725,730,735,739,743,748,753,758,763],{"type":43,"tag":407,"props":726,"children":727},{"style":414},[728],{"type":48,"value":729},"\"",{"type":43,"tag":407,"props":731,"children":732},{"style":445},[733],{"type":48,"value":734},"${",{"type":43,"tag":407,"props":736,"children":737},{"style":644},[738],{"type":48,"value":647},{"type":43,"tag":407,"props":740,"children":741},{"style":445},[742],{"type":48,"value":691},{"type":43,"tag":407,"props":744,"children":745},{"style":414},[746],{"type":48,"value":747},"\u002Fscripts\u002Fbase-images-and-rpms.sh\"",{"type":43,"tag":407,"props":749,"children":750},{"style":419},[751],{"type":48,"value":752}," -b",{"type":43,"tag":407,"props":754,"children":755},{"style":419},[756],{"type":48,"value":757}," release-1.10",{"type":43,"tag":407,"props":759,"children":760},{"style":419},[761],{"type":48,"value":762}," --parent-dir",{"type":43,"tag":407,"props":764,"children":765},{"style":419},[766],{"type":48,"value":767}," ~\u002FRHDH\n",{"type":43,"tag":407,"props":769,"children":771},{"class":409,"line":770},6,[772],{"type":43,"tag":407,"props":773,"children":774},{"emptyLinePlaceholder":708},[775],{"type":48,"value":711},{"type":43,"tag":407,"props":777,"children":779},{"class":409,"line":778},7,[780],{"type":43,"tag":407,"props":781,"children":782},{"style":660},[783],{"type":48,"value":784},"# Explicit paths and on-disk tools\n",{"type":43,"tag":407,"props":786,"children":788},{"class":409,"line":787},8,[789,793,797,801,805,809,813,818],{"type":43,"tag":407,"props":790,"children":791},{"style":414},[792],{"type":48,"value":729},{"type":43,"tag":407,"props":794,"children":795},{"style":445},[796],{"type":48,"value":734},{"type":43,"tag":407,"props":798,"children":799},{"style":644},[800],{"type":48,"value":647},{"type":43,"tag":407,"props":802,"children":803},{"style":445},[804],{"type":48,"value":691},{"type":43,"tag":407,"props":806,"children":807},{"style":414},[808],{"type":48,"value":747},{"type":43,"tag":407,"props":810,"children":811},{"style":419},[812],{"type":48,"value":752},{"type":43,"tag":407,"props":814,"children":815},{"style":419},[816],{"type":48,"value":817}," main",{"type":43,"tag":407,"props":819,"children":820},{"style":644},[821],{"type":48,"value":822}," \\\n",{"type":43,"tag":407,"props":824,"children":826},{"class":409,"line":825},9,[827,832,837],{"type":43,"tag":407,"props":828,"children":829},{"style":419},[830],{"type":48,"value":831},"  --update-base-images-script",{"type":43,"tag":407,"props":833,"children":834},{"style":419},[835],{"type":48,"value":836}," ~\u002FRHDH\u002Frhdh\u002Fbuild\u002Fscripts\u002FupdateBaseImages.sh",{"type":43,"tag":407,"props":838,"children":839},{"style":644},[840],{"type":48,"value":822},{"type":43,"tag":407,"props":842,"children":844},{"class":409,"line":843},10,[845,850,855],{"type":43,"tag":407,"props":846,"children":847},{"style":419},[848],{"type":48,"value":849},"  --rpm-lockfile-prototype",{"type":43,"tag":407,"props":851,"children":852},{"style":419},[853],{"type":48,"value":854}," ~\u002F.local\u002Fbin\u002Frpm-lockfile-prototype",{"type":43,"tag":407,"props":856,"children":857},{"style":644},[858],{"type":48,"value":822},{"type":43,"tag":407,"props":860,"children":862},{"class":409,"line":861},11,[863,868],{"type":43,"tag":407,"props":864,"children":865},{"style":419},[866],{"type":48,"value":867},"  ~\u002FRHDH\u002Frhdh",{"type":43,"tag":407,"props":869,"children":870},{"style":644},[871],{"type":48,"value":822},{"type":43,"tag":407,"props":873,"children":875},{"class":409,"line":874},12,[876,881],{"type":43,"tag":407,"props":877,"children":878},{"style":419},[879],{"type":48,"value":880},"  ~\u002FRHDH\u002Frhdh-operator",{"type":43,"tag":407,"props":882,"children":883},{"style":644},[884],{"type":48,"value":822},{"type":43,"tag":407,"props":886,"children":888},{"class":409,"line":887},13,[889],{"type":43,"tag":407,"props":890,"children":891},{"style":419},[892],{"type":48,"value":893},"  ~\u002FRHDH\u002Frhdh-must-gather\n",{"type":43,"tag":895,"props":896,"children":898},"h3",{"id":897},"flags",[899],{"type":48,"value":900},"Flags",{"type":43,"tag":79,"props":902,"children":903},{},[904,920],{"type":43,"tag":83,"props":905,"children":906},{},[907],{"type":43,"tag":87,"props":908,"children":909},{},[910,915],{"type":43,"tag":91,"props":911,"children":912},{},[913],{"type":48,"value":914},"Flag",{"type":43,"tag":91,"props":916,"children":917},{},[918],{"type":48,"value":919},"Purpose",{"type":43,"tag":107,"props":921,"children":922},{},[923,961,993,1018,1057,1074,1099,1121,1152,1176,1193],{"type":43,"tag":87,"props":924,"children":925},{},[926,941],{"type":43,"tag":114,"props":927,"children":928},{},[929,934,935],{"type":43,"tag":123,"props":930,"children":932},{"className":931},[],[933],{"type":48,"value":483},{"type":48,"value":272},{"type":43,"tag":123,"props":936,"children":938},{"className":937},[],[939],{"type":48,"value":940},"--branch",{"type":43,"tag":114,"props":942,"children":943},{},[944,949,950,955,956],{"type":43,"tag":64,"props":945,"children":946},{},[947],{"type":48,"value":948},"Required.",{"type":48,"value":624},{"type":43,"tag":123,"props":951,"children":953},{"className":952},[],[954],{"type":48,"value":185},{"type":48,"value":130},{"type":43,"tag":123,"props":957,"children":959},{"className":958},[],[960],{"type":48,"value":498},{"type":43,"tag":87,"props":962,"children":963},{},[964,973],{"type":43,"tag":114,"props":965,"children":966},{},[967],{"type":43,"tag":123,"props":968,"children":970},{"className":969},[],[971],{"type":48,"value":972},"--update-base-images-script PATH",{"type":43,"tag":114,"props":974,"children":975},{},[976,978,983,985,991],{"type":48,"value":977},"Use local ",{"type":43,"tag":123,"props":979,"children":981},{"className":980},[],[982],{"type":48,"value":248},{"type":48,"value":984}," (expects ",{"type":43,"tag":123,"props":986,"children":988},{"className":987},[],[989],{"type":48,"value":990},"createPR.sh",{"type":48,"value":992}," alongside; fetches if missing)",{"type":43,"tag":87,"props":994,"children":995},{},[996,1005],{"type":43,"tag":114,"props":997,"children":998},{},[999],{"type":43,"tag":123,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":48,"value":1004},"--rpm-lockfile-prototype PATH",{"type":43,"tag":114,"props":1006,"children":1007},{},[1008,1010,1016],{"type":48,"value":1009},"Use local binary; otherwise ",{"type":43,"tag":123,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":48,"value":1015},"~\u002F.local\u002Fbin\u002Frpm-lockfile-prototype",{"type":48,"value":1017}," or pip install",{"type":43,"tag":87,"props":1019,"children":1020},{},[1021,1030],{"type":43,"tag":114,"props":1022,"children":1023},{},[1024],{"type":43,"tag":123,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":48,"value":1029},"--parent-dir PATH",{"type":43,"tag":114,"props":1031,"children":1032},{},[1033,1035,1041,1042,1048,1049,1055],{"type":48,"value":1034},"Auto-discover ",{"type":43,"tag":123,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":48,"value":1040},"1-rhdh",{"type":48,"value":272},{"type":43,"tag":123,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":48,"value":1047},"1-rhdh-operator",{"type":48,"value":272},{"type":43,"tag":123,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":48,"value":1054},"1-must-gather",{"type":48,"value":1056}," (and common aliases)",{"type":43,"tag":87,"props":1058,"children":1059},{},[1060,1069],{"type":43,"tag":114,"props":1061,"children":1062},{},[1063],{"type":43,"tag":123,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":48,"value":1068},"REPO_DIR ...",{"type":43,"tag":114,"props":1070,"children":1071},{},[1072],{"type":48,"value":1073},"Explicit repo checkouts",{"type":43,"tag":87,"props":1075,"children":1076},{},[1077,1094],{"type":43,"tag":114,"props":1078,"children":1079},{},[1080,1086,1088],{"type":43,"tag":123,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":48,"value":1085},"--skip-base",{"type":48,"value":1087}," \u002F ",{"type":43,"tag":123,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":48,"value":1093},"--skip-rpm",{"type":43,"tag":114,"props":1095,"children":1096},{},[1097],{"type":48,"value":1098},"Run only one half of the workflow",{"type":43,"tag":87,"props":1100,"children":1101},{},[1102,1111],{"type":43,"tag":114,"props":1103,"children":1104},{},[1105],{"type":43,"tag":123,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":48,"value":1110},"--dirty",{"type":43,"tag":114,"props":1112,"children":1113},{},[1114,1116],{"type":48,"value":1115},"Allow dirty trees for ",{"type":43,"tag":123,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":48,"value":248},{"type":43,"tag":87,"props":1122,"children":1123},{},[1124,1133],{"type":43,"tag":114,"props":1125,"children":1126},{},[1127],{"type":43,"tag":123,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":48,"value":1132},"--push",{"type":43,"tag":114,"props":1134,"children":1135},{},[1136,1138,1143,1145,1150],{"type":48,"value":1137},"Let ",{"type":43,"tag":123,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":48,"value":248},{"type":48,"value":1144}," push when branch policy allows (still uses ",{"type":43,"tag":123,"props":1146,"children":1148},{"className":1147},[],[1149],{"type":48,"value":335},{"type":48,"value":1151}," fallback)",{"type":43,"tag":87,"props":1153,"children":1154},{},[1155,1164],{"type":43,"tag":114,"props":1156,"children":1157},{},[1158],{"type":43,"tag":123,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":48,"value":1163},"--no-pr",{"type":43,"tag":114,"props":1165,"children":1166},{},[1167,1169,1175],{"type":48,"value":1168},"Commit locally with ",{"type":43,"tag":123,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":48,"value":1174},"--no-push",{"type":48,"value":187},{"type":43,"tag":87,"props":1177,"children":1178},{},[1179,1188],{"type":43,"tag":114,"props":1180,"children":1181},{},[1182],{"type":43,"tag":123,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":48,"value":1187},"--dry-run",{"type":43,"tag":114,"props":1189,"children":1190},{},[1191],{"type":48,"value":1192},"Print commands without executing",{"type":43,"tag":87,"props":1194,"children":1195},{},[1196,1205],{"type":43,"tag":114,"props":1197,"children":1198},{},[1199],{"type":43,"tag":123,"props":1200,"children":1202},{"className":1201},[],[1203],{"type":48,"value":1204},"--analyze",{"type":43,"tag":114,"props":1206,"children":1207},{},[1208,1210,1216,1218,1223,1225,1230],{"type":48,"value":1209},"Read-only scan via ",{"type":43,"tag":123,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":48,"value":1215},"analyze-base-images.sh",{"type":48,"value":1217}," (no ",{"type":43,"tag":123,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":48,"value":483},{"type":48,"value":1224}," required; defaults scripts to ",{"type":43,"tag":123,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":48,"value":185},{"type":48,"value":311},{"type":43,"tag":58,"props":1232,"children":1233},{},[1234,1239,1241,1247,1249,1262,1264,1270],{"type":43,"tag":64,"props":1235,"children":1236},{},[1237],{"type":48,"value":1238},"Default:",{"type":48,"value":1240}," base image updates use ",{"type":43,"tag":123,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":48,"value":1246},"--pr --no-push",{"type":48,"value":1248}," (local commits + PR creation, no push). RPM lockfile and node header changes are committed and ",{"type":43,"tag":64,"props":1250,"children":1251},{},[1252,1254,1260],{"type":48,"value":1253},"pushed to the same open ",{"type":43,"tag":123,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":48,"value":1259},"chore\u002Fautomated-update-base-images-*",{"type":48,"value":1261}," PR branch",{"type":48,"value":1263}," when one exists; otherwise a ",{"type":43,"tag":123,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":48,"value":1269},"chore\u002Fautomated-update-rpm-lockfile\u002F\u003Cbranch>",{"type":48,"value":1271}," PR is opened.",{"type":43,"tag":51,"props":1273,"children":1275},{"id":1274},"analyze-without-updating",[1276],{"type":48,"value":1277},"Analyze without updating",{"type":43,"tag":58,"props":1279,"children":1280},{},[1281,1283,1288],{"type":48,"value":1282},"Use ",{"type":43,"tag":123,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":48,"value":1204},{"type":48,"value":1289}," to scan Containerfiles and Dockerfiles without checkout, commits, or registry writes:",{"type":43,"tag":396,"props":1291,"children":1293},{"className":398,"code":1292,"language":400,"meta":401,"style":401},"\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" --analyze --parent-dir ~\u002FRHDH\n\n# Optional: match GitLab scripts branch to a release line\n\"${SKILL}\u002Fscripts\u002Fbase-images-and-rpms.sh\" --analyze -b release-1.10 --parent-dir ~\u002FRHDH\n",[1294],{"type":43,"tag":123,"props":1295,"children":1296},{"__ignoreMap":401},[1297,1333,1340,1348],{"type":43,"tag":407,"props":1298,"children":1299},{"class":409,"line":410},[1300,1304,1308,1312,1316,1320,1325,1329],{"type":43,"tag":407,"props":1301,"children":1302},{"style":414},[1303],{"type":48,"value":729},{"type":43,"tag":407,"props":1305,"children":1306},{"style":445},[1307],{"type":48,"value":734},{"type":43,"tag":407,"props":1309,"children":1310},{"style":644},[1311],{"type":48,"value":647},{"type":43,"tag":407,"props":1313,"children":1314},{"style":445},[1315],{"type":48,"value":691},{"type":43,"tag":407,"props":1317,"children":1318},{"style":414},[1319],{"type":48,"value":747},{"type":43,"tag":407,"props":1321,"children":1322},{"style":419},[1323],{"type":48,"value":1324}," --analyze",{"type":43,"tag":407,"props":1326,"children":1327},{"style":419},[1328],{"type":48,"value":762},{"type":43,"tag":407,"props":1330,"children":1331},{"style":419},[1332],{"type":48,"value":767},{"type":43,"tag":407,"props":1334,"children":1335},{"class":409,"line":666},[1336],{"type":43,"tag":407,"props":1337,"children":1338},{"emptyLinePlaceholder":708},[1339],{"type":48,"value":711},{"type":43,"tag":407,"props":1341,"children":1342},{"class":409,"line":704},[1343],{"type":43,"tag":407,"props":1344,"children":1345},{"style":660},[1346],{"type":48,"value":1347},"# Optional: match GitLab scripts branch to a release line\n",{"type":43,"tag":407,"props":1349,"children":1350},{"class":409,"line":714},[1351,1355,1359,1363,1367,1371,1375,1379,1383,1387],{"type":43,"tag":407,"props":1352,"children":1353},{"style":414},[1354],{"type":48,"value":729},{"type":43,"tag":407,"props":1356,"children":1357},{"style":445},[1358],{"type":48,"value":734},{"type":43,"tag":407,"props":1360,"children":1361},{"style":644},[1362],{"type":48,"value":647},{"type":43,"tag":407,"props":1364,"children":1365},{"style":445},[1366],{"type":48,"value":691},{"type":43,"tag":407,"props":1368,"children":1369},{"style":414},[1370],{"type":48,"value":747},{"type":43,"tag":407,"props":1372,"children":1373},{"style":419},[1374],{"type":48,"value":1324},{"type":43,"tag":407,"props":1376,"children":1377},{"style":419},[1378],{"type":48,"value":752},{"type":43,"tag":407,"props":1380,"children":1381},{"style":419},[1382],{"type":48,"value":757},{"type":43,"tag":407,"props":1384,"children":1385},{"style":419},[1386],{"type":48,"value":762},{"type":43,"tag":407,"props":1388,"children":1389},{"style":419},[1390],{"type":48,"value":767},{"type":43,"tag":58,"props":1392,"children":1393},{},[1394],{"type":48,"value":1395},"Or run the analyzer directly:",{"type":43,"tag":396,"props":1397,"children":1399},{"className":398,"code":1398,"language":400,"meta":401,"style":401},"\"${SKILL}\u002Fscripts\u002Fanalyze-base-images.sh\" \\\n  -s \u002Fpath\u002Fto\u002Frhidp\u002Frhdh\u002Fbuild\u002Fscripts \\\n  -w ~\u002FRHDH\u002Frhdh \\\n  -w ~\u002FRHDH\u002Frhdh-operator\n",[1400],{"type":43,"tag":123,"props":1401,"children":1402},{"__ignoreMap":401},[1403,1431,1448,1465],{"type":43,"tag":407,"props":1404,"children":1405},{"class":409,"line":410},[1406,1410,1414,1418,1422,1427],{"type":43,"tag":407,"props":1407,"children":1408},{"style":414},[1409],{"type":48,"value":729},{"type":43,"tag":407,"props":1411,"children":1412},{"style":445},[1413],{"type":48,"value":734},{"type":43,"tag":407,"props":1415,"children":1416},{"style":644},[1417],{"type":48,"value":647},{"type":43,"tag":407,"props":1419,"children":1420},{"style":445},[1421],{"type":48,"value":691},{"type":43,"tag":407,"props":1423,"children":1424},{"style":414},[1425],{"type":48,"value":1426},"\u002Fscripts\u002Fanalyze-base-images.sh\"",{"type":43,"tag":407,"props":1428,"children":1429},{"style":644},[1430],{"type":48,"value":822},{"type":43,"tag":407,"props":1432,"children":1433},{"class":409,"line":666},[1434,1439,1444],{"type":43,"tag":407,"props":1435,"children":1436},{"style":419},[1437],{"type":48,"value":1438},"  -s",{"type":43,"tag":407,"props":1440,"children":1441},{"style":419},[1442],{"type":48,"value":1443}," \u002Fpath\u002Fto\u002Frhidp\u002Frhdh\u002Fbuild\u002Fscripts",{"type":43,"tag":407,"props":1445,"children":1446},{"style":644},[1447],{"type":48,"value":822},{"type":43,"tag":407,"props":1449,"children":1450},{"class":409,"line":704},[1451,1456,1461],{"type":43,"tag":407,"props":1452,"children":1453},{"style":419},[1454],{"type":48,"value":1455},"  -w",{"type":43,"tag":407,"props":1457,"children":1458},{"style":419},[1459],{"type":48,"value":1460}," ~\u002FRHDH\u002Frhdh",{"type":43,"tag":407,"props":1462,"children":1463},{"style":644},[1464],{"type":48,"value":822},{"type":43,"tag":407,"props":1466,"children":1467},{"class":409,"line":714},[1468,1472],{"type":43,"tag":407,"props":1469,"children":1470},{"style":419},[1471],{"type":48,"value":1455},{"type":43,"tag":407,"props":1473,"children":1474},{"style":419},[1475],{"type":48,"value":1476}," ~\u002FRHDH\u002Frhdh-operator\n",{"type":43,"tag":58,"props":1478,"children":1479},{},[1480,1482,1487,1489,1495,1497,1502,1504,1510,1511,1517,1519,1524,1526,1532],{"type":48,"value":1481},"The analyzer reports ",{"type":43,"tag":64,"props":1483,"children":1484},{},[1485],{"type":48,"value":1486},"current vs latest",{"type":48,"value":1488}," per ",{"type":43,"tag":123,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":48,"value":1494},"FROM",{"type":48,"value":1496}," line, flags malformed tags, and warns on ",{"type":43,"tag":64,"props":1498,"children":1499},{},[1500],{"type":48,"value":1501},"UBI minor skew",{"type":48,"value":1503}," within a file. Tags must be ",{"type":43,"tag":123,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":48,"value":1509},"major.minor-buildid",{"type":48,"value":130},{"type":43,"tag":123,"props":1512,"children":1514},{"className":1513},[],[1515],{"type":48,"value":1516},"x.y.z-buildid",{"type":48,"value":1518},"; bare numeric registry tags are ignored (same rules as ",{"type":43,"tag":123,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":48,"value":248},{"type":48,"value":1525},"). Requires ",{"type":43,"tag":123,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":48,"value":1531},"skopeo login registry.redhat.io",{"type":48,"value":1533},".",{"type":43,"tag":58,"props":1535,"children":1536},{},[1537,1539,1544],{"type":48,"value":1538},"Each registry ",{"type":43,"tag":123,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":48,"value":1494},{"type":48,"value":1545}," needs a comment URL on the line above:",{"type":43,"tag":396,"props":1547,"children":1551},{"className":1548,"code":1549,"language":1550,"meta":401,"style":401},"language-containerfile shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# https:\u002F\u002Fregistry.access.redhat.com\u002Fubi9\u002Fnodejs-24\nFROM registry.access.redhat.com\u002Fubi9\u002Fnodejs-24:9.8-...@sha256:... AS skeleton\n","containerfile",[1552],{"type":43,"tag":123,"props":1553,"children":1554},{"__ignoreMap":401},[1555,1563],{"type":43,"tag":407,"props":1556,"children":1557},{"class":409,"line":410},[1558],{"type":43,"tag":407,"props":1559,"children":1560},{},[1561],{"type":48,"value":1562},"# https:\u002F\u002Fregistry.access.redhat.com\u002Fubi9\u002Fnodejs-24\n",{"type":43,"tag":407,"props":1564,"children":1565},{"class":409,"line":666},[1566],{"type":43,"tag":407,"props":1567,"children":1568},{},[1569],{"type":48,"value":1570},"FROM registry.access.redhat.com\u002Fubi9\u002Fnodejs-24:9.8-...@sha256:... AS skeleton\n",{"type":43,"tag":58,"props":1572,"children":1573},{},[1574,1576,1580,1582,1588,1589,1595],{"type":48,"value":1575},"For ",{"type":43,"tag":64,"props":1577,"children":1578},{},[1579],{"type":48,"value":118},{"type":48,"value":1581},", paths under ",{"type":43,"tag":123,"props":1583,"children":1585},{"className":1584},[],[1586],{"type":48,"value":1587},"e2e-tests\u002F",{"type":48,"value":70},{"type":43,"tag":123,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":48,"value":1594},".ci\u002F",{"type":48,"value":1596}," are excluded from scans.",{"type":43,"tag":51,"props":1598,"children":1600},{"id":1599},"workflow",[1601],{"type":48,"value":1602},"Workflow",{"type":43,"tag":1604,"props":1605,"children":1606},"ol",{},[1607,1618,1636,1641,1654],{"type":43,"tag":262,"props":1608,"children":1609},{},[1610,1612,1617],{"type":48,"value":1611},"Pick branch (",{"type":43,"tag":123,"props":1613,"children":1615},{"className":1614},[],[1616],{"type":48,"value":483},{"type":48,"value":250},{"type":43,"tag":262,"props":1619,"children":1620},{},[1621,1623,1628,1630,1635],{"type":48,"value":1622},"Ensure local clones are fetched and clean enough for ",{"type":43,"tag":123,"props":1624,"children":1626},{"className":1625},[],[1627],{"type":48,"value":248},{"type":48,"value":1629}," (or pass ",{"type":43,"tag":123,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":48,"value":1110},{"type":48,"value":250},{"type":43,"tag":262,"props":1637,"children":1638},{},[1639],{"type":48,"value":1640},"Run the script on all three repos.",{"type":43,"tag":262,"props":1642,"children":1643},{},[1644,1646,1652],{"type":48,"value":1645},"Review open PRs — each should include base image, ",{"type":43,"tag":123,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":48,"value":1651},"rpms.lock.yaml",{"type":48,"value":1653},", and (for rhdh) node header updates when applicable.",{"type":43,"tag":262,"props":1655,"children":1656},{},[1657,1659,1664],{"type":48,"value":1658},"Human merges PRs; do ",{"type":43,"tag":64,"props":1660,"children":1661},{},[1662],{"type":48,"value":1663},"not",{"type":48,"value":1665}," push directly to protected branches without review.",{"type":43,"tag":51,"props":1667,"children":1669},{"id":1668},"what-each-step-does",[1670],{"type":48,"value":1671},"What each step does",{"type":43,"tag":895,"props":1673,"children":1675},{"id":1674},"base-images-updatebaseimagessh",[1676,1678,1683],{"type":48,"value":1677},"Base images (",{"type":43,"tag":123,"props":1679,"children":1681},{"className":1680},[],[1682],{"type":48,"value":248},{"type":48,"value":311},{"type":43,"tag":58,"props":1685,"children":1686},{},[1687,1689,1696],{"type":48,"value":1688},"Mirrors ",{"type":43,"tag":224,"props":1690,"children":1693},{"href":1691,"rel":1692},"https:\u002F\u002Fgitlab.cee.redhat.com\u002Frhidp\u002Frhdh\u002F-\u002Fblob\u002Frhdh-1-rhel-9\u002Fbuild\u002Fci\u002Fweekly-maintenance.sh",[228],[1694],{"type":48,"value":1695},"weekly-maintenance.sh",{"type":48,"value":1697}," upstream section:",{"type":43,"tag":396,"props":1699,"children":1701},{"className":398,"code":1700,"language":400,"meta":401,"style":401},"updateBaseImages.sh -w REPO_ROOT -b BRANCH -sb SCRIPTS_BRANCH -maxdepth 5 --pr\n",[1702],{"type":43,"tag":123,"props":1703,"children":1704},{"__ignoreMap":401},[1705],{"type":43,"tag":407,"props":1706,"children":1707},{"class":409,"line":410},[1708,1712,1717,1722,1726,1731,1736,1741,1746,1752],{"type":43,"tag":407,"props":1709,"children":1710},{"style":414},[1711],{"type":48,"value":248},{"type":43,"tag":407,"props":1713,"children":1714},{"style":419},[1715],{"type":48,"value":1716}," -w",{"type":43,"tag":407,"props":1718,"children":1719},{"style":419},[1720],{"type":48,"value":1721}," REPO_ROOT",{"type":43,"tag":407,"props":1723,"children":1724},{"style":419},[1725],{"type":48,"value":752},{"type":43,"tag":407,"props":1727,"children":1728},{"style":419},[1729],{"type":48,"value":1730}," BRANCH",{"type":43,"tag":407,"props":1732,"children":1733},{"style":419},[1734],{"type":48,"value":1735}," -sb",{"type":43,"tag":407,"props":1737,"children":1738},{"style":419},[1739],{"type":48,"value":1740}," SCRIPTS_BRANCH",{"type":43,"tag":407,"props":1742,"children":1743},{"style":419},[1744],{"type":48,"value":1745}," -maxdepth",{"type":43,"tag":407,"props":1747,"children":1749},{"style":1748},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1750],{"type":48,"value":1751}," 5",{"type":43,"tag":407,"props":1753,"children":1754},{"style":419},[1755],{"type":48,"value":1756}," --pr\n",{"type":43,"tag":58,"props":1758,"children":1759},{},[1760,1766,1768,1773],{"type":43,"tag":123,"props":1761,"children":1763},{"className":1762},[],[1764],{"type":48,"value":1765},"-maxdepth 5",{"type":48,"value":1767}," reaches ",{"type":43,"tag":123,"props":1769,"children":1771},{"className":1770},[],[1772],{"type":48,"value":153},{"type":48,"value":1774}," in the operator repo as well as top-level containerfiles.",{"type":43,"tag":58,"props":1776,"children":1777},{},[1778,1783,1785,1791,1793,1798,1800,1806,1807,1812,1814,1820,1822,1827,1829,1834],{"type":43,"tag":123,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":48,"value":248},{"type":48,"value":1784}," calls ",{"type":43,"tag":123,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":48,"value":1790},"createPr()",{"type":48,"value":1792}," once per image bump; upstream ",{"type":43,"tag":123,"props":1794,"children":1796},{"className":1795},[],[1797],{"type":48,"value":990},{"type":48,"value":1799}," runs ",{"type":43,"tag":123,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":48,"value":1805},"gh pr view --web",{"type":48,"value":180},{"type":43,"tag":64,"props":1808,"children":1809},{},[1810],{"type":48,"value":1811},"every",{"type":48,"value":1813}," call, which re-opens the same PR URL. This skill sets ",{"type":43,"tag":123,"props":1815,"children":1817},{"className":1816},[],[1818],{"type":48,"value":1819},"GITLAB_PIPELINE=true",{"type":48,"value":1821}," during ",{"type":43,"tag":123,"props":1823,"children":1825},{"className":1824},[],[1826],{"type":48,"value":248},{"type":48,"value":1828}," to suppress that, then opens each repo's PR once in the browser when ",{"type":43,"tag":123,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":48,"value":335},{"type":48,"value":1835}," is in effect.",{"type":43,"tag":895,"props":1837,"children":1839},{"id":1838},"rpm-lockfiles-rpm-lockfile-prototype",[1840,1842,1847],{"type":48,"value":1841},"RPM lockfiles (",{"type":43,"tag":123,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":48,"value":360},{"type":48,"value":311},{"type":43,"tag":58,"props":1849,"children":1850},{},[1851],{"type":48,"value":1852},"Matches each repo's GitHub Action, then commits and pushes to the automation PR:",{"type":43,"tag":396,"props":1854,"children":1856},{"className":398,"code":1855,"language":400,"meta":401,"style":401},"rpm-lockfile-prototype -f CONTAINERFILE rpms.in.yaml\ngit add rpms.lock.yaml\ngit commit -s -m \"chore: update rpms.lock.yaml [skip-build]\"\ngit push origin \u003Cchore\u002Fautomated-update-base-images-*>   # same PR as base images\n",[1857],{"type":43,"tag":123,"props":1858,"children":1859},{"__ignoreMap":401},[1860,1882,1899,1934],{"type":43,"tag":407,"props":1861,"children":1862},{"class":409,"line":410},[1863,1867,1872,1877],{"type":43,"tag":407,"props":1864,"children":1865},{"style":414},[1866],{"type":48,"value":360},{"type":43,"tag":407,"props":1868,"children":1869},{"style":419},[1870],{"type":48,"value":1871}," -f",{"type":43,"tag":407,"props":1873,"children":1874},{"style":419},[1875],{"type":48,"value":1876}," CONTAINERFILE",{"type":43,"tag":407,"props":1878,"children":1879},{"style":419},[1880],{"type":48,"value":1881}," rpms.in.yaml\n",{"type":43,"tag":407,"props":1883,"children":1884},{"class":409,"line":666},[1885,1889,1894],{"type":43,"tag":407,"props":1886,"children":1887},{"style":414},[1888],{"type":48,"value":292},{"type":43,"tag":407,"props":1890,"children":1891},{"style":419},[1892],{"type":48,"value":1893}," add",{"type":43,"tag":407,"props":1895,"children":1896},{"style":419},[1897],{"type":48,"value":1898}," rpms.lock.yaml\n",{"type":43,"tag":407,"props":1900,"children":1901},{"class":409,"line":704},[1902,1906,1911,1916,1920,1925,1930],{"type":43,"tag":407,"props":1903,"children":1904},{"style":414},[1905],{"type":48,"value":292},{"type":43,"tag":407,"props":1907,"children":1908},{"style":419},[1909],{"type":48,"value":1910}," commit",{"type":43,"tag":407,"props":1912,"children":1913},{"style":419},[1914],{"type":48,"value":1915}," -s",{"type":43,"tag":407,"props":1917,"children":1918},{"style":419},[1919],{"type":48,"value":422},{"type":43,"tag":407,"props":1921,"children":1922},{"style":445},[1923],{"type":48,"value":1924}," \"",{"type":43,"tag":407,"props":1926,"children":1927},{"style":419},[1928],{"type":48,"value":1929},"chore: update rpms.lock.yaml [skip-build]",{"type":43,"tag":407,"props":1931,"children":1932},{"style":445},[1933],{"type":48,"value":701},{"type":43,"tag":407,"props":1935,"children":1936},{"class":409,"line":714},[1937,1941,1946,1951,1956,1961,1966],{"type":43,"tag":407,"props":1938,"children":1939},{"style":414},[1940],{"type":48,"value":292},{"type":43,"tag":407,"props":1942,"children":1943},{"style":419},[1944],{"type":48,"value":1945}," push",{"type":43,"tag":407,"props":1947,"children":1948},{"style":419},[1949],{"type":48,"value":1950}," origin",{"type":43,"tag":407,"props":1952,"children":1953},{"style":445},[1954],{"type":48,"value":1955}," \u003C",{"type":43,"tag":407,"props":1957,"children":1958},{"style":419},[1959],{"type":48,"value":1960},"chore\u002Fautomated-update-base-images-",{"type":43,"tag":407,"props":1962,"children":1963},{"style":445},[1964],{"type":48,"value":1965},"*>",{"type":43,"tag":407,"props":1967,"children":1968},{"style":660},[1969],{"type":48,"value":1970},"   # same PR as base images\n",{"type":43,"tag":58,"props":1972,"children":1973},{},[1974,1976,1981,1983,1988],{"type":48,"value":1975},"When no base-images PR exists (e.g. ",{"type":43,"tag":123,"props":1977,"children":1979},{"className":1978},[],[1980],{"type":48,"value":1085},{"type":48,"value":1982},"), the script uses ",{"type":43,"tag":123,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":48,"value":1269},{"type":48,"value":1989}," and opens a PR.",{"type":43,"tag":895,"props":1991,"children":1993},{"id":1992},"node-headers-rhdh-only",[1994],{"type":48,"value":1995},"Node headers (rhdh only)",{"type":43,"tag":58,"props":1997,"children":1998},{},[1999,2001,2007,2009,2014,2016,2022,2023,2029],{"type":48,"value":2000},"When the ",{"type":43,"tag":123,"props":2002,"children":2004},{"className":2003},[],[2005],{"type":48,"value":2006},"ubi9\u002Fnodejs-*",{"type":48,"value":2008}," builder image in ",{"type":43,"tag":123,"props":2010,"children":2012},{"className":2011},[],[2013],{"type":48,"value":128},{"type":48,"value":2015}," ships a different Node version than ",{"type":43,"tag":123,"props":2017,"children":2019},{"className":2018},[],[2020],{"type":48,"value":2021},".nvmrc",{"type":48,"value":1087},{"type":43,"tag":123,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":48,"value":2028},".nvm\u002Freleases\u002F",{"type":48,"value":2030},", the script:",{"type":43,"tag":1604,"props":2032,"children":2033},{},[2034,2061,2079,2106],{"type":43,"tag":262,"props":2035,"children":2036},{},[2037,2039,2045,2047,2052,2054,2060],{"type":48,"value":2038},"Reads ",{"type":43,"tag":123,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":48,"value":2044},"node --version",{"type":48,"value":2046}," from the updated builder image (",{"type":43,"tag":123,"props":2048,"children":2050},{"className":2049},[],[2051],{"type":48,"value":301},{"type":48,"value":2053},"\u002F",{"type":43,"tag":123,"props":2055,"children":2057},{"className":2056},[],[2058],{"type":48,"value":2059},"docker",{"type":48,"value":311},{"type":43,"tag":262,"props":2062,"children":2063},{},[2064,2066,2072,2074],{"type":48,"value":2065},"Downloads ",{"type":43,"tag":123,"props":2067,"children":2069},{"className":2068},[],[2070],{"type":48,"value":2071},"https:\u002F\u002Fnodejs.org\u002Fdist\u002F\u003Cversion>\u002Fnode-\u003Cversion>-headers.tar.gz",{"type":48,"value":2073}," into ",{"type":43,"tag":123,"props":2075,"children":2077},{"className":2076},[],[2078],{"type":48,"value":2028},{"type":43,"tag":262,"props":2080,"children":2081},{},[2082,2084,2089,2091,2097,2099,2104],{"type":48,"value":2083},"Updates ",{"type":43,"tag":123,"props":2085,"children":2087},{"className":2086},[],[2088],{"type":48,"value":2021},{"type":48,"value":2090}," (version without ",{"type":43,"tag":123,"props":2092,"children":2094},{"className":2093},[],[2095],{"type":48,"value":2096},"v",{"type":48,"value":2098}," prefix) and ",{"type":43,"tag":123,"props":2100,"children":2102},{"className":2101},[],[2103],{"type":48,"value":309},{"type":48,"value":2105}," (date + version)",{"type":43,"tag":262,"props":2107,"children":2108},{},[2109,2111,2117],{"type":48,"value":2110},"Removes stale ",{"type":43,"tag":123,"props":2112,"children":2114},{"className":2113},[],[2115],{"type":48,"value":2116},"node-v*-headers.tar.gz",{"type":48,"value":2118}," files and pushes to the same automation PR",{"type":43,"tag":58,"props":2120,"children":2121},{},[2122,2124,2136,2138,2142,2144,2149,2151,2157],{"type":48,"value":2123},"See ",{"type":43,"tag":224,"props":2125,"children":2128},{"href":2126,"rel":2127},"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh\u002Fblob\u002Fmain\u002F.nvm\u002Freleases\u002FREADME.adoc",[228],[2129,2131],{"type":48,"value":2130},"rhdh ",{"type":43,"tag":123,"props":2132,"children":2134},{"className":2133},[],[2135],{"type":48,"value":309},{"type":48,"value":2137},". On ",{"type":43,"tag":64,"props":2139,"children":2140},{},[2141],{"type":48,"value":506},{"type":48,"value":2143},", headers come from ",{"type":43,"tag":123,"props":2145,"children":2147},{"className":2146},[],[2148],{"type":48,"value":136},{"type":48,"value":2150}," (",{"type":43,"tag":123,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":48,"value":2156},"ubi9\u002Fnodejs-22",{"type":48,"value":2158},"), not Node 24.",{"type":43,"tag":895,"props":2160,"children":2162},{"id":2161},"go-toolchain-rhdh-operator-main-only",[2163],{"type":48,"value":2164},"Go toolchain (rhdh-operator, main only)",{"type":43,"tag":58,"props":2166,"children":2167},{},[2168,2170,2174,2176,2181,2183,2189,2191,2196,2198,2203,2205,2210],{"type":48,"value":2169},"On ",{"type":43,"tag":64,"props":2171,"children":2172},{},[2173],{"type":48,"value":185},{"type":48,"value":2175}," only (not ",{"type":43,"tag":123,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":48,"value":498},{"type":48,"value":2182},"), after base image bumps, reads ",{"type":43,"tag":123,"props":2184,"children":2186},{"className":2185},[],[2187],{"type":48,"value":2188},"go version",{"type":48,"value":2190}," from the ",{"type":43,"tag":123,"props":2192,"children":2194},{"className":2193},[],[2195],{"type":48,"value":178},{"type":48,"value":2197}," image in ",{"type":43,"tag":123,"props":2199,"children":2201},{"className":2200},[],[2202],{"type":48,"value":153},{"type":48,"value":2204}," and updates ",{"type":43,"tag":123,"props":2206,"children":2208},{"className":2207},[],[2209],{"type":48,"value":170},{"type":48,"value":2211},":",{"type":43,"tag":396,"props":2213,"children":2217},{"className":2214,"code":2216,"language":48,"meta":401},[2215],"language-text","go 1.26.0\ntoolchain go1.26.4\n",[2218],{"type":43,"tag":123,"props":2219,"children":2220},{"__ignoreMap":401},[2221],{"type":48,"value":2216},{"type":43,"tag":51,"props":2223,"children":2225},{"id":2224},"anti-patterns",[2226],{"type":48,"value":2227},"Anti-patterns",{"type":43,"tag":258,"props":2229,"children":2230},{},[2231,2236,2241,2254],{"type":43,"tag":262,"props":2232,"children":2233},{},[2234],{"type":48,"value":2235},"Pushing without human review.",{"type":43,"tag":262,"props":2237,"children":2238},{},[2239],{"type":48,"value":2240},"Running on a branch that does not exist in one of the three repos.",{"type":43,"tag":262,"props":2242,"children":2243},{},[2244,2246,2252],{"type":48,"value":2245},"Omitting ",{"type":43,"tag":123,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":48,"value":2251},"registry.redhat.io",{"type":48,"value":2253}," login before base image updates.",{"type":43,"tag":262,"props":2255,"children":2256},{},[2257,2259,2264,2266,2272,2274,2280],{"type":48,"value":2258},"Committing ",{"type":43,"tag":123,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":48,"value":1651},{"type":48,"value":2265}," without checking the base image minor (e.g. UBI ",{"type":43,"tag":123,"props":2267,"children":2269},{"className":2268},[],[2270],{"type":48,"value":2271},"9.8",{"type":48,"value":2273},") still matches ",{"type":43,"tag":123,"props":2275,"children":2277},{"className":2276},[],[2278],{"type":48,"value":2279},"rpms.in.yaml",{"type":48,"value":2281}," repo URLs.",{"type":43,"tag":51,"props":2283,"children":2285},{"id":2284},"additional-resources",[2286],{"type":48,"value":2287},"Additional resources",{"type":43,"tag":258,"props":2289,"children":2290},{},[2291],{"type":43,"tag":262,"props":2292,"children":2293},{},[2294,2296],{"type":48,"value":2295},"Per-repo notes: ",{"type":43,"tag":224,"props":2297,"children":2299},{"href":2298},"references\u002Frepos.md",[2300],{"type":48,"value":2298},{"type":43,"tag":2302,"props":2303,"children":2304},"style",{},[2305],{"type":48,"value":2306},"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":2308,"total":2409},[2309,2325,2339,2346,2362,2379,2390],{"slug":2310,"name":2310,"fn":2311,"description":2312,"org":2313,"tags":2314,"stars":26,"repoUrl":27,"updatedAt":2324},"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},[2315,2318,2321],{"name":2316,"slug":2317,"type":16},"Agents","agents",{"name":2319,"slug":2320,"type":16},"Code Analysis","code-analysis",{"name":2322,"slug":2323,"type":16},"Engineering","engineering","2026-07-16T06:03:24.758348",{"slug":2326,"name":2326,"fn":2327,"description":2328,"org":2329,"tags":2330,"stars":26,"repoUrl":27,"updatedAt":2338},"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},[2331,2332,2335],{"name":2322,"slug":2323,"type":16},{"name":2333,"slug":2334,"type":16},"Maintenance","maintenance",{"name":2336,"slug":2337,"type":16},"Migration","migration","2026-07-16T06:03:24.067361",{"slug":4,"name":4,"fn":5,"description":6,"org":2340,"tags":2341,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2342,2343,2344,2345],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"slug":2347,"name":2347,"fn":2348,"description":2349,"org":2350,"tags":2351,"stars":26,"repoUrl":27,"updatedAt":2361},"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},[2352,2355,2358],{"name":2353,"slug":2354,"type":16},"Debugging","debugging",{"name":2356,"slug":2357,"type":16},"QA","qa",{"name":2359,"slug":2360,"type":16},"Testing","testing","2026-07-29T06:00:33.054762",{"slug":2363,"name":2363,"fn":2364,"description":2365,"org":2366,"tags":2367,"stars":26,"repoUrl":27,"updatedAt":2378},"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},[2368,2371,2372,2375],{"name":2369,"slug":2370,"type":16},"Compliance","compliance",{"name":2322,"slug":2323,"type":16},{"name":2373,"slug":2374,"type":16},"Reporting","reporting",{"name":2376,"slug":2377,"type":16},"Security","security","2026-08-01T05:41:57.852801",{"slug":2380,"name":2380,"fn":2381,"description":2382,"org":2383,"tags":2384,"stars":26,"repoUrl":27,"updatedAt":2389},"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},[2385,2386],{"name":24,"slug":25,"type":16},{"name":2387,"slug":2388,"type":16},"Plugin Development","plugin-development","2026-07-16T06:02:28.983498",{"slug":2391,"name":2391,"fn":2392,"description":2393,"org":2394,"tags":2395,"stars":26,"repoUrl":27,"updatedAt":2408},"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},[2396,2399,2402,2405],{"name":2397,"slug":2398,"type":16},"Auth","auth",{"name":2400,"slug":2401,"type":16},"Jira","jira",{"name":2403,"slug":2404,"type":16},"MCP","mcp",{"name":2406,"slug":2407,"type":16},"OAuth","oauth","2026-07-29T06:00:33.525179",24,{"items":2411,"total":2409},[2412,2418,2424,2431,2437,2444,2449,2456,2468,2481,2493,2505],{"slug":2310,"name":2310,"fn":2311,"description":2312,"org":2413,"tags":2414,"stars":26,"repoUrl":27,"updatedAt":2324},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2415,2416,2417],{"name":2316,"slug":2317,"type":16},{"name":2319,"slug":2320,"type":16},{"name":2322,"slug":2323,"type":16},{"slug":2326,"name":2326,"fn":2327,"description":2328,"org":2419,"tags":2420,"stars":26,"repoUrl":27,"updatedAt":2338},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2421,2422,2423],{"name":2322,"slug":2323,"type":16},{"name":2333,"slug":2334,"type":16},{"name":2336,"slug":2337,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":2425,"tags":2426,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2427,2428,2429,2430],{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"slug":2347,"name":2347,"fn":2348,"description":2349,"org":2432,"tags":2433,"stars":26,"repoUrl":27,"updatedAt":2361},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2434,2435,2436],{"name":2353,"slug":2354,"type":16},{"name":2356,"slug":2357,"type":16},{"name":2359,"slug":2360,"type":16},{"slug":2363,"name":2363,"fn":2364,"description":2365,"org":2438,"tags":2439,"stars":26,"repoUrl":27,"updatedAt":2378},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2440,2441,2442,2443],{"name":2369,"slug":2370,"type":16},{"name":2322,"slug":2323,"type":16},{"name":2373,"slug":2374,"type":16},{"name":2376,"slug":2377,"type":16},{"slug":2380,"name":2380,"fn":2381,"description":2382,"org":2445,"tags":2446,"stars":26,"repoUrl":27,"updatedAt":2389},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2447,2448],{"name":24,"slug":25,"type":16},{"name":2387,"slug":2388,"type":16},{"slug":2391,"name":2391,"fn":2392,"description":2393,"org":2450,"tags":2451,"stars":26,"repoUrl":27,"updatedAt":2408},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2452,2453,2454,2455],{"name":2397,"slug":2398,"type":16},{"name":2400,"slug":2401,"type":16},{"name":2403,"slug":2404,"type":16},{"name":2406,"slug":2407,"type":16},{"slug":2457,"name":2457,"fn":2458,"description":2459,"org":2460,"tags":2461,"stars":26,"repoUrl":27,"updatedAt":2467},"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},[2462,2463,2464],{"name":21,"slug":22,"type":16},{"name":24,"slug":25,"type":16},{"name":2465,"slug":2466,"type":16},"GitLab","gitlab","2026-07-16T06:00:19.516231",{"slug":2469,"name":2469,"fn":2470,"description":2471,"org":2472,"tags":2473,"stars":26,"repoUrl":27,"updatedAt":2480},"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},[2474,2475,2478,2479],{"name":21,"slug":22,"type":16},{"name":2476,"slug":2477,"type":16},"CI\u002FCD","ci-cd",{"name":24,"slug":25,"type":16},{"name":2322,"slug":2323,"type":16},"2026-07-16T06:03:28.123118",{"slug":2482,"name":2482,"fn":2483,"description":2484,"org":2485,"tags":2486,"stars":26,"repoUrl":27,"updatedAt":2492},"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},[2487,2488,2489],{"name":2369,"slug":2370,"type":16},{"name":2333,"slug":2334,"type":16},{"name":2490,"slug":2491,"type":16},"Operations","operations","2026-07-16T06:03:19.344038",{"slug":2494,"name":2494,"fn":2495,"description":2496,"org":2497,"tags":2498,"stars":26,"repoUrl":27,"updatedAt":2504},"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},[2499,2500,2503],{"name":2322,"slug":2323,"type":16},{"name":2501,"slug":2502,"type":16},"Frontend","frontend",{"name":2336,"slug":2337,"type":16},"2026-07-16T06:03:27.078987",{"slug":2506,"name":2506,"fn":2507,"description":2508,"org":2509,"tags":2510,"stars":26,"repoUrl":27,"updatedAt":2517},"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},[2511,2512,2515,2516],{"name":21,"slug":22,"type":16},{"name":2513,"slug":2514,"type":16},"Code Review","code-review",{"name":24,"slug":25,"type":16},{"name":2322,"slug":2323,"type":16},"2026-07-16T06:03:20.380044"]