[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-red-hat-developer-raise-pr":3,"mdc-rgwoht-key":34,"related-org-red-hat-developer-raise-pr":3473,"related-repo-red-hat-developer-raise-pr":3646},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"raise-pr","automate pull request workflows","Automate the full PR workflow for rhdh-plugins and community-plugins monorepos: detect workspace, build, generate changeset, commit, push, and create the GitHub PR. Auto-detects which repo you're in. Supports --a auto-approve mode to skip all approval gates.   Accepts an optional Jira key\u002FURL or GitHub issue URL to link the PR to a tracked issue (adds comments, transitions, and auto-close links). Use when asked to \"raise a PR\", \"create a PR\", \"submit a PR\", \"open a PR\", \"push my changes\", \"make a PR for this plugin\", or \"PR workflow\". Also use when user says \"raise pr\", \"\u002Fpr\", or mentions creating a pull request in rhdh-plugins or community-plugins.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"red-hat-developer","Red Hat Developer","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fred-hat-developer.png","redhat-developer",[13,17,20],{"name":14,"slug":15,"type":16},"GitHub","github","tag",{"name":18,"slug":19,"type":16},"CI\u002FCD","ci-cd",{"name":21,"slug":22,"type":16},"Pull Requests","pull-requests",15,"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill","2026-07-29T06:00:32.662391",null,28,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Claude Code skill for RHDH plugin lifecycle management","https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-skill\u002Ftree\u002FHEAD\u002Fskills\u002Fraise-pr","---\nname: raise-pr\ndescription: >\n  Automate the full PR workflow for rhdh-plugins and community-plugins monorepos:\n  detect workspace, build, generate changeset, commit, push, and create the GitHub PR.\n  Auto-detects which repo you're in. Supports --a auto-approve mode to skip all\n  approval gates.   Accepts an optional Jira key\u002FURL or GitHub issue URL to link the PR to\n  a tracked issue (adds comments, transitions, and auto-close links). Use when asked to \"raise a PR\",\n  \"create a PR\", \"submit a PR\", \"open a PR\", \"push my changes\", \"make a PR for this\n  plugin\", or \"PR workflow\". Also use when user says \"raise pr\", \"\u002Fpr\", or mentions\n  creating a pull request in rhdh-plugins or community-plugins.\n---\n\n\u003Cessential_principles>\n\n\u003Cprinciple name=\"skill_entry_banner\">\nAs the very first action when the skill is invoked, echo a skill entry banner to the terminal:\n```\necho \"================ Using Raise PR Skill ===========\"\n```\nThis must happen before any other work (reading references, detecting repo profile, etc.).\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"scoped_dist_cleanup\">\nPre-build cleanup uses `rm -rf plugins\u002F*\u002Fdist packages\u002F*\u002Fdist` scoped to the workspace directory. If permission errors occur (root-owned files from a prior Docker build), **skip only `yarn build:all`** and warn the user to run `sudo chown -R $(whoami) .` to fix ownership permanently. Never use `sudo` in the skill itself. Never use `find -name dist` or any broad recursive search — that deletes `dist\u002F` inside `node_modules` and breaks everything.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"changesets_skip_packages\">\nOnly plugins under `plugins\u002F*` with published-source changes need changesets. Always ignore `packages\u002F*` — those are private app\u002Fbackend packages that are never published. Within each plugin, only include it if changes touch `src\u002F` or other published paths (root `index.ts`, `config.d.ts`, `package.json`). Changes only in `dev\u002F`, `tests\u002F`, `__fixtures__\u002F`, or storybook stories do not require a changeset.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"baseline_diffing\">\nCapture `git status --porcelain` before builds as the baseline. After builds, only stage files that are new relative to that baseline. Pre-existing dirty files (local config overrides, dev fixtures) must never be staged.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"step_echo_banners\">\nBefore executing each numbered Step, echo a clearly visible banner to the terminal so the user can track progress:\n```\necho \"================ Step N — \u003CStep title> ===========\"\n```\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"no_manual_pr_creation\">\nNEVER bypass this skill by running `gh pr create` or `git push` directly. When another skill (e.g., `bug-fix`) chains into `raise-pr`, you MUST read and follow every step of this skill sequentially — especially Step 10 (push, upload recordings, create PR). Skipping steps or substituting manual commands causes broken PR descriptions, missing recordings, and missing changesets. If you find yourself about to run `gh pr create` without having completed Steps 1–9 first, STOP — you are violating the skill contract.\n\u003C\u002Fprinciple>\n\n\u003Cprinciple name=\"recordings_upload_hard_gate\">\nWhen `recordings` caller context is provided, the GIF upload in Step 10.2 is MANDATORY — not optional. You MUST upload both GIF files to the dedicated `screenrecordings` branch on the user's fork via the GitHub Contents API and extract real `raw.githubusercontent.com` URLs BEFORE constructing the PR body. NEVER upload to the feature branch (it pollutes the PR diff and lands on upstream main). NEVER use placeholder URLs, `github.com\u002Fuser-attachments\u002Fassets\u002F` URLs, or any fabricated URLs. If the upload fails, you MUST either retry or inform the user that manual upload is needed — do NOT silently proceed with broken image links.\n\u003C\u002Fprinciple>\n\n\u003C\u002Fessential_principles>\n\n## Prerequisites\n\n- **`gh` CLI** — GitHub CLI must be installed and authenticated (`gh auth status` should show logged in). Install: https:\u002F\u002Fcli.github.com\u002F\n- **Jira MCP** — The Atlassian Rovo MCP server must be configured in your agent environment for Jira comment updates. Setup guide: https:\u002F\u002Fsupport.atlassian.com\u002Fatlassian-rovo-mcp-server\u002Fdocs\u002Fgetting-started-with-the-atlassian-remote-mcp-server\u002F\n  - If not configured, the skill will skip Jira updates and log a warning.\n- Working checkout of `rhdh-plugins` (or `community-plugins`)\n- `yarn` available on PATH\n\n---\n\n## Mode: check for `--a` flag\n\nCheck if the user invoked this skill with `--a` (auto-approve mode).\n\n- **`--a` present:** All approval gates (Steps 4, 8, and 9) are skipped — proceed automatically.\n- **`--a` absent (default):** Approval gates require user confirmation before proceeding.\n\n---\n\n## Step 1 — Detect repo profile\n\nRead `references\u002Frepo-profiles.md` and follow the detection logic. Run `git remote -v`, match the remote URLs, and load the matching profile (upstream repo, npm scope, PR body template, changeset docs link).\n\nIf no profile matches, ask the user which repo they are targeting before proceeding.\n\nStore the profile values for use in Steps 5, 6, and 10.\n\n---\n\n## Step 1.5 — Resolve issue context\n\nDetermine whether the PR is linked to a Jira issue, GitHub issue, or neither.\n\n### Source 1: Caller context (highest priority)\n\nIf another skill (e.g., `bug-fix`) provides caller context with `issue_source`, use it directly:\n\n- **`issue_source` = `jira`:** Use `jira_key`, `jira_url`, `jira_summary` from caller context. Skip detection.\n- **`issue_source` = `github`:** Use `github_issue_number`, `github_issue_url`, `github_issue_repo`, `github_issue_title` from caller context. Skip detection.\n\n### Source 2: User argument\n\nIf no caller context, parse the user's argument:\n\n**Jira patterns** (read `references\u002Fjira-input.md`):\n- If input matches `(RHIDP|RHDHBUGS|RHDHPLAN|RHDHSUPP)-\\d+` anywhere in the string, extract that as the key.\n- If input contains `atlassian.net\u002Fbrowse\u002F`, extract everything after `\u002Fbrowse\u002F` as the key.\n- Construct: `jira_url = https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002F\u003Cjira_key>`\n- Set `issue_source = jira`.\n\n**GitHub patterns** (read `bug-fix\u002Freferences\u002Fgithub-input.md`):\n- If input contains `github.com\u002F...\u002Fissues\u002F\u003CN>`, extract owner\u002Frepo and number.\n- If input matches `#\\d+`, resolve repo from `git remote -v`.\n- Construct: `github_issue_url = https:\u002F\u002Fgithub.com\u002F\u003Cowner>\u002F\u003Crepo>\u002Fissues\u002F\u003CN>`\n- Set `issue_source = github`.\n\n### Source 3: Branch name\n\nIf no argument matched, check the current branch name:\n- Jira key pattern: `fix\u002FRHDHBUGS-1934-keyboard-nav` → extract `RHDHBUGS-1934`, set `issue_source = jira`.\n- GitHub issue pattern: `fix\u002F607-report-portal-crash` → extract `#607` only if combined with repo context from `git remote -v`, set `issue_source = github`.\n\n### Source 4: Prompt\n\nAsk: \"Issue key, URL, or #number? (enter to skip)\".\n\n### Fetch summary (if not provided by caller)\n\n- **Jira:** Use the Jira REST API per `references\u002Fjira-input.md` to fetch the issue summary. If auth is not configured or the fetch fails, store `jira_summary = null` and continue.\n- **GitHub:** `gh issue view \u003CN> --repo \u003Crepo> --json title -q .title`. If fetch fails, store `github_issue_title = null` and continue.\n\n### Store\n\nSet `issue_source` = `jira`, `github`, or `null`. If `null`, all issue-specific behavior in later steps is skipped.\n\n---\n\n## Step 2 — Detect workspace(s) from staged changes\n\n1. Run `git diff --cached --name-only` to list all staged files.\n2. If no files are staged, stop: \"No staged changes found. Stage your changes with `git add` before running this command.\"\n3. Extract workspace names from staged file paths. The workspace is the second path segment (e.g., `workspaces\u002Fbulk-import\u002Fplugins\u002Ffoo\u002Fsrc\u002Findex.ts` → workspace `bulk-import`, path `workspaces\u002Fbulk-import`).\n4. If staged files span **multiple** workspaces, inform the user: \"Changes detected in **N** workspace(s): `\u003Clist>`. Proceed? (Yes\u002FNo)\". Wait for confirmation. If declined, stop.\n5. Store the workspace names and paths for later steps.\n\n---\n\n## Step 3 — Capture baseline snapshot\n\nRun `git status --porcelain` and save the full output as the **baseline snapshot**. This captures all files that were already dirty or untracked before any build commands run. Used in Step 7 to filter out pre-existing changes.\n\n---\n\n## Step 4 — Create branch (only if on `main`) [APPROVAL GATE]\n\n1. Run `git branch --show-current`.\n2. **If on `main`:**\n   a. Analyze the staged diff (`git diff --cached`) to understand the changes.\n   b. Generate a branch name:\n      - **If `jira_key` is set:** `fix\u002F\u003Cworkspace>-\u003CJIRA-KEY>-\u003Cshort-slug>` (e.g., `fix\u002Fadoption-insights-RHDHBUGS-1934-keyboard-nav-dropdown`). This matches the existing repo convention and enables auto-linking in the Jira Development panel.\n      - **If no Jira key:** `feat\u002F\u003Cworkspace>-\u003Cshort-description>` (use `fix\u002F` for bug fixes). For multiple workspaces, use a general description.\n   c. **If NOT auto-approve:** present the proposed branch name and a one-line summary. Wait for approval. **If auto-approve:** proceed immediately.\n   d. Run `git checkout -b \u003Cbranch-name>`.\n3. **If NOT on `main`:** skip branch creation. Inform the user: \"Already on branch `\u003Cname>`, skipping branch creation.\"\n\n---\n\n## Step 5 — Build and validate each workspace\n\nFor **each** workspace from Step 2, run the following commands **sequentially** inside the workspace directory (e.g., `workspaces\u002Fbulk-import`). If any command fails, **stop immediately** and report the error with the failing command, workspace, and output.\n\n### 5.0 — Pre-build cleanup\n\nRemove stale `dist\u002F` directories that may contain root-owned files from previous Docker or sudo builds:\n\n```\nrm -rf plugins\u002F*\u002Fdist packages\u002F*\u002Fdist\n```\n\n**If `EACCES` permission error occurs:** Set a flag `SKIP_BUILD_ALL=true`. Log a warning with the permanent fix:\n```\necho \"⚠️  Skipping yarn build:all — dist\u002F has root-owned files. Run 'sudo chown -R $(whoami) .' to fix ownership, then re-run.\"\n```\n\nNever use `sudo` in the skill itself — just tell the user how to fix it.\n\n### 5.1–5.6 — Build pipeline\n\nRun in order:\n\n1. `yarn` — install dependencies\n2. `yarn prettier:fix` — format code\n3. `yarn tsc:full` — full TypeScript type check\n4. `yarn build:all` — build all packages. **Skip this step if `SKIP_BUILD_ALL=true`** (from 5.0 fallback).\n5. `yarn test --watchAll=false` — run tests (disable Jest watch mode)\n6. `yarn build:api-reports:only` — generate\u002Fupdate API reports (depends on `tsc:full`, always runs)\n\n---\n\n## Step 6 — Generate changeset per workspace\n\nFor **each** workspace from Step 2, generate a changeset programmatically. Use the npm scope from the detected repo profile (Step 1).\n\n1. From the staged diff (`git diff --cached`), determine:\n   - Which **plugins** under this workspace are affected (look at `plugins\u002F*` only — **ignore `packages\u002F*`**).\n   - Within each plugin, only include it if changes touch published paths (`src\u002F`, root `index.ts`, `config.d.ts`, `package.json`). Skip plugins with changes only in `dev\u002F`, `tests\u002F`, `__fixtures__\u002F`, or stories.\n   - Read each affected plugin's `package.json` for its npm package name.\n   - Infer the semver bump: `patch` for fixes, `minor` for features, `major` for breaking changes.\n   - **If no plugins have published-source changes, skip changeset generation for this workspace.**\n2. Generate a short summary (1-2 sentences).\n3. Generate a random changeset ID: `\u003Cadjective>-\u003Cnoun>-\u003Cverb>` pattern, lowercase, 5-8 chars per word. Each workspace gets a unique ID.\n4. Write the changeset file to `\u003Cworkspace>\u002F.changeset\u002F\u003Crandom-id>.md`:\n\n```\n---\n'\u003Cpackage-name>': \u003Cbump-type>\n---\n\n\u003Csummary>\n```\n\nIf multiple packages are affected, list each on its own YAML line.\n\n**Do NOT run `yarn changeset` interactively.** Create files programmatically.\n\n---\n\n## Step 7 — Identify build-generated files\n\n1. Run `git status --porcelain` for the **current snapshot**.\n2. Compare against the **baseline snapshot** from Step 3.\n3. Files only in the current snapshot are build-generated (created by Step 5 builds or Step 6 changesets).\n4. Files already in the baseline are pre-existing — exclude them from staging.\n\n---\n\n## Step 8 — Stage build-generated files [APPROVAL GATE]\n\n1. Present the filtered list of build-generated files from Step 7.\n2. **If NOT auto-approve:** ask the user for approval before staging. **If auto-approve:** stage all automatically.\n3. Run `git add` for each approved file.\n\n---\n\n## Step 9 — Commit [APPROVAL GATE]\n\n1. Run `git diff --cached --stat` to review all staged changes.\n2. Generate a commit message in conventional commit format: `\u003Ctype>(\u003Cworkspace>): \u003Cshort description>` (e.g., `feat(bulk-import): add batch repository import support`).\n3. **If `issue_source` is set**, append a `Fixes:` trailer in the commit body — but **only if the issue type is allowed for this repo profile**:\n   - **rhdh-plugins:** Both Jira and GitHub issue URLs are allowed.\n   - **community-plugins:** Only GitHub issue URLs are allowed. If `issue_source = jira`, do NOT add a `Fixes:` trailer (Jira info must never appear in community-plugins git history).\n\n   Examples:\n   - rhdh-plugins + Jira: `Fixes: https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002FRHDHBUGS-1934`\n   - rhdh-plugins + GitHub: `Fixes: https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-plugins\u002Fissues\u002F607`\n   - community-plugins + GitHub: `Fixes: https:\u002F\u002Fgithub.com\u002Fbackstage\u002Fcommunity-plugins\u002Fissues\u002F3574`\n   - community-plugins + Jira: **no trailer** (omit entirely)\n\n```\nfix(adoption-insights): enable keyboard navigation in header date-range dropdown\n\nFixes: \u003Cissue_url>\n```\n\n4. **If NOT auto-approve:** present the commit message and staged file summary. Wait for approval. **If auto-approve:** commit immediately.\n5. Commit with the **`-s` flag** (Signed-off-by):\n\n```\ngit commit -s -m \"\u003Csubject>\" -m \"Fixes: \u003Cissue_url>\"\n```\n\nWhere `\u003Cissue_url>` is `jira_url` or `github_issue_url` depending on `issue_source`. If `issue_source` is null, or if the profile is community-plugins and `issue_source` is jira, omit the second `-m` flag.\n\n---\n\n## Step 10 — Push and create PR\n\n1. Push the branch:\n\n```\ngit push -u origin HEAD\n```\n\n2. **Upload recording GIFs to dedicated `screenrecordings` branch [HARD GATE when `recordings` is provided]**:\n\n   Skip this sub-step ONLY if `recordings` caller context is NOT provided. When `recordings` IS provided, this sub-step is MANDATORY — do NOT skip, defer, or substitute with placeholder URLs.\n\n   GIFs are uploaded to a dedicated `screenrecordings` branch on the user's fork — NOT the feature branch. This keeps the GIFs out of the PR diff and prevents them from landing on upstream `main` when the PR merges.\n\n   a. Verify both local GIF files exist before proceeding:\n   ```\n   ls -la \u003Crecordings.before> \u003Crecordings.after>\n   ```\n   If either file is missing, STOP and inform the user.\n\n   b. Determine the fork owner and repo name from the `origin` remote URL (e.g., `its-mitesh-kumar\u002Frhdh-plugins`).\n   c. Build the issue-specific upload path to avoid filename collisions across bug fixes:\n   - If `issue_source = jira`: `ISSUE_ID = \u003Cjira_key>` (e.g., `RHDHBUGS-2911`)\n   - If `issue_source = github`: `ISSUE_ID = \u003Cgithub_issue_number>` (e.g., `9834`)\n   - If no issue context: `ISSUE_ID = $(date +%Y%m%d-%H%M%S)`\n\n   Upload path: `screenrecordings\u002F\u003Cworkspace>-\u003CISSUE_ID>\u002Fbefore-fix.gif` and `...\u002Fafter-fix.gif`.\n\n   d. Ensure the `screenrecordings` branch exists on the fork. Check and create if needed:\n   ```\n   TOKEN=$(gh auth token)\n   # Check if branch exists\n   HTTP_STATUS=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n     -H \"Authorization: token $TOKEN\" \\\n     \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fgit\u002Fref\u002Fheads\u002Fscreenrecordings\")\n   if [ \"$HTTP_STATUS\" != \"200\" ]; then\n     # Get the SHA of the default branch HEAD\n     DEFAULT_SHA=$(curl -s -H \"Authorization: token $TOKEN\" \\\n       \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fgit\u002Fref\u002Fheads\u002Fmain\" | \\\n       python3 -c \"import sys,json; print(json.load(sys.stdin)['object']['sha'])\")\n     # Create the branch\n     curl -s -X POST \\\n       -H \"Authorization: token $TOKEN\" \\\n       -H \"Accept: application\u002Fvnd.github+json\" \\\n       -d '{\"ref\":\"refs\u002Fheads\u002Fscreenrecordings\",\"sha\":\"'\"$DEFAULT_SHA\"'\"}' \\\n       \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fgit\u002Frefs\"\n   fi\n   ```\n\n   e. For each GIF file (`recordings.before` and `recordings.after`), upload to the `screenrecordings` branch via the GitHub Contents API:\n\n   ```\n   GIF_B64=$(base64 -i \u003Clocal-gif-path>)\n   RESPONSE=$(curl -s -X PUT \\\n     -H \"Authorization: token $TOKEN\" \\\n     -H \"Accept: application\u002Fvnd.github+json\" \\\n     -d '{\"message\":\"docs: add \u003Cbefore|after>-fix recording for \u003Cworkspace>-\u003CISSUE_ID>\",\"content\":\"'\"$GIF_B64\"'\",\"branch\":\"screenrecordings\"}' \\\n     \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fcontents\u002Fscreenrecordings\u002F\u003Cworkspace>-\u003CISSUE_ID>\u002F\u003Cbefore|after>-fix.gif\")\n   echo \"$RESPONSE\" | python3 -c \"import sys,json; d=json.load(sys.stdin); url=d.get('content',{}).get('download_url',''); print('download_url:', url); exit(0 if url.startswith('https:\u002F\u002Fraw.githubusercontent.com') else 1)\"\n   ```\n\n   f. Extract the `download_url` from the JSON response — this is the `raw.githubusercontent.com` URL. **Verify** that the URL starts with `https:\u002F\u002Fraw.githubusercontent.com\u002F` — if it does not, the upload failed.\n   g. Store both URLs: `before_gif_url`, `after_gif_url`.\n   h. Echo a verification banner:\n   ```\n   echo \"✅ GIF upload verified: before=$before_gif_url after=$after_gif_url\"\n   ```\n\n   **If upload fails:** Retry once. If the retry also fails, log a warning and inform the user to manually drag GIFs into the PR description on GitHub. Use placeholder text `_(Recording upload failed — drag GIF manually)_` in the PR body instead of a broken image link. NEVER fabricate a URL that looks real but does not resolve.\n\n3. Generate a PR title from the commit subject line.\n4. Build the PR body from the detected repo profile template (Step 1). The body has conditional sections:\n   - **`## Fixed`** — repo-dependent:\n     - **rhdh-plugins:** include if `issue_source` is set. Jira: `- [\u003CJIRA-KEY>](\u003Cjira_url>) — \u003Cjira_summary>`. GitHub: `- Fixes \u003Cgithub_issue_url>`.\n     - **community-plugins:** include ONLY if `issue_source = github`. Use `- Fixes \u003Cgithub_issue_url>` (triggers auto-close). NEVER include Jira info — omit `## Fixed` entirely when `issue_source = jira`.\n   - **`## UI before changes` \u002F `## UI after changes`** — include only if `recordings` are provided in caller context. Use the `raw.githubusercontent.com` URLs from sub-step 2 in the markdown: `![Before fix](\u003Cbefore_gif_url>)` \u002F `![After fix](\u003Cafter_gif_url>)`. **CRITICAL**: Both URLs MUST have been obtained from the GitHub Contents API response in sub-step 2. NEVER construct, guess, or fabricate these URLs. If sub-step 2 failed and you have no valid URLs, use the placeholder text from the failure path instead of a broken image link.\n   - **`pr_description_extra`** — if provided by caller context (e.g., root cause analysis from `bug-fix`), insert it after the generated description paragraph.\n   - **`## Test Plan`** — include only if `test_plan` is provided in caller context. Insert the markdown checklist as-is.\n   - **`## Checklist`** — always present.\n   - **`## Note`** — include whenever `issue_source` is present in caller context (indicating `bug-fix` invoked `raise-pr`). Contains the skill attribution disclaimer. Omit for standalone `raise-pr` invocations.\n5. Create the PR using `gh pr create` with the repo-appropriate template. Use the upstream repo value for `--repo` and `main` for `--base`. Pass the body via HEREDOC:\n\n```\ngh pr create --repo \u003Cupstream-repo> --base main --title \"\u003Ctitle>\" --body \"$(cat \u003C\u003C'EOF'\n\u003Cassembled PR body>\nEOF\n)\"\n```\n\n6. Capture and store the PR URL for Step 11.\n7. Display the PR URL.\n\n---\n\n## Step 11 — Post-PR issue updates\n\n**Skip this step entirely if `issue_source` is null.**\n\n### If `issue_source` = `jira`\n\n1. **Comment** on the Jira issue documenting the PR submission:\n   ```\n   Use the Jira MCP `add_jira_comment` tool:\n     issueKey: \"\u003Cjira_key>\"\n     body: \"PR submitted: \u003CPR_URL>\"\n   ```\n\n2. **Transition** the issue status to \"Review\" (if ACLI is available):\n   ```\n   acli jira workitem transition --key \"\u003Cjira_key>\" --status \"Review\" --yes\n   ```\n   Query available transitions first: `acli jira workitem getTransitions --key \"\u003Cjira_key>\"`. If \"Review\" is not available, skip the transition and log a warning.\n\n3. **Add web link** — add the PR URL as a remote link on the Jira issue (if REST auth is available):\n   ```\n   POST \u002Frest\u002Fapi\u002F3\u002Fissue\u002F\u003Cjira_key>\u002Fremotelink\n   { \"object\": { \"url\": \"\u003CPR_URL>\", \"title\": \"GitHub PR: \u003CPR_title>\" } }\n   ```\n   See `references\u002Fjira-input.md` for REST API patterns.\n\n**If any Jira call fails:** Log a warning and continue — the PR has been created successfully:\n```\necho \"⚠️  Could not update \u003Cjira_key>. Add manually: \u003CPR_URL>\"\n```\n\n### If `issue_source` = `github`\n\n1. **Comment** on the GitHub issue:\n   ```\n   gh issue comment \u003Cgithub_issue_number> --repo \u003Cgithub_issue_repo> --body \"Fix submitted: \u003CPR_URL>\"\n   ```\n\n2. **Auto-close** — no explicit action needed. The `Fixes \u003Cgithub_issue_url>` in the PR body (Step 10) causes GitHub to automatically close the issue when the PR merges.\n\n**If the comment fails:** Log a warning and continue:\n```\necho \"⚠️  Could not comment on #\u003Cgithub_issue_number>. Add manually: \u003CPR_URL>\"\n```\n\n---\n\n## Gotchas\n\n- **Fork workflows:** The user may have `origin` pointing to their fork and `upstream` to the canonical repo. Detection checks all remotes, not just `origin`. The `--repo` flag on `gh pr create` targets the canonical upstream regardless of which remote `origin` points to.\n- **Multiple workspaces:** Each workspace gets its own build cycle (Step 5) and changeset (Step 6). The commit (Step 9) bundles everything into one commit. If the user prefers separate PRs per workspace, they should stage and run the skill once per workspace.\n- **Changeset ID collisions:** Each workspace must get a unique random ID. If generating for multiple workspaces in one run, track used IDs and avoid duplicates.\n\n## Caller Context (optional)\n\nWhen another skill chains into `raise-pr`, it may provide a **caller context** with pre-resolved values. If present, these override the defaults — skip detection for any field that is already provided.\n\n| Field | Type | Used in | Description |\n|-------|------|---------|-------------|\n| `issue_source` | string | Steps 1.5, 9, 10, 11 | `\"jira\"` or `\"github\"` — determines which issue-specific logic to follow |\n| `jira_key` | string | Steps 1.5, 4, 9, 10, 11 | Pre-resolved Jira issue key (skip Step 1.5 detection). Jira only. |\n| `jira_url` | string | Steps 9, 10, 11 | Full Jira browse URL. Jira only. |\n| `jira_summary` | string | Step 10 | Issue summary for the PR body `## Fixed` section. Jira only. |\n| `github_issue_number` | number | Steps 1.5, 10, 11 | GitHub issue number. GitHub only. |\n| `github_issue_url` | string | Steps 9, 10, 11 | Full GitHub issue URL (e.g., `https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-plugins\u002Fissues\u002F607`). GitHub only. |\n| `github_issue_repo` | string | Steps 10, 11 | `owner\u002Frepo` (e.g., `redhat-developer\u002Frhdh-plugins`). GitHub only. |\n| `github_issue_title` | string | Step 10 | Issue title for the PR body `## Fixed` section. GitHub only. |\n| `recordings` | object | Step 10 | `{ before: \"\u003Clocal-gif-path>\", after: \"\u003Clocal-gif-path>\" }` — local GIF paths; `raise-pr` uploads them to the branch via GitHub Contents API and uses the resulting `raw.githubusercontent.com` URLs in the PR body. `null` in no-e2e mode. |\n| `pr_description_extra` | string | Step 10 | Extra text inserted after the description (e.g., root cause analysis) |\n| `test_plan` | string | Step 10 | Markdown checklist for the `## Test Plan` section (e.g., `\"- [ ] Open menu\\n- [ ] Verify scrollbar on hover\"`) |\n\nSkills that chain into `raise-pr`:\n\n- **`bug-fix`** — provides `issue_source` plus the relevant issue fields, optionally `recordings` (full-e2e mode only), `pr_description_extra`, and `test_plan`.\n\n\u003Creference_index>\n\n## Reference Index\n\n| Reference | Load when... |\n|-----------|-------------|\n| `references\u002Frepo-profiles.md` | Always — at the start of every invocation (Step 1) |\n| `references\u002Fjira-input.md` | When resolving Jira context (Step 1.5, `issue_source` = `jira`) |\n| `bug-fix\u002Freferences\u002Fgithub-input.md` | When resolving GitHub issue context (Step 1.5, `issue_source` = `github`) |\n\n\u003C\u002Freference_index>\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,54,60,66,72,85,91,97,102,109,204,208,222,234,267,270,276,297,302,307,310,316,321,328,349,445,451,456,474,535,551,605,611,616,678,684,689,695,748,754,792,795,801,892,895,901,920,923,943,1086,1089,1095,1128,1134,1147,1158,1183,1192,1205,1211,1216,1304,1307,1313,1323,1509,1518,1523,1541,1544,1550,1591,1594,1604,1638,1641,1651,1806,1815,1851,1860,1915,1918,1924,1932,1941,2559,2568,2582,2585,2591,2606,2622,2707,2717,2726,2742,2781,2791,2800,2803,2809,2885,2891,2910,3309,3320,3363,3368,3374,3468],{"type":40,"tag":41,"props":42,"children":43},"element","p",{},[44],{"type":45,"value":46},"text","\u003Cessential_principles>",{"type":40,"tag":48,"props":49,"children":51},"principle",{"name":50},"skill_entry_banner",[52],{"type":45,"value":53},"\nAs the very first action when the skill is invoked, echo a skill entry banner to the terminal:\n```\necho \"================ Using Raise PR Skill ===========\"\n```\nThis must happen before any other work (reading references, detecting repo profile, etc.).\n",{"type":40,"tag":48,"props":55,"children":57},{"name":56},"scoped_dist_cleanup",[58],{"type":45,"value":59},"\nPre-build cleanup uses `rm -rf plugins\u002F*\u002Fdist packages\u002F*\u002Fdist` scoped to the workspace directory. If permission errors occur (root-owned files from a prior Docker build), **skip only `yarn build:all`** and warn the user to run `sudo chown -R $(whoami) .` to fix ownership permanently. Never use `sudo` in the skill itself. Never use `find -name dist` or any broad recursive search — that deletes `dist\u002F` inside `node_modules` and breaks everything.\n",{"type":40,"tag":48,"props":61,"children":63},{"name":62},"changesets_skip_packages",[64],{"type":45,"value":65},"\nOnly plugins under `plugins\u002F*` with published-source changes need changesets. Always ignore `packages\u002F*` — those are private app\u002Fbackend packages that are never published. Within each plugin, only include it if changes touch `src\u002F` or other published paths (root `index.ts`, `config.d.ts`, `package.json`). Changes only in `dev\u002F`, `tests\u002F`, `__fixtures__\u002F`, or storybook stories do not require a changeset.\n",{"type":40,"tag":48,"props":67,"children":69},{"name":68},"baseline_diffing",[70],{"type":45,"value":71},"\nCapture `git status --porcelain` before builds as the baseline. After builds, only stage files that are new relative to that baseline. Pre-existing dirty files (local config overrides, dev fixtures) must never be staged.\n",{"type":40,"tag":48,"props":73,"children":75},{"name":74},"step_echo_banners",[76,78],{"type":45,"value":77},"\nBefore executing each numbered Step, echo a clearly visible banner to the terminal so the user can track progress:\n```\necho \"================ Step N — ",{"type":40,"tag":79,"props":80,"children":82},"step",{"title":81},"",[83],{"type":45,"value":84}," ===========\"\n```\n",{"type":40,"tag":48,"props":86,"children":88},{"name":87},"no_manual_pr_creation",[89],{"type":45,"value":90},"\nNEVER bypass this skill by running `gh pr create` or `git push` directly. When another skill (e.g., `bug-fix`) chains into `raise-pr`, you MUST read and follow every step of this skill sequentially — especially Step 10 (push, upload recordings, create PR). Skipping steps or substituting manual commands causes broken PR descriptions, missing recordings, and missing changesets. If you find yourself about to run `gh pr create` without having completed Steps 1–9 first, STOP — you are violating the skill contract.\n",{"type":40,"tag":48,"props":92,"children":94},{"name":93},"recordings_upload_hard_gate",[95],{"type":45,"value":96},"\nWhen `recordings` caller context is provided, the GIF upload in Step 10.2 is MANDATORY — not optional. You MUST upload both GIF files to the dedicated `screenrecordings` branch on the user's fork via the GitHub Contents API and extract real `raw.githubusercontent.com` URLs BEFORE constructing the PR body. NEVER upload to the feature branch (it pollutes the PR diff and lands on upstream main). NEVER use placeholder URLs, `github.com\u002Fuser-attachments\u002Fassets\u002F` URLs, or any fabricated URLs. If the upload fails, you MUST either retry or inform the user that manual upload is needed — do NOT silently proceed with broken image links.\n",{"type":40,"tag":41,"props":98,"children":99},{},[100],{"type":45,"value":101},"\u003C\u002Fessential_principles>",{"type":40,"tag":103,"props":104,"children":106},"h2",{"id":105},"prerequisites",[107],{"type":45,"value":108},"Prerequisites",{"type":40,"tag":110,"props":111,"children":112},"ul",{},[113,148,172,193],{"type":40,"tag":114,"props":115,"children":116},"li",{},[117,130,132,138,140],{"type":40,"tag":118,"props":119,"children":120},"strong",{},[121,128],{"type":40,"tag":122,"props":123,"children":125},"code",{"className":124},[],[126],{"type":45,"value":127},"gh",{"type":45,"value":129}," CLI",{"type":45,"value":131}," — GitHub CLI must be installed and authenticated (",{"type":40,"tag":122,"props":133,"children":135},{"className":134},[],[136],{"type":45,"value":137},"gh auth status",{"type":45,"value":139}," should show logged in). Install: ",{"type":40,"tag":141,"props":142,"children":146},"a",{"href":143,"rel":144},"https:\u002F\u002Fcli.github.com\u002F",[145],"nofollow",[147],{"type":45,"value":143},{"type":40,"tag":114,"props":149,"children":150},{},[151,156,158,164],{"type":40,"tag":118,"props":152,"children":153},{},[154],{"type":45,"value":155},"Jira MCP",{"type":45,"value":157}," — The Atlassian Rovo MCP server must be configured in your agent environment for Jira comment updates. Setup guide: ",{"type":40,"tag":141,"props":159,"children":162},{"href":160,"rel":161},"https:\u002F\u002Fsupport.atlassian.com\u002Fatlassian-rovo-mcp-server\u002Fdocs\u002Fgetting-started-with-the-atlassian-remote-mcp-server\u002F",[145],[163],{"type":45,"value":160},{"type":40,"tag":110,"props":165,"children":166},{},[167],{"type":40,"tag":114,"props":168,"children":169},{},[170],{"type":45,"value":171},"If not configured, the skill will skip Jira updates and log a warning.",{"type":40,"tag":114,"props":173,"children":174},{},[175,177,183,185,191],{"type":45,"value":176},"Working checkout of ",{"type":40,"tag":122,"props":178,"children":180},{"className":179},[],[181],{"type":45,"value":182},"rhdh-plugins",{"type":45,"value":184}," (or ",{"type":40,"tag":122,"props":186,"children":188},{"className":187},[],[189],{"type":45,"value":190},"community-plugins",{"type":45,"value":192},")",{"type":40,"tag":114,"props":194,"children":195},{},[196,202],{"type":40,"tag":122,"props":197,"children":199},{"className":198},[],[200],{"type":45,"value":201},"yarn",{"type":45,"value":203}," available on PATH",{"type":40,"tag":205,"props":206,"children":207},"hr",{},[],{"type":40,"tag":103,"props":209,"children":211},{"id":210},"mode-check-for-a-flag",[212,214,220],{"type":45,"value":213},"Mode: check for ",{"type":40,"tag":122,"props":215,"children":217},{"className":216},[],[218],{"type":45,"value":219},"--a",{"type":45,"value":221}," flag",{"type":40,"tag":41,"props":223,"children":224},{},[225,227,232],{"type":45,"value":226},"Check if the user invoked this skill with ",{"type":40,"tag":122,"props":228,"children":230},{"className":229},[],[231],{"type":45,"value":219},{"type":45,"value":233}," (auto-approve mode).",{"type":40,"tag":110,"props":235,"children":236},{},[237,252],{"type":40,"tag":114,"props":238,"children":239},{},[240,250],{"type":40,"tag":118,"props":241,"children":242},{},[243,248],{"type":40,"tag":122,"props":244,"children":246},{"className":245},[],[247],{"type":45,"value":219},{"type":45,"value":249}," present:",{"type":45,"value":251}," All approval gates (Steps 4, 8, and 9) are skipped — proceed automatically.",{"type":40,"tag":114,"props":253,"children":254},{},[255,265],{"type":40,"tag":118,"props":256,"children":257},{},[258,263],{"type":40,"tag":122,"props":259,"children":261},{"className":260},[],[262],{"type":45,"value":219},{"type":45,"value":264}," absent (default):",{"type":45,"value":266}," Approval gates require user confirmation before proceeding.",{"type":40,"tag":205,"props":268,"children":269},{},[],{"type":40,"tag":103,"props":271,"children":273},{"id":272},"step-1-detect-repo-profile",[274],{"type":45,"value":275},"Step 1 — Detect repo profile",{"type":40,"tag":41,"props":277,"children":278},{},[279,281,287,289,295],{"type":45,"value":280},"Read ",{"type":40,"tag":122,"props":282,"children":284},{"className":283},[],[285],{"type":45,"value":286},"references\u002Frepo-profiles.md",{"type":45,"value":288}," and follow the detection logic. Run ",{"type":40,"tag":122,"props":290,"children":292},{"className":291},[],[293],{"type":45,"value":294},"git remote -v",{"type":45,"value":296},", match the remote URLs, and load the matching profile (upstream repo, npm scope, PR body template, changeset docs link).",{"type":40,"tag":41,"props":298,"children":299},{},[300],{"type":45,"value":301},"If no profile matches, ask the user which repo they are targeting before proceeding.",{"type":40,"tag":41,"props":303,"children":304},{},[305],{"type":45,"value":306},"Store the profile values for use in Steps 5, 6, and 10.",{"type":40,"tag":205,"props":308,"children":309},{},[],{"type":40,"tag":103,"props":311,"children":313},{"id":312},"step-15-resolve-issue-context",[314],{"type":45,"value":315},"Step 1.5 — Resolve issue context",{"type":40,"tag":41,"props":317,"children":318},{},[319],{"type":45,"value":320},"Determine whether the PR is linked to a Jira issue, GitHub issue, or neither.",{"type":40,"tag":322,"props":323,"children":325},"h3",{"id":324},"source-1-caller-context-highest-priority",[326],{"type":45,"value":327},"Source 1: Caller context (highest priority)",{"type":40,"tag":41,"props":329,"children":330},{},[331,333,339,341,347],{"type":45,"value":332},"If another skill (e.g., ",{"type":40,"tag":122,"props":334,"children":336},{"className":335},[],[337],{"type":45,"value":338},"bug-fix",{"type":45,"value":340},") provides caller context with ",{"type":40,"tag":122,"props":342,"children":344},{"className":343},[],[345],{"type":45,"value":346},"issue_source",{"type":45,"value":348},", use it directly:",{"type":40,"tag":110,"props":350,"children":351},{},[352,398],{"type":40,"tag":114,"props":353,"children":354},{},[355,373,375,381,383,389,390,396],{"type":40,"tag":118,"props":356,"children":357},{},[358,363,365,371],{"type":40,"tag":122,"props":359,"children":361},{"className":360},[],[362],{"type":45,"value":346},{"type":45,"value":364}," = ",{"type":40,"tag":122,"props":366,"children":368},{"className":367},[],[369],{"type":45,"value":370},"jira",{"type":45,"value":372},":",{"type":45,"value":374}," Use ",{"type":40,"tag":122,"props":376,"children":378},{"className":377},[],[379],{"type":45,"value":380},"jira_key",{"type":45,"value":382},", ",{"type":40,"tag":122,"props":384,"children":386},{"className":385},[],[387],{"type":45,"value":388},"jira_url",{"type":45,"value":382},{"type":40,"tag":122,"props":391,"children":393},{"className":392},[],[394],{"type":45,"value":395},"jira_summary",{"type":45,"value":397}," from caller context. Skip detection.",{"type":40,"tag":114,"props":399,"children":400},{},[401,416,417,423,424,430,431,437,438,444],{"type":40,"tag":118,"props":402,"children":403},{},[404,409,410,415],{"type":40,"tag":122,"props":405,"children":407},{"className":406},[],[408],{"type":45,"value":346},{"type":45,"value":364},{"type":40,"tag":122,"props":411,"children":413},{"className":412},[],[414],{"type":45,"value":15},{"type":45,"value":372},{"type":45,"value":374},{"type":40,"tag":122,"props":418,"children":420},{"className":419},[],[421],{"type":45,"value":422},"github_issue_number",{"type":45,"value":382},{"type":40,"tag":122,"props":425,"children":427},{"className":426},[],[428],{"type":45,"value":429},"github_issue_url",{"type":45,"value":382},{"type":40,"tag":122,"props":432,"children":434},{"className":433},[],[435],{"type":45,"value":436},"github_issue_repo",{"type":45,"value":382},{"type":40,"tag":122,"props":439,"children":441},{"className":440},[],[442],{"type":45,"value":443},"github_issue_title",{"type":45,"value":397},{"type":40,"tag":322,"props":446,"children":448},{"id":447},"source-2-user-argument",[449],{"type":45,"value":450},"Source 2: User argument",{"type":40,"tag":41,"props":452,"children":453},{},[454],{"type":45,"value":455},"If no caller context, parse the user's argument:",{"type":40,"tag":41,"props":457,"children":458},{},[459,464,466,472],{"type":40,"tag":118,"props":460,"children":461},{},[462],{"type":45,"value":463},"Jira patterns",{"type":45,"value":465}," (read ",{"type":40,"tag":122,"props":467,"children":469},{"className":468},[],[470],{"type":45,"value":471},"references\u002Fjira-input.md",{"type":45,"value":473},"):",{"type":40,"tag":110,"props":475,"children":476},{},[477,490,511,522],{"type":40,"tag":114,"props":478,"children":479},{},[480,482,488],{"type":45,"value":481},"If input matches ",{"type":40,"tag":122,"props":483,"children":485},{"className":484},[],[486],{"type":45,"value":487},"(RHIDP|RHDHBUGS|RHDHPLAN|RHDHSUPP)-\\d+",{"type":45,"value":489}," anywhere in the string, extract that as the key.",{"type":40,"tag":114,"props":491,"children":492},{},[493,495,501,503,509],{"type":45,"value":494},"If input contains ",{"type":40,"tag":122,"props":496,"children":498},{"className":497},[],[499],{"type":45,"value":500},"atlassian.net\u002Fbrowse\u002F",{"type":45,"value":502},", extract everything after ",{"type":40,"tag":122,"props":504,"children":506},{"className":505},[],[507],{"type":45,"value":508},"\u002Fbrowse\u002F",{"type":45,"value":510}," as the key.",{"type":40,"tag":114,"props":512,"children":513},{},[514,516],{"type":45,"value":515},"Construct: ",{"type":40,"tag":122,"props":517,"children":519},{"className":518},[],[520],{"type":45,"value":521},"jira_url = https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002F\u003Cjira_key>",{"type":40,"tag":114,"props":523,"children":524},{},[525,527,533],{"type":45,"value":526},"Set ",{"type":40,"tag":122,"props":528,"children":530},{"className":529},[],[531],{"type":45,"value":532},"issue_source = jira",{"type":45,"value":534},".",{"type":40,"tag":41,"props":536,"children":537},{},[538,543,544,550],{"type":40,"tag":118,"props":539,"children":540},{},[541],{"type":45,"value":542},"GitHub patterns",{"type":45,"value":465},{"type":40,"tag":122,"props":545,"children":547},{"className":546},[],[548],{"type":45,"value":549},"bug-fix\u002Freferences\u002Fgithub-input.md",{"type":45,"value":473},{"type":40,"tag":110,"props":552,"children":553},{},[554,566,584,594],{"type":40,"tag":114,"props":555,"children":556},{},[557,558,564],{"type":45,"value":494},{"type":40,"tag":122,"props":559,"children":561},{"className":560},[],[562],{"type":45,"value":563},"github.com\u002F...\u002Fissues\u002F\u003CN>",{"type":45,"value":565},", extract owner\u002Frepo and number.",{"type":40,"tag":114,"props":567,"children":568},{},[569,570,576,578,583],{"type":45,"value":481},{"type":40,"tag":122,"props":571,"children":573},{"className":572},[],[574],{"type":45,"value":575},"#\\d+",{"type":45,"value":577},", resolve repo from ",{"type":40,"tag":122,"props":579,"children":581},{"className":580},[],[582],{"type":45,"value":294},{"type":45,"value":534},{"type":40,"tag":114,"props":585,"children":586},{},[587,588],{"type":45,"value":515},{"type":40,"tag":122,"props":589,"children":591},{"className":590},[],[592],{"type":45,"value":593},"github_issue_url = https:\u002F\u002Fgithub.com\u002F\u003Cowner>\u002F\u003Crepo>\u002Fissues\u002F\u003CN>",{"type":40,"tag":114,"props":595,"children":596},{},[597,598,604],{"type":45,"value":526},{"type":40,"tag":122,"props":599,"children":601},{"className":600},[],[602],{"type":45,"value":603},"issue_source = github",{"type":45,"value":534},{"type":40,"tag":322,"props":606,"children":608},{"id":607},"source-3-branch-name",[609],{"type":45,"value":610},"Source 3: Branch name",{"type":40,"tag":41,"props":612,"children":613},{},[614],{"type":45,"value":615},"If no argument matched, check the current branch name:",{"type":40,"tag":110,"props":617,"children":618},{},[619,646],{"type":40,"tag":114,"props":620,"children":621},{},[622,624,630,632,638,640,645],{"type":45,"value":623},"Jira key pattern: ",{"type":40,"tag":122,"props":625,"children":627},{"className":626},[],[628],{"type":45,"value":629},"fix\u002FRHDHBUGS-1934-keyboard-nav",{"type":45,"value":631}," → extract ",{"type":40,"tag":122,"props":633,"children":635},{"className":634},[],[636],{"type":45,"value":637},"RHDHBUGS-1934",{"type":45,"value":639},", set ",{"type":40,"tag":122,"props":641,"children":643},{"className":642},[],[644],{"type":45,"value":532},{"type":45,"value":534},{"type":40,"tag":114,"props":647,"children":648},{},[649,651,657,658,664,666,671,672,677],{"type":45,"value":650},"GitHub issue pattern: ",{"type":40,"tag":122,"props":652,"children":654},{"className":653},[],[655],{"type":45,"value":656},"fix\u002F607-report-portal-crash",{"type":45,"value":631},{"type":40,"tag":122,"props":659,"children":661},{"className":660},[],[662],{"type":45,"value":663},"#607",{"type":45,"value":665}," only if combined with repo context from ",{"type":40,"tag":122,"props":667,"children":669},{"className":668},[],[670],{"type":45,"value":294},{"type":45,"value":639},{"type":40,"tag":122,"props":673,"children":675},{"className":674},[],[676],{"type":45,"value":603},{"type":45,"value":534},{"type":40,"tag":322,"props":679,"children":681},{"id":680},"source-4-prompt",[682],{"type":45,"value":683},"Source 4: Prompt",{"type":40,"tag":41,"props":685,"children":686},{},[687],{"type":45,"value":688},"Ask: \"Issue key, URL, or #number? (enter to skip)\".",{"type":40,"tag":322,"props":690,"children":692},{"id":691},"fetch-summary-if-not-provided-by-caller",[693],{"type":45,"value":694},"Fetch summary (if not provided by caller)",{"type":40,"tag":110,"props":696,"children":697},{},[698,723],{"type":40,"tag":114,"props":699,"children":700},{},[701,706,708,713,715,721],{"type":40,"tag":118,"props":702,"children":703},{},[704],{"type":45,"value":705},"Jira:",{"type":45,"value":707}," Use the Jira REST API per ",{"type":40,"tag":122,"props":709,"children":711},{"className":710},[],[712],{"type":45,"value":471},{"type":45,"value":714}," to fetch the issue summary. If auth is not configured or the fetch fails, store ",{"type":40,"tag":122,"props":716,"children":718},{"className":717},[],[719],{"type":45,"value":720},"jira_summary = null",{"type":45,"value":722}," and continue.",{"type":40,"tag":114,"props":724,"children":725},{},[726,731,733,739,741,747],{"type":40,"tag":118,"props":727,"children":728},{},[729],{"type":45,"value":730},"GitHub:",{"type":45,"value":732}," ",{"type":40,"tag":122,"props":734,"children":736},{"className":735},[],[737],{"type":45,"value":738},"gh issue view \u003CN> --repo \u003Crepo> --json title -q .title",{"type":45,"value":740},". If fetch fails, store ",{"type":40,"tag":122,"props":742,"children":744},{"className":743},[],[745],{"type":45,"value":746},"github_issue_title = null",{"type":45,"value":722},{"type":40,"tag":322,"props":749,"children":751},{"id":750},"store",[752],{"type":45,"value":753},"Store",{"type":40,"tag":41,"props":755,"children":756},{},[757,758,763,764,769,770,775,777,783,785,790],{"type":45,"value":526},{"type":40,"tag":122,"props":759,"children":761},{"className":760},[],[762],{"type":45,"value":346},{"type":45,"value":364},{"type":40,"tag":122,"props":765,"children":767},{"className":766},[],[768],{"type":45,"value":370},{"type":45,"value":382},{"type":40,"tag":122,"props":771,"children":773},{"className":772},[],[774],{"type":45,"value":15},{"type":45,"value":776},", or ",{"type":40,"tag":122,"props":778,"children":780},{"className":779},[],[781],{"type":45,"value":782},"null",{"type":45,"value":784},". If ",{"type":40,"tag":122,"props":786,"children":788},{"className":787},[],[789],{"type":45,"value":782},{"type":45,"value":791},", all issue-specific behavior in later steps is skipped.",{"type":40,"tag":205,"props":793,"children":794},{},[],{"type":40,"tag":103,"props":796,"children":798},{"id":797},"step-2-detect-workspaces-from-staged-changes",[799],{"type":45,"value":800},"Step 2 — Detect workspace(s) from staged changes",{"type":40,"tag":802,"props":803,"children":804},"ol",{},[805,818,831,860,887],{"type":40,"tag":114,"props":806,"children":807},{},[808,810,816],{"type":45,"value":809},"Run ",{"type":40,"tag":122,"props":811,"children":813},{"className":812},[],[814],{"type":45,"value":815},"git diff --cached --name-only",{"type":45,"value":817}," to list all staged files.",{"type":40,"tag":114,"props":819,"children":820},{},[821,823,829],{"type":45,"value":822},"If no files are staged, stop: \"No staged changes found. Stage your changes with ",{"type":40,"tag":122,"props":824,"children":826},{"className":825},[],[827],{"type":45,"value":828},"git add",{"type":45,"value":830}," before running this command.\"",{"type":40,"tag":114,"props":832,"children":833},{},[834,836,842,844,850,852,858],{"type":45,"value":835},"Extract workspace names from staged file paths. The workspace is the second path segment (e.g., ",{"type":40,"tag":122,"props":837,"children":839},{"className":838},[],[840],{"type":45,"value":841},"workspaces\u002Fbulk-import\u002Fplugins\u002Ffoo\u002Fsrc\u002Findex.ts",{"type":45,"value":843}," → workspace ",{"type":40,"tag":122,"props":845,"children":847},{"className":846},[],[848],{"type":45,"value":849},"bulk-import",{"type":45,"value":851},", path ",{"type":40,"tag":122,"props":853,"children":855},{"className":854},[],[856],{"type":45,"value":857},"workspaces\u002Fbulk-import",{"type":45,"value":859},").",{"type":40,"tag":114,"props":861,"children":862},{},[863,865,870,872,877,879,885],{"type":45,"value":864},"If staged files span ",{"type":40,"tag":118,"props":866,"children":867},{},[868],{"type":45,"value":869},"multiple",{"type":45,"value":871}," workspaces, inform the user: \"Changes detected in ",{"type":40,"tag":118,"props":873,"children":874},{},[875],{"type":45,"value":876},"N",{"type":45,"value":878}," workspace(s): ",{"type":40,"tag":122,"props":880,"children":882},{"className":881},[],[883],{"type":45,"value":884},"\u003Clist>",{"type":45,"value":886},". Proceed? (Yes\u002FNo)\". Wait for confirmation. If declined, stop.",{"type":40,"tag":114,"props":888,"children":889},{},[890],{"type":45,"value":891},"Store the workspace names and paths for later steps.",{"type":40,"tag":205,"props":893,"children":894},{},[],{"type":40,"tag":103,"props":896,"children":898},{"id":897},"step-3-capture-baseline-snapshot",[899],{"type":45,"value":900},"Step 3 — Capture baseline snapshot",{"type":40,"tag":41,"props":902,"children":903},{},[904,905,911,913,918],{"type":45,"value":809},{"type":40,"tag":122,"props":906,"children":908},{"className":907},[],[909],{"type":45,"value":910},"git status --porcelain",{"type":45,"value":912}," and save the full output as the ",{"type":40,"tag":118,"props":914,"children":915},{},[916],{"type":45,"value":917},"baseline snapshot",{"type":45,"value":919},". This captures all files that were already dirty or untracked before any build commands run. Used in Step 7 to filter out pre-existing changes.",{"type":40,"tag":205,"props":921,"children":922},{},[],{"type":40,"tag":103,"props":924,"children":926},{"id":925},"step-4-create-branch-only-if-on-main-approval-gate",[927,929,935,937],{"type":45,"value":928},"Step 4 — Create branch (only if on ",{"type":40,"tag":122,"props":930,"children":932},{"className":931},[],[933],{"type":45,"value":934},"main",{"type":45,"value":936},") ",{"type":40,"tag":938,"props":939,"children":940},"span",{},[941],{"type":45,"value":942},"APPROVAL GATE",{"type":40,"tag":802,"props":944,"children":945},{},[946,957,1062],{"type":40,"tag":114,"props":947,"children":948},{},[949,950,956],{"type":45,"value":809},{"type":40,"tag":122,"props":951,"children":953},{"className":952},[],[954],{"type":45,"value":955},"git branch --show-current",{"type":45,"value":534},{"type":40,"tag":114,"props":958,"children":959},{},[960,971,973,979,981],{"type":40,"tag":118,"props":961,"children":962},{},[963,965,970],{"type":45,"value":964},"If on ",{"type":40,"tag":122,"props":966,"children":968},{"className":967},[],[969],{"type":45,"value":934},{"type":45,"value":372},{"type":45,"value":972},"\na. Analyze the staged diff (",{"type":40,"tag":122,"props":974,"children":976},{"className":975},[],[977],{"type":45,"value":978},"git diff --cached",{"type":45,"value":980},") to understand the changes.\nb. Generate a branch name:\n",{"type":40,"tag":110,"props":982,"children":983},{},[984,1016],{"type":40,"tag":114,"props":985,"children":986},{},[987,999,1000,1006,1008,1014],{"type":40,"tag":118,"props":988,"children":989},{},[990,992,997],{"type":45,"value":991},"If ",{"type":40,"tag":122,"props":993,"children":995},{"className":994},[],[996],{"type":45,"value":380},{"type":45,"value":998}," is set:",{"type":45,"value":732},{"type":40,"tag":122,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":45,"value":1005},"fix\u002F\u003Cworkspace>-\u003CJIRA-KEY>-\u003Cshort-slug>",{"type":45,"value":1007}," (e.g., ",{"type":40,"tag":122,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":45,"value":1013},"fix\u002Fadoption-insights-RHDHBUGS-1934-keyboard-nav-dropdown",{"type":45,"value":1015},"). This matches the existing repo convention and enables auto-linking in the Jira Development panel.",{"type":40,"tag":114,"props":1017,"children":1018},{},[1019,1024,1025,1031,1033,1039,1041,1046,1048,1053,1055,1061],{"type":40,"tag":118,"props":1020,"children":1021},{},[1022],{"type":45,"value":1023},"If no Jira key:",{"type":45,"value":732},{"type":40,"tag":122,"props":1026,"children":1028},{"className":1027},[],[1029],{"type":45,"value":1030},"feat\u002F\u003Cworkspace>-\u003Cshort-description>",{"type":45,"value":1032}," (use ",{"type":40,"tag":122,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":45,"value":1038},"fix\u002F",{"type":45,"value":1040}," for bug fixes). For multiple workspaces, use a general description.\nc. ",{"type":40,"tag":118,"props":1042,"children":1043},{},[1044],{"type":45,"value":1045},"If NOT auto-approve:",{"type":45,"value":1047}," present the proposed branch name and a one-line summary. Wait for approval. ",{"type":40,"tag":118,"props":1049,"children":1050},{},[1051],{"type":45,"value":1052},"If auto-approve:",{"type":45,"value":1054}," proceed immediately.\nd. Run ",{"type":40,"tag":122,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":45,"value":1060},"git checkout -b \u003Cbranch-name>",{"type":45,"value":534},{"type":40,"tag":114,"props":1063,"children":1064},{},[1065,1076,1078,1084],{"type":40,"tag":118,"props":1066,"children":1067},{},[1068,1070,1075],{"type":45,"value":1069},"If NOT on ",{"type":40,"tag":122,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":45,"value":934},{"type":45,"value":372},{"type":45,"value":1077}," skip branch creation. Inform the user: \"Already on branch ",{"type":40,"tag":122,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":45,"value":1083},"\u003Cname>",{"type":45,"value":1085},", skipping branch creation.\"",{"type":40,"tag":205,"props":1087,"children":1088},{},[],{"type":40,"tag":103,"props":1090,"children":1092},{"id":1091},"step-5-build-and-validate-each-workspace",[1093],{"type":45,"value":1094},"Step 5 — Build and validate each workspace",{"type":40,"tag":41,"props":1096,"children":1097},{},[1098,1100,1105,1107,1112,1114,1119,1121,1126],{"type":45,"value":1099},"For ",{"type":40,"tag":118,"props":1101,"children":1102},{},[1103],{"type":45,"value":1104},"each",{"type":45,"value":1106}," workspace from Step 2, run the following commands ",{"type":40,"tag":118,"props":1108,"children":1109},{},[1110],{"type":45,"value":1111},"sequentially",{"type":45,"value":1113}," inside the workspace directory (e.g., ",{"type":40,"tag":122,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":45,"value":857},{"type":45,"value":1120},"). If any command fails, ",{"type":40,"tag":118,"props":1122,"children":1123},{},[1124],{"type":45,"value":1125},"stop immediately",{"type":45,"value":1127}," and report the error with the failing command, workspace, and output.",{"type":40,"tag":322,"props":1129,"children":1131},{"id":1130},"_50-pre-build-cleanup",[1132],{"type":45,"value":1133},"5.0 — Pre-build cleanup",{"type":40,"tag":41,"props":1135,"children":1136},{},[1137,1139,1145],{"type":45,"value":1138},"Remove stale ",{"type":40,"tag":122,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":45,"value":1144},"dist\u002F",{"type":45,"value":1146}," directories that may contain root-owned files from previous Docker or sudo builds:",{"type":40,"tag":1148,"props":1149,"children":1153},"pre",{"className":1150,"code":1152,"language":45},[1151],"language-text","rm -rf plugins\u002F*\u002Fdist packages\u002F*\u002Fdist\n",[1154],{"type":40,"tag":122,"props":1155,"children":1156},{"__ignoreMap":81},[1157],{"type":45,"value":1152},{"type":40,"tag":41,"props":1159,"children":1160},{},[1161,1173,1175,1181],{"type":40,"tag":118,"props":1162,"children":1163},{},[1164,1165,1171],{"type":45,"value":991},{"type":40,"tag":122,"props":1166,"children":1168},{"className":1167},[],[1169],{"type":45,"value":1170},"EACCES",{"type":45,"value":1172}," permission error occurs:",{"type":45,"value":1174}," Set a flag ",{"type":40,"tag":122,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":45,"value":1180},"SKIP_BUILD_ALL=true",{"type":45,"value":1182},". Log a warning with the permanent fix:",{"type":40,"tag":1148,"props":1184,"children":1187},{"className":1185,"code":1186,"language":45},[1151],"echo \"⚠️  Skipping yarn build:all — dist\u002F has root-owned files. Run 'sudo chown -R $(whoami) .' to fix ownership, then re-run.\"\n",[1188],{"type":40,"tag":122,"props":1189,"children":1190},{"__ignoreMap":81},[1191],{"type":45,"value":1186},{"type":40,"tag":41,"props":1193,"children":1194},{},[1195,1197,1203],{"type":45,"value":1196},"Never use ",{"type":40,"tag":122,"props":1198,"children":1200},{"className":1199},[],[1201],{"type":45,"value":1202},"sudo",{"type":45,"value":1204}," in the skill itself — just tell the user how to fix it.",{"type":40,"tag":322,"props":1206,"children":1208},{"id":1207},"_5156-build-pipeline",[1209],{"type":45,"value":1210},"5.1–5.6 — Build pipeline",{"type":40,"tag":41,"props":1212,"children":1213},{},[1214],{"type":45,"value":1215},"Run in order:",{"type":40,"tag":802,"props":1217,"children":1218},{},[1219,1229,1240,1251,1274,1285],{"type":40,"tag":114,"props":1220,"children":1221},{},[1222,1227],{"type":40,"tag":122,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":45,"value":201},{"type":45,"value":1228}," — install dependencies",{"type":40,"tag":114,"props":1230,"children":1231},{},[1232,1238],{"type":40,"tag":122,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":45,"value":1237},"yarn prettier:fix",{"type":45,"value":1239}," — format code",{"type":40,"tag":114,"props":1241,"children":1242},{},[1243,1249],{"type":40,"tag":122,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":45,"value":1248},"yarn tsc:full",{"type":45,"value":1250}," — full TypeScript type check",{"type":40,"tag":114,"props":1252,"children":1253},{},[1254,1260,1262,1272],{"type":40,"tag":122,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":45,"value":1259},"yarn build:all",{"type":45,"value":1261}," — build all packages. ",{"type":40,"tag":118,"props":1263,"children":1264},{},[1265,1267],{"type":45,"value":1266},"Skip this step if ",{"type":40,"tag":122,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":45,"value":1180},{"type":45,"value":1273}," (from 5.0 fallback).",{"type":40,"tag":114,"props":1275,"children":1276},{},[1277,1283],{"type":40,"tag":122,"props":1278,"children":1280},{"className":1279},[],[1281],{"type":45,"value":1282},"yarn test --watchAll=false",{"type":45,"value":1284}," — run tests (disable Jest watch mode)",{"type":40,"tag":114,"props":1286,"children":1287},{},[1288,1294,1296,1302],{"type":40,"tag":122,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":45,"value":1293},"yarn build:api-reports:only",{"type":45,"value":1295}," — generate\u002Fupdate API reports (depends on ",{"type":40,"tag":122,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":45,"value":1301},"tsc:full",{"type":45,"value":1303},", always runs)",{"type":40,"tag":205,"props":1305,"children":1306},{},[],{"type":40,"tag":103,"props":1308,"children":1310},{"id":1309},"step-6-generate-changeset-per-workspace",[1311],{"type":45,"value":1312},"Step 6 — Generate changeset per workspace",{"type":40,"tag":41,"props":1314,"children":1315},{},[1316,1317,1321],{"type":45,"value":1099},{"type":40,"tag":118,"props":1318,"children":1319},{},[1320],{"type":45,"value":1104},{"type":45,"value":1322}," workspace from Step 2, generate a changeset programmatically. Use the npm scope from the detected repo profile (Step 1).",{"type":40,"tag":802,"props":1324,"children":1325},{},[1326,1479,1484,1497],{"type":40,"tag":114,"props":1327,"children":1328},{},[1329,1331,1336,1338],{"type":45,"value":1330},"From the staged diff (",{"type":40,"tag":122,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":45,"value":978},{"type":45,"value":1337},"), determine:\n",{"type":40,"tag":110,"props":1339,"children":1340},{},[1341,1373,1430,1442,1471],{"type":40,"tag":114,"props":1342,"children":1343},{},[1344,1346,1351,1353,1359,1361,1372],{"type":45,"value":1345},"Which ",{"type":40,"tag":118,"props":1347,"children":1348},{},[1349],{"type":45,"value":1350},"plugins",{"type":45,"value":1352}," under this workspace are affected (look at ",{"type":40,"tag":122,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":45,"value":1358},"plugins\u002F*",{"type":45,"value":1360}," only — ",{"type":40,"tag":118,"props":1362,"children":1363},{},[1364,1366],{"type":45,"value":1365},"ignore ",{"type":40,"tag":122,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":45,"value":1371},"packages\u002F*",{"type":45,"value":859},{"type":40,"tag":114,"props":1374,"children":1375},{},[1376,1378,1384,1386,1392,1393,1399,1400,1406,1408,1414,1415,1421,1422,1428],{"type":45,"value":1377},"Within each plugin, only include it if changes touch published paths (",{"type":40,"tag":122,"props":1379,"children":1381},{"className":1380},[],[1382],{"type":45,"value":1383},"src\u002F",{"type":45,"value":1385},", root ",{"type":40,"tag":122,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":45,"value":1391},"index.ts",{"type":45,"value":382},{"type":40,"tag":122,"props":1394,"children":1396},{"className":1395},[],[1397],{"type":45,"value":1398},"config.d.ts",{"type":45,"value":382},{"type":40,"tag":122,"props":1401,"children":1403},{"className":1402},[],[1404],{"type":45,"value":1405},"package.json",{"type":45,"value":1407},"). Skip plugins with changes only in ",{"type":40,"tag":122,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":45,"value":1413},"dev\u002F",{"type":45,"value":382},{"type":40,"tag":122,"props":1416,"children":1418},{"className":1417},[],[1419],{"type":45,"value":1420},"tests\u002F",{"type":45,"value":382},{"type":40,"tag":122,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":45,"value":1427},"__fixtures__\u002F",{"type":45,"value":1429},", or stories.",{"type":40,"tag":114,"props":1431,"children":1432},{},[1433,1435,1440],{"type":45,"value":1434},"Read each affected plugin's ",{"type":40,"tag":122,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":45,"value":1405},{"type":45,"value":1441}," for its npm package name.",{"type":40,"tag":114,"props":1443,"children":1444},{},[1445,1447,1453,1455,1461,1463,1469],{"type":45,"value":1446},"Infer the semver bump: ",{"type":40,"tag":122,"props":1448,"children":1450},{"className":1449},[],[1451],{"type":45,"value":1452},"patch",{"type":45,"value":1454}," for fixes, ",{"type":40,"tag":122,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":45,"value":1460},"minor",{"type":45,"value":1462}," for features, ",{"type":40,"tag":122,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":45,"value":1468},"major",{"type":45,"value":1470}," for breaking changes.",{"type":40,"tag":114,"props":1472,"children":1473},{},[1474],{"type":40,"tag":118,"props":1475,"children":1476},{},[1477],{"type":45,"value":1478},"If no plugins have published-source changes, skip changeset generation for this workspace.",{"type":40,"tag":114,"props":1480,"children":1481},{},[1482],{"type":45,"value":1483},"Generate a short summary (1-2 sentences).",{"type":40,"tag":114,"props":1485,"children":1486},{},[1487,1489,1495],{"type":45,"value":1488},"Generate a random changeset ID: ",{"type":40,"tag":122,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":45,"value":1494},"\u003Cadjective>-\u003Cnoun>-\u003Cverb>",{"type":45,"value":1496}," pattern, lowercase, 5-8 chars per word. Each workspace gets a unique ID.",{"type":40,"tag":114,"props":1498,"children":1499},{},[1500,1502,1508],{"type":45,"value":1501},"Write the changeset file to ",{"type":40,"tag":122,"props":1503,"children":1505},{"className":1504},[],[1506],{"type":45,"value":1507},"\u003Cworkspace>\u002F.changeset\u002F\u003Crandom-id>.md",{"type":45,"value":372},{"type":40,"tag":1148,"props":1510,"children":1513},{"className":1511,"code":1512,"language":45},[1151],"---\n'\u003Cpackage-name>': \u003Cbump-type>\n---\n\n\u003Csummary>\n",[1514],{"type":40,"tag":122,"props":1515,"children":1516},{"__ignoreMap":81},[1517],{"type":45,"value":1512},{"type":40,"tag":41,"props":1519,"children":1520},{},[1521],{"type":45,"value":1522},"If multiple packages are affected, list each on its own YAML line.",{"type":40,"tag":41,"props":1524,"children":1525},{},[1526,1539],{"type":40,"tag":118,"props":1527,"children":1528},{},[1529,1531,1537],{"type":45,"value":1530},"Do NOT run ",{"type":40,"tag":122,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":45,"value":1536},"yarn changeset",{"type":45,"value":1538}," interactively.",{"type":45,"value":1540}," Create files programmatically.",{"type":40,"tag":205,"props":1542,"children":1543},{},[],{"type":40,"tag":103,"props":1545,"children":1547},{"id":1546},"step-7-identify-build-generated-files",[1548],{"type":45,"value":1549},"Step 7 — Identify build-generated files",{"type":40,"tag":802,"props":1551,"children":1552},{},[1553,1570,1581,1586],{"type":40,"tag":114,"props":1554,"children":1555},{},[1556,1557,1562,1564,1569],{"type":45,"value":809},{"type":40,"tag":122,"props":1558,"children":1560},{"className":1559},[],[1561],{"type":45,"value":910},{"type":45,"value":1563}," for the ",{"type":40,"tag":118,"props":1565,"children":1566},{},[1567],{"type":45,"value":1568},"current snapshot",{"type":45,"value":534},{"type":40,"tag":114,"props":1571,"children":1572},{},[1573,1575,1579],{"type":45,"value":1574},"Compare against the ",{"type":40,"tag":118,"props":1576,"children":1577},{},[1578],{"type":45,"value":917},{"type":45,"value":1580}," from Step 3.",{"type":40,"tag":114,"props":1582,"children":1583},{},[1584],{"type":45,"value":1585},"Files only in the current snapshot are build-generated (created by Step 5 builds or Step 6 changesets).",{"type":40,"tag":114,"props":1587,"children":1588},{},[1589],{"type":45,"value":1590},"Files already in the baseline are pre-existing — exclude them from staging.",{"type":40,"tag":205,"props":1592,"children":1593},{},[],{"type":40,"tag":103,"props":1595,"children":1597},{"id":1596},"step-8-stage-build-generated-files-approval-gate",[1598,1600],{"type":45,"value":1599},"Step 8 — Stage build-generated files ",{"type":40,"tag":938,"props":1601,"children":1602},{},[1603],{"type":45,"value":942},{"type":40,"tag":802,"props":1605,"children":1606},{},[1607,1612,1627],{"type":40,"tag":114,"props":1608,"children":1609},{},[1610],{"type":45,"value":1611},"Present the filtered list of build-generated files from Step 7.",{"type":40,"tag":114,"props":1613,"children":1614},{},[1615,1619,1621,1625],{"type":40,"tag":118,"props":1616,"children":1617},{},[1618],{"type":45,"value":1045},{"type":45,"value":1620}," ask the user for approval before staging. ",{"type":40,"tag":118,"props":1622,"children":1623},{},[1624],{"type":45,"value":1052},{"type":45,"value":1626}," stage all automatically.",{"type":40,"tag":114,"props":1628,"children":1629},{},[1630,1631,1636],{"type":45,"value":809},{"type":40,"tag":122,"props":1632,"children":1634},{"className":1633},[],[1635],{"type":45,"value":828},{"type":45,"value":1637}," for each approved file.",{"type":40,"tag":205,"props":1639,"children":1640},{},[],{"type":40,"tag":103,"props":1642,"children":1644},{"id":1643},"step-9-commit-approval-gate",[1645,1647],{"type":45,"value":1646},"Step 9 — Commit ",{"type":40,"tag":938,"props":1648,"children":1649},{},[1650],{"type":45,"value":942},{"type":40,"tag":802,"props":1652,"children":1653},{},[1654,1666,1685],{"type":40,"tag":114,"props":1655,"children":1656},{},[1657,1658,1664],{"type":45,"value":809},{"type":40,"tag":122,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":45,"value":1663},"git diff --cached --stat",{"type":45,"value":1665}," to review all staged changes.",{"type":40,"tag":114,"props":1667,"children":1668},{},[1669,1671,1677,1678,1684],{"type":45,"value":1670},"Generate a commit message in conventional commit format: ",{"type":40,"tag":122,"props":1672,"children":1674},{"className":1673},[],[1675],{"type":45,"value":1676},"\u003Ctype>(\u003Cworkspace>): \u003Cshort description>",{"type":45,"value":1007},{"type":40,"tag":122,"props":1679,"children":1681},{"className":1680},[],[1682],{"type":45,"value":1683},"feat(bulk-import): add batch repository import support",{"type":45,"value":859},{"type":40,"tag":114,"props":1686,"children":1687},{},[1688,1699,1701,1707,1709,1714,1715,1752,1756,1758],{"type":40,"tag":118,"props":1689,"children":1690},{},[1691,1692,1697],{"type":45,"value":991},{"type":40,"tag":122,"props":1693,"children":1695},{"className":1694},[],[1696],{"type":45,"value":346},{"type":45,"value":1698}," is set",{"type":45,"value":1700},", append a ",{"type":40,"tag":122,"props":1702,"children":1704},{"className":1703},[],[1705],{"type":45,"value":1706},"Fixes:",{"type":45,"value":1708}," trailer in the commit body — but ",{"type":40,"tag":118,"props":1710,"children":1711},{},[1712],{"type":45,"value":1713},"only if the issue type is allowed for this repo profile",{"type":45,"value":372},{"type":40,"tag":110,"props":1716,"children":1717},{},[1718,1728],{"type":40,"tag":114,"props":1719,"children":1720},{},[1721,1726],{"type":40,"tag":118,"props":1722,"children":1723},{},[1724],{"type":45,"value":1725},"rhdh-plugins:",{"type":45,"value":1727}," Both Jira and GitHub issue URLs are allowed.",{"type":40,"tag":114,"props":1729,"children":1730},{},[1731,1736,1738,1743,1745,1750],{"type":40,"tag":118,"props":1732,"children":1733},{},[1734],{"type":45,"value":1735},"community-plugins:",{"type":45,"value":1737}," Only GitHub issue URLs are allowed. If ",{"type":40,"tag":122,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":45,"value":532},{"type":45,"value":1744},", do NOT add a ",{"type":40,"tag":122,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":45,"value":1706},{"type":45,"value":1751}," trailer (Jira info must never appear in community-plugins git history).",{"type":40,"tag":1753,"props":1754,"children":1755},"br",{},[],{"type":45,"value":1757},"Examples:",{"type":40,"tag":110,"props":1759,"children":1760},{},[1761,1772,1783,1794],{"type":40,"tag":114,"props":1762,"children":1763},{},[1764,1766],{"type":45,"value":1765},"rhdh-plugins + Jira: ",{"type":40,"tag":122,"props":1767,"children":1769},{"className":1768},[],[1770],{"type":45,"value":1771},"Fixes: https:\u002F\u002Fredhat.atlassian.net\u002Fbrowse\u002FRHDHBUGS-1934",{"type":40,"tag":114,"props":1773,"children":1774},{},[1775,1777],{"type":45,"value":1776},"rhdh-plugins + GitHub: ",{"type":40,"tag":122,"props":1778,"children":1780},{"className":1779},[],[1781],{"type":45,"value":1782},"Fixes: https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-plugins\u002Fissues\u002F607",{"type":40,"tag":114,"props":1784,"children":1785},{},[1786,1788],{"type":45,"value":1787},"community-plugins + GitHub: ",{"type":40,"tag":122,"props":1789,"children":1791},{"className":1790},[],[1792],{"type":45,"value":1793},"Fixes: https:\u002F\u002Fgithub.com\u002Fbackstage\u002Fcommunity-plugins\u002Fissues\u002F3574",{"type":40,"tag":114,"props":1795,"children":1796},{},[1797,1799,1804],{"type":45,"value":1798},"community-plugins + Jira: ",{"type":40,"tag":118,"props":1800,"children":1801},{},[1802],{"type":45,"value":1803},"no trailer",{"type":45,"value":1805}," (omit entirely)",{"type":40,"tag":1148,"props":1807,"children":1810},{"className":1808,"code":1809,"language":45},[1151],"fix(adoption-insights): enable keyboard navigation in header date-range dropdown\n\nFixes: \u003Cissue_url>\n",[1811],{"type":40,"tag":122,"props":1812,"children":1813},{"__ignoreMap":81},[1814],{"type":45,"value":1809},{"type":40,"tag":802,"props":1816,"children":1818},{"start":1817},4,[1819,1834],{"type":40,"tag":114,"props":1820,"children":1821},{},[1822,1826,1828,1832],{"type":40,"tag":118,"props":1823,"children":1824},{},[1825],{"type":45,"value":1045},{"type":45,"value":1827}," present the commit message and staged file summary. Wait for approval. ",{"type":40,"tag":118,"props":1829,"children":1830},{},[1831],{"type":45,"value":1052},{"type":45,"value":1833}," commit immediately.",{"type":40,"tag":114,"props":1835,"children":1836},{},[1837,1839,1849],{"type":45,"value":1838},"Commit with the ",{"type":40,"tag":118,"props":1840,"children":1841},{},[1842,1848],{"type":40,"tag":122,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":45,"value":1847},"-s",{"type":45,"value":221},{"type":45,"value":1850}," (Signed-off-by):",{"type":40,"tag":1148,"props":1852,"children":1855},{"className":1853,"code":1854,"language":45},[1151],"git commit -s -m \"\u003Csubject>\" -m \"Fixes: \u003Cissue_url>\"\n",[1856],{"type":40,"tag":122,"props":1857,"children":1858},{"__ignoreMap":81},[1859],{"type":45,"value":1854},{"type":40,"tag":41,"props":1861,"children":1862},{},[1863,1865,1871,1873,1878,1880,1885,1887,1892,1893,1898,1900,1905,1907,1913],{"type":45,"value":1864},"Where ",{"type":40,"tag":122,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":45,"value":1870},"\u003Cissue_url>",{"type":45,"value":1872}," is ",{"type":40,"tag":122,"props":1874,"children":1876},{"className":1875},[],[1877],{"type":45,"value":388},{"type":45,"value":1879}," or ",{"type":40,"tag":122,"props":1881,"children":1883},{"className":1882},[],[1884],{"type":45,"value":429},{"type":45,"value":1886}," depending on ",{"type":40,"tag":122,"props":1888,"children":1890},{"className":1889},[],[1891],{"type":45,"value":346},{"type":45,"value":784},{"type":40,"tag":122,"props":1894,"children":1896},{"className":1895},[],[1897],{"type":45,"value":346},{"type":45,"value":1899}," is null, or if the profile is community-plugins and ",{"type":40,"tag":122,"props":1901,"children":1903},{"className":1902},[],[1904],{"type":45,"value":346},{"type":45,"value":1906}," is jira, omit the second ",{"type":40,"tag":122,"props":1908,"children":1910},{"className":1909},[],[1911],{"type":45,"value":1912},"-m",{"type":45,"value":1914}," flag.",{"type":40,"tag":205,"props":1916,"children":1917},{},[],{"type":40,"tag":103,"props":1919,"children":1921},{"id":1920},"step-10-push-and-create-pr",[1922],{"type":45,"value":1923},"Step 10 — Push and create PR",{"type":40,"tag":802,"props":1925,"children":1926},{},[1927],{"type":40,"tag":114,"props":1928,"children":1929},{},[1930],{"type":45,"value":1931},"Push the branch:",{"type":40,"tag":1148,"props":1933,"children":1936},{"className":1934,"code":1935,"language":45},[1151],"git push -u origin HEAD\n",[1937],{"type":40,"tag":122,"props":1938,"children":1939},{"__ignoreMap":81},[1940],{"type":45,"value":1935},{"type":40,"tag":802,"props":1942,"children":1944},{"start":1943},2,[1945,2271,2276,2524],{"type":40,"tag":114,"props":1946,"children":1947},{},[1948,1974,1975,1978,1980,1985,1987,1992,1994,1997,1999,2004,2006,2011,2013,2016,2018,2027,2030,2032,2035,2037,2043,2045,2051,2053,2116,2119,2121,2127,2129,2135,2136,2139,2141,2146,2148,2157,2160,2162,2168,2169,2175,2177,2182,2184,2193,2196,2198,2204,2206,2212,2214,2219,2221,2227,2229,2235,2236,2242,2244,2253,2256,2261,2263,2269],{"type":40,"tag":118,"props":1949,"children":1950},{},[1951,1953,1959,1961],{"type":45,"value":1952},"Upload recording GIFs to dedicated ",{"type":40,"tag":122,"props":1954,"children":1956},{"className":1955},[],[1957],{"type":45,"value":1958},"screenrecordings",{"type":45,"value":1960}," branch ",{"type":40,"tag":938,"props":1962,"children":1963},{},[1964,1966,1972],{"type":45,"value":1965},"HARD GATE when ",{"type":40,"tag":122,"props":1967,"children":1969},{"className":1968},[],[1970],{"type":45,"value":1971},"recordings",{"type":45,"value":1973}," is provided",{"type":45,"value":372},{"type":40,"tag":1753,"props":1976,"children":1977},{},[],{"type":45,"value":1979},"Skip this sub-step ONLY if ",{"type":40,"tag":122,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":45,"value":1971},{"type":45,"value":1986}," caller context is NOT provided. When ",{"type":40,"tag":122,"props":1988,"children":1990},{"className":1989},[],[1991],{"type":45,"value":1971},{"type":45,"value":1993}," IS provided, this sub-step is MANDATORY — do NOT skip, defer, or substitute with placeholder URLs.",{"type":40,"tag":1753,"props":1995,"children":1996},{},[],{"type":45,"value":1998},"GIFs are uploaded to a dedicated ",{"type":40,"tag":122,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":45,"value":1958},{"type":45,"value":2005}," branch on the user's fork — NOT the feature branch. This keeps the GIFs out of the PR diff and prevents them from landing on upstream ",{"type":40,"tag":122,"props":2007,"children":2009},{"className":2008},[],[2010],{"type":45,"value":934},{"type":45,"value":2012}," when the PR merges.",{"type":40,"tag":1753,"props":2014,"children":2015},{},[],{"type":45,"value":2017},"a. Verify both local GIF files exist before proceeding:",{"type":40,"tag":1148,"props":2019,"children":2022},{"className":2020,"code":2021,"language":45},[1151],"ls -la \u003Crecordings.before> \u003Crecordings.after>\n",[2023],{"type":40,"tag":122,"props":2024,"children":2025},{"__ignoreMap":81},[2026],{"type":45,"value":2021},{"type":40,"tag":1753,"props":2028,"children":2029},{},[],{"type":45,"value":2031},"If either file is missing, STOP and inform the user.",{"type":40,"tag":1753,"props":2033,"children":2034},{},[],{"type":45,"value":2036},"b. Determine the fork owner and repo name from the ",{"type":40,"tag":122,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":45,"value":2042},"origin",{"type":45,"value":2044}," remote URL (e.g., ",{"type":40,"tag":122,"props":2046,"children":2048},{"className":2047},[],[2049],{"type":45,"value":2050},"its-mitesh-kumar\u002Frhdh-plugins",{"type":45,"value":2052},").\nc. Build the issue-specific upload path to avoid filename collisions across bug fixes:",{"type":40,"tag":110,"props":2054,"children":2055},{},[2056,2081,2105],{"type":40,"tag":114,"props":2057,"children":2058},{},[2059,2060,2065,2067,2073,2074,2080],{"type":45,"value":991},{"type":40,"tag":122,"props":2061,"children":2063},{"className":2062},[],[2064],{"type":45,"value":532},{"type":45,"value":2066},": ",{"type":40,"tag":122,"props":2068,"children":2070},{"className":2069},[],[2071],{"type":45,"value":2072},"ISSUE_ID = \u003Cjira_key>",{"type":45,"value":1007},{"type":40,"tag":122,"props":2075,"children":2077},{"className":2076},[],[2078],{"type":45,"value":2079},"RHDHBUGS-2911",{"type":45,"value":192},{"type":40,"tag":114,"props":2082,"children":2083},{},[2084,2085,2090,2091,2097,2098,2104],{"type":45,"value":991},{"type":40,"tag":122,"props":2086,"children":2088},{"className":2087},[],[2089],{"type":45,"value":603},{"type":45,"value":2066},{"type":40,"tag":122,"props":2092,"children":2094},{"className":2093},[],[2095],{"type":45,"value":2096},"ISSUE_ID = \u003Cgithub_issue_number>",{"type":45,"value":1007},{"type":40,"tag":122,"props":2099,"children":2101},{"className":2100},[],[2102],{"type":45,"value":2103},"9834",{"type":45,"value":192},{"type":40,"tag":114,"props":2106,"children":2107},{},[2108,2110],{"type":45,"value":2109},"If no issue context: ",{"type":40,"tag":122,"props":2111,"children":2113},{"className":2112},[],[2114],{"type":45,"value":2115},"ISSUE_ID = $(date +%Y%m%d-%H%M%S)",{"type":40,"tag":1753,"props":2117,"children":2118},{},[],{"type":45,"value":2120},"Upload path: ",{"type":40,"tag":122,"props":2122,"children":2124},{"className":2123},[],[2125],{"type":45,"value":2126},"screenrecordings\u002F\u003Cworkspace>-\u003CISSUE_ID>\u002Fbefore-fix.gif",{"type":45,"value":2128}," and ",{"type":40,"tag":122,"props":2130,"children":2132},{"className":2131},[],[2133],{"type":45,"value":2134},"...\u002Fafter-fix.gif",{"type":45,"value":534},{"type":40,"tag":1753,"props":2137,"children":2138},{},[],{"type":45,"value":2140},"d. Ensure the ",{"type":40,"tag":122,"props":2142,"children":2144},{"className":2143},[],[2145],{"type":45,"value":1958},{"type":45,"value":2147}," branch exists on the fork. Check and create if needed:",{"type":40,"tag":1148,"props":2149,"children":2152},{"className":2150,"code":2151,"language":45},[1151],"TOKEN=$(gh auth token)\n# Check if branch exists\nHTTP_STATUS=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n  -H \"Authorization: token $TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fgit\u002Fref\u002Fheads\u002Fscreenrecordings\")\nif [ \"$HTTP_STATUS\" != \"200\" ]; then\n  # Get the SHA of the default branch HEAD\n  DEFAULT_SHA=$(curl -s -H \"Authorization: token $TOKEN\" \\\n    \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fgit\u002Fref\u002Fheads\u002Fmain\" | \\\n    python3 -c \"import sys,json; print(json.load(sys.stdin)['object']['sha'])\")\n  # Create the branch\n  curl -s -X POST \\\n    -H \"Authorization: token $TOKEN\" \\\n    -H \"Accept: application\u002Fvnd.github+json\" \\\n    -d '{\"ref\":\"refs\u002Fheads\u002Fscreenrecordings\",\"sha\":\"'\"$DEFAULT_SHA\"'\"}' \\\n    \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fgit\u002Frefs\"\nfi\n",[2153],{"type":40,"tag":122,"props":2154,"children":2155},{"__ignoreMap":81},[2156],{"type":45,"value":2151},{"type":40,"tag":1753,"props":2158,"children":2159},{},[],{"type":45,"value":2161},"e. For each GIF file (",{"type":40,"tag":122,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":45,"value":2167},"recordings.before",{"type":45,"value":2128},{"type":40,"tag":122,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":45,"value":2174},"recordings.after",{"type":45,"value":2176},"), upload to the ",{"type":40,"tag":122,"props":2178,"children":2180},{"className":2179},[],[2181],{"type":45,"value":1958},{"type":45,"value":2183}," branch via the GitHub Contents API:",{"type":40,"tag":1148,"props":2185,"children":2188},{"className":2186,"code":2187,"language":45},[1151],"GIF_B64=$(base64 -i \u003Clocal-gif-path>)\nRESPONSE=$(curl -s -X PUT \\\n  -H \"Authorization: token $TOKEN\" \\\n  -H \"Accept: application\u002Fvnd.github+json\" \\\n  -d '{\"message\":\"docs: add \u003Cbefore|after>-fix recording for \u003Cworkspace>-\u003CISSUE_ID>\",\"content\":\"'\"$GIF_B64\"'\",\"branch\":\"screenrecordings\"}' \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F\u003Cfork-owner>\u002F\u003Crepo-name>\u002Fcontents\u002Fscreenrecordings\u002F\u003Cworkspace>-\u003CISSUE_ID>\u002F\u003Cbefore|after>-fix.gif\")\necho \"$RESPONSE\" | python3 -c \"import sys,json; d=json.load(sys.stdin); url=d.get('content',{}).get('download_url',''); print('download_url:', url); exit(0 if url.startswith('https:\u002F\u002Fraw.githubusercontent.com') else 1)\"\n",[2189],{"type":40,"tag":122,"props":2190,"children":2191},{"__ignoreMap":81},[2192],{"type":45,"value":2187},{"type":40,"tag":1753,"props":2194,"children":2195},{},[],{"type":45,"value":2197},"f. Extract the ",{"type":40,"tag":122,"props":2199,"children":2201},{"className":2200},[],[2202],{"type":45,"value":2203},"download_url",{"type":45,"value":2205}," from the JSON response — this is the ",{"type":40,"tag":122,"props":2207,"children":2209},{"className":2208},[],[2210],{"type":45,"value":2211},"raw.githubusercontent.com",{"type":45,"value":2213}," URL. ",{"type":40,"tag":118,"props":2215,"children":2216},{},[2217],{"type":45,"value":2218},"Verify",{"type":45,"value":2220}," that the URL starts with ",{"type":40,"tag":122,"props":2222,"children":2224},{"className":2223},[],[2225],{"type":45,"value":2226},"https:\u002F\u002Fraw.githubusercontent.com\u002F",{"type":45,"value":2228}," — if it does not, the upload failed.\ng. Store both URLs: ",{"type":40,"tag":122,"props":2230,"children":2232},{"className":2231},[],[2233],{"type":45,"value":2234},"before_gif_url",{"type":45,"value":382},{"type":40,"tag":122,"props":2237,"children":2239},{"className":2238},[],[2240],{"type":45,"value":2241},"after_gif_url",{"type":45,"value":2243},".\nh. Echo a verification banner:",{"type":40,"tag":1148,"props":2245,"children":2248},{"className":2246,"code":2247,"language":45},[1151],"echo \"✅ GIF upload verified: before=$before_gif_url after=$after_gif_url\"\n",[2249],{"type":40,"tag":122,"props":2250,"children":2251},{"__ignoreMap":81},[2252],{"type":45,"value":2247},{"type":40,"tag":1753,"props":2254,"children":2255},{},[],{"type":40,"tag":118,"props":2257,"children":2258},{},[2259],{"type":45,"value":2260},"If upload fails:",{"type":45,"value":2262}," Retry once. If the retry also fails, log a warning and inform the user to manually drag GIFs into the PR description on GitHub. Use placeholder text ",{"type":40,"tag":122,"props":2264,"children":2266},{"className":2265},[],[2267],{"type":45,"value":2268},"_(Recording upload failed — drag GIF manually)_",{"type":45,"value":2270}," in the PR body instead of a broken image link. NEVER fabricate a URL that looks real but does not resolve.",{"type":40,"tag":114,"props":2272,"children":2273},{},[2274],{"type":45,"value":2275},"Generate a PR title from the commit subject line.",{"type":40,"tag":114,"props":2277,"children":2278},{},[2279,2281],{"type":45,"value":2280},"Build the PR body from the detected repo profile template (Step 1). The body has conditional sections:",{"type":40,"tag":110,"props":2282,"children":2283},{},[2284,2368,2426,2447,2468,2482],{"type":40,"tag":114,"props":2285,"children":2286},{},[2287,2296,2298],{"type":40,"tag":118,"props":2288,"children":2289},{},[2290],{"type":40,"tag":122,"props":2291,"children":2293},{"className":2292},[],[2294],{"type":45,"value":2295},"## Fixed",{"type":45,"value":2297}," — repo-dependent:\n",{"type":40,"tag":110,"props":2299,"children":2300},{},[2301,2332],{"type":40,"tag":114,"props":2302,"children":2303},{},[2304,2308,2310,2315,2317,2323,2325,2331],{"type":40,"tag":118,"props":2305,"children":2306},{},[2307],{"type":45,"value":1725},{"type":45,"value":2309}," include if ",{"type":40,"tag":122,"props":2311,"children":2313},{"className":2312},[],[2314],{"type":45,"value":346},{"type":45,"value":2316}," is set. Jira: ",{"type":40,"tag":122,"props":2318,"children":2320},{"className":2319},[],[2321],{"type":45,"value":2322},"- [\u003CJIRA-KEY>](\u003Cjira_url>) — \u003Cjira_summary>",{"type":45,"value":2324},". GitHub: ",{"type":40,"tag":122,"props":2326,"children":2328},{"className":2327},[],[2329],{"type":45,"value":2330},"- Fixes \u003Cgithub_issue_url>",{"type":45,"value":534},{"type":40,"tag":114,"props":2333,"children":2334},{},[2335,2339,2341,2346,2348,2353,2355,2360,2362,2367],{"type":40,"tag":118,"props":2336,"children":2337},{},[2338],{"type":45,"value":1735},{"type":45,"value":2340}," include ONLY if ",{"type":40,"tag":122,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":45,"value":603},{"type":45,"value":2347},". Use ",{"type":40,"tag":122,"props":2349,"children":2351},{"className":2350},[],[2352],{"type":45,"value":2330},{"type":45,"value":2354}," (triggers auto-close). NEVER include Jira info — omit ",{"type":40,"tag":122,"props":2356,"children":2358},{"className":2357},[],[2359],{"type":45,"value":2295},{"type":45,"value":2361}," entirely when ",{"type":40,"tag":122,"props":2363,"children":2365},{"className":2364},[],[2366],{"type":45,"value":532},{"type":45,"value":534},{"type":40,"tag":114,"props":2369,"children":2370},{},[2371,2388,2390,2395,2397,2402,2404,2410,2411,2417,2419,2424],{"type":40,"tag":118,"props":2372,"children":2373},{},[2374,2380,2382],{"type":40,"tag":122,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":45,"value":2379},"## UI before changes",{"type":45,"value":2381}," \u002F ",{"type":40,"tag":122,"props":2383,"children":2385},{"className":2384},[],[2386],{"type":45,"value":2387},"## UI after changes",{"type":45,"value":2389}," — include only if ",{"type":40,"tag":122,"props":2391,"children":2393},{"className":2392},[],[2394],{"type":45,"value":1971},{"type":45,"value":2396}," are provided in caller context. Use the ",{"type":40,"tag":122,"props":2398,"children":2400},{"className":2399},[],[2401],{"type":45,"value":2211},{"type":45,"value":2403}," URLs from sub-step 2 in the markdown: ",{"type":40,"tag":122,"props":2405,"children":2407},{"className":2406},[],[2408],{"type":45,"value":2409},"![Before fix](\u003Cbefore_gif_url>)",{"type":45,"value":2381},{"type":40,"tag":122,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":45,"value":2416},"![After fix](\u003Cafter_gif_url>)",{"type":45,"value":2418},". ",{"type":40,"tag":118,"props":2420,"children":2421},{},[2422],{"type":45,"value":2423},"CRITICAL",{"type":45,"value":2425},": Both URLs MUST have been obtained from the GitHub Contents API response in sub-step 2. NEVER construct, guess, or fabricate these URLs. If sub-step 2 failed and you have no valid URLs, use the placeholder text from the failure path instead of a broken image link.",{"type":40,"tag":114,"props":2427,"children":2428},{},[2429,2438,2440,2445],{"type":40,"tag":118,"props":2430,"children":2431},{},[2432],{"type":40,"tag":122,"props":2433,"children":2435},{"className":2434},[],[2436],{"type":45,"value":2437},"pr_description_extra",{"type":45,"value":2439}," — if provided by caller context (e.g., root cause analysis from ",{"type":40,"tag":122,"props":2441,"children":2443},{"className":2442},[],[2444],{"type":45,"value":338},{"type":45,"value":2446},"), insert it after the generated description paragraph.",{"type":40,"tag":114,"props":2448,"children":2449},{},[2450,2459,2460,2466],{"type":40,"tag":118,"props":2451,"children":2452},{},[2453],{"type":40,"tag":122,"props":2454,"children":2456},{"className":2455},[],[2457],{"type":45,"value":2458},"## Test Plan",{"type":45,"value":2389},{"type":40,"tag":122,"props":2461,"children":2463},{"className":2462},[],[2464],{"type":45,"value":2465},"test_plan",{"type":45,"value":2467}," is provided in caller context. Insert the markdown checklist as-is.",{"type":40,"tag":114,"props":2469,"children":2470},{},[2471,2480],{"type":40,"tag":118,"props":2472,"children":2473},{},[2474],{"type":40,"tag":122,"props":2475,"children":2477},{"className":2476},[],[2478],{"type":45,"value":2479},"## Checklist",{"type":45,"value":2481}," — always present.",{"type":40,"tag":114,"props":2483,"children":2484},{},[2485,2494,2496,2501,2503,2508,2510,2515,2517,2522],{"type":40,"tag":118,"props":2486,"children":2487},{},[2488],{"type":40,"tag":122,"props":2489,"children":2491},{"className":2490},[],[2492],{"type":45,"value":2493},"## Note",{"type":45,"value":2495}," — include whenever ",{"type":40,"tag":122,"props":2497,"children":2499},{"className":2498},[],[2500],{"type":45,"value":346},{"type":45,"value":2502}," is present in caller context (indicating ",{"type":40,"tag":122,"props":2504,"children":2506},{"className":2505},[],[2507],{"type":45,"value":338},{"type":45,"value":2509}," invoked ",{"type":40,"tag":122,"props":2511,"children":2513},{"className":2512},[],[2514],{"type":45,"value":4},{"type":45,"value":2516},"). Contains the skill attribution disclaimer. Omit for standalone ",{"type":40,"tag":122,"props":2518,"children":2520},{"className":2519},[],[2521],{"type":45,"value":4},{"type":45,"value":2523}," invocations.",{"type":40,"tag":114,"props":2525,"children":2526},{},[2527,2529,2535,2537,2543,2544,2549,2551,2557],{"type":45,"value":2528},"Create the PR using ",{"type":40,"tag":122,"props":2530,"children":2532},{"className":2531},[],[2533],{"type":45,"value":2534},"gh pr create",{"type":45,"value":2536}," with the repo-appropriate template. Use the upstream repo value for ",{"type":40,"tag":122,"props":2538,"children":2540},{"className":2539},[],[2541],{"type":45,"value":2542},"--repo",{"type":45,"value":2128},{"type":40,"tag":122,"props":2545,"children":2547},{"className":2546},[],[2548],{"type":45,"value":934},{"type":45,"value":2550}," for ",{"type":40,"tag":122,"props":2552,"children":2554},{"className":2553},[],[2555],{"type":45,"value":2556},"--base",{"type":45,"value":2558},". Pass the body via HEREDOC:",{"type":40,"tag":1148,"props":2560,"children":2563},{"className":2561,"code":2562,"language":45},[1151],"gh pr create --repo \u003Cupstream-repo> --base main --title \"\u003Ctitle>\" --body \"$(cat \u003C\u003C'EOF'\n\u003Cassembled PR body>\nEOF\n)\"\n",[2564],{"type":40,"tag":122,"props":2565,"children":2566},{"__ignoreMap":81},[2567],{"type":45,"value":2562},{"type":40,"tag":802,"props":2569,"children":2571},{"start":2570},6,[2572,2577],{"type":40,"tag":114,"props":2573,"children":2574},{},[2575],{"type":45,"value":2576},"Capture and store the PR URL for Step 11.",{"type":40,"tag":114,"props":2578,"children":2579},{},[2580],{"type":45,"value":2581},"Display the PR URL.",{"type":40,"tag":205,"props":2583,"children":2584},{},[],{"type":40,"tag":103,"props":2586,"children":2588},{"id":2587},"step-11-post-pr-issue-updates",[2589],{"type":45,"value":2590},"Step 11 — Post-PR issue updates",{"type":40,"tag":41,"props":2592,"children":2593},{},[2594],{"type":40,"tag":118,"props":2595,"children":2596},{},[2597,2599,2604],{"type":45,"value":2598},"Skip this step entirely if ",{"type":40,"tag":122,"props":2600,"children":2602},{"className":2601},[],[2603],{"type":45,"value":346},{"type":45,"value":2605}," is null.",{"type":40,"tag":322,"props":2607,"children":2609},{"id":2608},"if-issue_source-jira",[2610,2611,2616,2617],{"type":45,"value":991},{"type":40,"tag":122,"props":2612,"children":2614},{"className":2613},[],[2615],{"type":45,"value":346},{"type":45,"value":364},{"type":40,"tag":122,"props":2618,"children":2620},{"className":2619},[],[2621],{"type":45,"value":370},{"type":40,"tag":802,"props":2623,"children":2624},{},[2625,2644,2676],{"type":40,"tag":114,"props":2626,"children":2627},{},[2628,2633,2635],{"type":40,"tag":118,"props":2629,"children":2630},{},[2631],{"type":45,"value":2632},"Comment",{"type":45,"value":2634}," on the Jira issue documenting the PR submission:",{"type":40,"tag":1148,"props":2636,"children":2639},{"className":2637,"code":2638,"language":45},[1151],"Use the Jira MCP `add_jira_comment` tool:\n  issueKey: \"\u003Cjira_key>\"\n  body: \"PR submitted: \u003CPR_URL>\"\n",[2640],{"type":40,"tag":122,"props":2641,"children":2642},{"__ignoreMap":81},[2643],{"type":45,"value":2638},{"type":40,"tag":114,"props":2645,"children":2646},{},[2647,2652,2654,2663,2666,2668,2674],{"type":40,"tag":118,"props":2648,"children":2649},{},[2650],{"type":45,"value":2651},"Transition",{"type":45,"value":2653}," the issue status to \"Review\" (if ACLI is available):",{"type":40,"tag":1148,"props":2655,"children":2658},{"className":2656,"code":2657,"language":45},[1151],"acli jira workitem transition --key \"\u003Cjira_key>\" --status \"Review\" --yes\n",[2659],{"type":40,"tag":122,"props":2660,"children":2661},{"__ignoreMap":81},[2662],{"type":45,"value":2657},{"type":40,"tag":1753,"props":2664,"children":2665},{},[],{"type":45,"value":2667},"Query available transitions first: ",{"type":40,"tag":122,"props":2669,"children":2671},{"className":2670},[],[2672],{"type":45,"value":2673},"acli jira workitem getTransitions --key \"\u003Cjira_key>\"",{"type":45,"value":2675},". If \"Review\" is not available, skip the transition and log a warning.",{"type":40,"tag":114,"props":2677,"children":2678},{},[2679,2684,2686,2695,2698,2700,2705],{"type":40,"tag":118,"props":2680,"children":2681},{},[2682],{"type":45,"value":2683},"Add web link",{"type":45,"value":2685}," — add the PR URL as a remote link on the Jira issue (if REST auth is available):",{"type":40,"tag":1148,"props":2687,"children":2690},{"className":2688,"code":2689,"language":45},[1151],"POST \u002Frest\u002Fapi\u002F3\u002Fissue\u002F\u003Cjira_key>\u002Fremotelink\n{ \"object\": { \"url\": \"\u003CPR_URL>\", \"title\": \"GitHub PR: \u003CPR_title>\" } }\n",[2691],{"type":40,"tag":122,"props":2692,"children":2693},{"__ignoreMap":81},[2694],{"type":45,"value":2689},{"type":40,"tag":1753,"props":2696,"children":2697},{},[],{"type":45,"value":2699},"See ",{"type":40,"tag":122,"props":2701,"children":2703},{"className":2702},[],[2704],{"type":45,"value":471},{"type":45,"value":2706}," for REST API patterns.",{"type":40,"tag":41,"props":2708,"children":2709},{},[2710,2715],{"type":40,"tag":118,"props":2711,"children":2712},{},[2713],{"type":45,"value":2714},"If any Jira call fails:",{"type":45,"value":2716}," Log a warning and continue — the PR has been created successfully:",{"type":40,"tag":1148,"props":2718,"children":2721},{"className":2719,"code":2720,"language":45},[1151],"echo \"⚠️  Could not update \u003Cjira_key>. Add manually: \u003CPR_URL>\"\n",[2722],{"type":40,"tag":122,"props":2723,"children":2724},{"__ignoreMap":81},[2725],{"type":45,"value":2720},{"type":40,"tag":322,"props":2727,"children":2729},{"id":2728},"if-issue_source-github",[2730,2731,2736,2737],{"type":45,"value":991},{"type":40,"tag":122,"props":2732,"children":2734},{"className":2733},[],[2735],{"type":45,"value":346},{"type":45,"value":364},{"type":40,"tag":122,"props":2738,"children":2740},{"className":2739},[],[2741],{"type":45,"value":15},{"type":40,"tag":802,"props":2743,"children":2744},{},[2745,2763],{"type":40,"tag":114,"props":2746,"children":2747},{},[2748,2752,2754],{"type":40,"tag":118,"props":2749,"children":2750},{},[2751],{"type":45,"value":2632},{"type":45,"value":2753}," on the GitHub issue:",{"type":40,"tag":1148,"props":2755,"children":2758},{"className":2756,"code":2757,"language":45},[1151],"gh issue comment \u003Cgithub_issue_number> --repo \u003Cgithub_issue_repo> --body \"Fix submitted: \u003CPR_URL>\"\n",[2759],{"type":40,"tag":122,"props":2760,"children":2761},{"__ignoreMap":81},[2762],{"type":45,"value":2757},{"type":40,"tag":114,"props":2764,"children":2765},{},[2766,2771,2773,2779],{"type":40,"tag":118,"props":2767,"children":2768},{},[2769],{"type":45,"value":2770},"Auto-close",{"type":45,"value":2772}," — no explicit action needed. The ",{"type":40,"tag":122,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":45,"value":2778},"Fixes \u003Cgithub_issue_url>",{"type":45,"value":2780}," in the PR body (Step 10) causes GitHub to automatically close the issue when the PR merges.",{"type":40,"tag":41,"props":2782,"children":2783},{},[2784,2789],{"type":40,"tag":118,"props":2785,"children":2786},{},[2787],{"type":45,"value":2788},"If the comment fails:",{"type":45,"value":2790}," Log a warning and continue:",{"type":40,"tag":1148,"props":2792,"children":2795},{"className":2793,"code":2794,"language":45},[1151],"echo \"⚠️  Could not comment on #\u003Cgithub_issue_number>. Add manually: \u003CPR_URL>\"\n",[2796],{"type":40,"tag":122,"props":2797,"children":2798},{"__ignoreMap":81},[2799],{"type":45,"value":2794},{"type":40,"tag":205,"props":2801,"children":2802},{},[],{"type":40,"tag":103,"props":2804,"children":2806},{"id":2805},"gotchas",[2807],{"type":45,"value":2808},"Gotchas",{"type":40,"tag":110,"props":2810,"children":2811},{},[2812,2865,2875],{"type":40,"tag":114,"props":2813,"children":2814},{},[2815,2820,2822,2827,2829,2835,2837,2842,2844,2849,2851,2856,2858,2863],{"type":40,"tag":118,"props":2816,"children":2817},{},[2818],{"type":45,"value":2819},"Fork workflows:",{"type":45,"value":2821}," The user may have ",{"type":40,"tag":122,"props":2823,"children":2825},{"className":2824},[],[2826],{"type":45,"value":2042},{"type":45,"value":2828}," pointing to their fork and ",{"type":40,"tag":122,"props":2830,"children":2832},{"className":2831},[],[2833],{"type":45,"value":2834},"upstream",{"type":45,"value":2836}," to the canonical repo. Detection checks all remotes, not just ",{"type":40,"tag":122,"props":2838,"children":2840},{"className":2839},[],[2841],{"type":45,"value":2042},{"type":45,"value":2843},". The ",{"type":40,"tag":122,"props":2845,"children":2847},{"className":2846},[],[2848],{"type":45,"value":2542},{"type":45,"value":2850}," flag on ",{"type":40,"tag":122,"props":2852,"children":2854},{"className":2853},[],[2855],{"type":45,"value":2534},{"type":45,"value":2857}," targets the canonical upstream regardless of which remote ",{"type":40,"tag":122,"props":2859,"children":2861},{"className":2860},[],[2862],{"type":45,"value":2042},{"type":45,"value":2864}," points to.",{"type":40,"tag":114,"props":2866,"children":2867},{},[2868,2873],{"type":40,"tag":118,"props":2869,"children":2870},{},[2871],{"type":45,"value":2872},"Multiple workspaces:",{"type":45,"value":2874}," Each workspace gets its own build cycle (Step 5) and changeset (Step 6). The commit (Step 9) bundles everything into one commit. If the user prefers separate PRs per workspace, they should stage and run the skill once per workspace.",{"type":40,"tag":114,"props":2876,"children":2877},{},[2878,2883],{"type":40,"tag":118,"props":2879,"children":2880},{},[2881],{"type":45,"value":2882},"Changeset ID collisions:",{"type":45,"value":2884}," Each workspace must get a unique random ID. If generating for multiple workspaces in one run, track used IDs and avoid duplicates.",{"type":40,"tag":103,"props":2886,"children":2888},{"id":2887},"caller-context-optional",[2889],{"type":45,"value":2890},"Caller Context (optional)",{"type":40,"tag":41,"props":2892,"children":2893},{},[2894,2896,2901,2903,2908],{"type":45,"value":2895},"When another skill chains into ",{"type":40,"tag":122,"props":2897,"children":2899},{"className":2898},[],[2900],{"type":45,"value":4},{"type":45,"value":2902},", it may provide a ",{"type":40,"tag":118,"props":2904,"children":2905},{},[2906],{"type":45,"value":2907},"caller context",{"type":45,"value":2909}," with pre-resolved values. If present, these override the defaults — skip detection for any field that is already provided.",{"type":40,"tag":2911,"props":2912,"children":2913},"table",{},[2914,2943],{"type":40,"tag":2915,"props":2916,"children":2917},"thead",{},[2918],{"type":40,"tag":2919,"props":2920,"children":2921},"tr",{},[2922,2928,2933,2938],{"type":40,"tag":2923,"props":2924,"children":2925},"th",{},[2926],{"type":45,"value":2927},"Field",{"type":40,"tag":2923,"props":2929,"children":2930},{},[2931],{"type":45,"value":2932},"Type",{"type":40,"tag":2923,"props":2934,"children":2935},{},[2936],{"type":45,"value":2937},"Used in",{"type":40,"tag":2923,"props":2939,"children":2940},{},[2941],{"type":45,"value":2942},"Description",{"type":40,"tag":2944,"props":2945,"children":2946},"tbody",{},[2947,2987,3012,3037,3069,3095,3127,3164,3195,3247,3271],{"type":40,"tag":2919,"props":2948,"children":2949},{},[2950,2959,2964,2969],{"type":40,"tag":2951,"props":2952,"children":2953},"td",{},[2954],{"type":40,"tag":122,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":45,"value":346},{"type":40,"tag":2951,"props":2960,"children":2961},{},[2962],{"type":45,"value":2963},"string",{"type":40,"tag":2951,"props":2965,"children":2966},{},[2967],{"type":45,"value":2968},"Steps 1.5, 9, 10, 11",{"type":40,"tag":2951,"props":2970,"children":2971},{},[2972,2978,2979,2985],{"type":40,"tag":122,"props":2973,"children":2975},{"className":2974},[],[2976],{"type":45,"value":2977},"\"jira\"",{"type":45,"value":1879},{"type":40,"tag":122,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":45,"value":2984},"\"github\"",{"type":45,"value":2986}," — determines which issue-specific logic to follow",{"type":40,"tag":2919,"props":2988,"children":2989},{},[2990,2998,3002,3007],{"type":40,"tag":2951,"props":2991,"children":2992},{},[2993],{"type":40,"tag":122,"props":2994,"children":2996},{"className":2995},[],[2997],{"type":45,"value":380},{"type":40,"tag":2951,"props":2999,"children":3000},{},[3001],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3003,"children":3004},{},[3005],{"type":45,"value":3006},"Steps 1.5, 4, 9, 10, 11",{"type":40,"tag":2951,"props":3008,"children":3009},{},[3010],{"type":45,"value":3011},"Pre-resolved Jira issue key (skip Step 1.5 detection). Jira only.",{"type":40,"tag":2919,"props":3013,"children":3014},{},[3015,3023,3027,3032],{"type":40,"tag":2951,"props":3016,"children":3017},{},[3018],{"type":40,"tag":122,"props":3019,"children":3021},{"className":3020},[],[3022],{"type":45,"value":388},{"type":40,"tag":2951,"props":3024,"children":3025},{},[3026],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3028,"children":3029},{},[3030],{"type":45,"value":3031},"Steps 9, 10, 11",{"type":40,"tag":2951,"props":3033,"children":3034},{},[3035],{"type":45,"value":3036},"Full Jira browse URL. Jira only.",{"type":40,"tag":2919,"props":3038,"children":3039},{},[3040,3048,3052,3057],{"type":40,"tag":2951,"props":3041,"children":3042},{},[3043],{"type":40,"tag":122,"props":3044,"children":3046},{"className":3045},[],[3047],{"type":45,"value":395},{"type":40,"tag":2951,"props":3049,"children":3050},{},[3051],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3053,"children":3054},{},[3055],{"type":45,"value":3056},"Step 10",{"type":40,"tag":2951,"props":3058,"children":3059},{},[3060,3062,3067],{"type":45,"value":3061},"Issue summary for the PR body ",{"type":40,"tag":122,"props":3063,"children":3065},{"className":3064},[],[3066],{"type":45,"value":2295},{"type":45,"value":3068}," section. Jira only.",{"type":40,"tag":2919,"props":3070,"children":3071},{},[3072,3080,3085,3090],{"type":40,"tag":2951,"props":3073,"children":3074},{},[3075],{"type":40,"tag":122,"props":3076,"children":3078},{"className":3077},[],[3079],{"type":45,"value":422},{"type":40,"tag":2951,"props":3081,"children":3082},{},[3083],{"type":45,"value":3084},"number",{"type":40,"tag":2951,"props":3086,"children":3087},{},[3088],{"type":45,"value":3089},"Steps 1.5, 10, 11",{"type":40,"tag":2951,"props":3091,"children":3092},{},[3093],{"type":45,"value":3094},"GitHub issue number. GitHub only.",{"type":40,"tag":2919,"props":3096,"children":3097},{},[3098,3106,3110,3114],{"type":40,"tag":2951,"props":3099,"children":3100},{},[3101],{"type":40,"tag":122,"props":3102,"children":3104},{"className":3103},[],[3105],{"type":45,"value":429},{"type":40,"tag":2951,"props":3107,"children":3108},{},[3109],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3111,"children":3112},{},[3113],{"type":45,"value":3031},{"type":40,"tag":2951,"props":3115,"children":3116},{},[3117,3119,3125],{"type":45,"value":3118},"Full GitHub issue URL (e.g., ",{"type":40,"tag":122,"props":3120,"children":3122},{"className":3121},[],[3123],{"type":45,"value":3124},"https:\u002F\u002Fgithub.com\u002Fredhat-developer\u002Frhdh-plugins\u002Fissues\u002F607",{"type":45,"value":3126},"). GitHub only.",{"type":40,"tag":2919,"props":3128,"children":3129},{},[3130,3138,3142,3147],{"type":40,"tag":2951,"props":3131,"children":3132},{},[3133],{"type":40,"tag":122,"props":3134,"children":3136},{"className":3135},[],[3137],{"type":45,"value":436},{"type":40,"tag":2951,"props":3139,"children":3140},{},[3141],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3143,"children":3144},{},[3145],{"type":45,"value":3146},"Steps 10, 11",{"type":40,"tag":2951,"props":3148,"children":3149},{},[3150,3156,3157,3163],{"type":40,"tag":122,"props":3151,"children":3153},{"className":3152},[],[3154],{"type":45,"value":3155},"owner\u002Frepo",{"type":45,"value":1007},{"type":40,"tag":122,"props":3158,"children":3160},{"className":3159},[],[3161],{"type":45,"value":3162},"redhat-developer\u002Frhdh-plugins",{"type":45,"value":3126},{"type":40,"tag":2919,"props":3165,"children":3166},{},[3167,3175,3179,3183],{"type":40,"tag":2951,"props":3168,"children":3169},{},[3170],{"type":40,"tag":122,"props":3171,"children":3173},{"className":3172},[],[3174],{"type":45,"value":443},{"type":40,"tag":2951,"props":3176,"children":3177},{},[3178],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3180,"children":3181},{},[3182],{"type":45,"value":3056},{"type":40,"tag":2951,"props":3184,"children":3185},{},[3186,3188,3193],{"type":45,"value":3187},"Issue title for the PR body ",{"type":40,"tag":122,"props":3189,"children":3191},{"className":3190},[],[3192],{"type":45,"value":2295},{"type":45,"value":3194}," section. GitHub only.",{"type":40,"tag":2919,"props":3196,"children":3197},{},[3198,3206,3211,3215],{"type":40,"tag":2951,"props":3199,"children":3200},{},[3201],{"type":40,"tag":122,"props":3202,"children":3204},{"className":3203},[],[3205],{"type":45,"value":1971},{"type":40,"tag":2951,"props":3207,"children":3208},{},[3209],{"type":45,"value":3210},"object",{"type":40,"tag":2951,"props":3212,"children":3213},{},[3214],{"type":45,"value":3056},{"type":40,"tag":2951,"props":3216,"children":3217},{},[3218,3224,3226,3231,3233,3238,3240,3245],{"type":40,"tag":122,"props":3219,"children":3221},{"className":3220},[],[3222],{"type":45,"value":3223},"{ before: \"\u003Clocal-gif-path>\", after: \"\u003Clocal-gif-path>\" }",{"type":45,"value":3225}," — local GIF paths; ",{"type":40,"tag":122,"props":3227,"children":3229},{"className":3228},[],[3230],{"type":45,"value":4},{"type":45,"value":3232}," uploads them to the branch via GitHub Contents API and uses the resulting ",{"type":40,"tag":122,"props":3234,"children":3236},{"className":3235},[],[3237],{"type":45,"value":2211},{"type":45,"value":3239}," URLs in the PR body. ",{"type":40,"tag":122,"props":3241,"children":3243},{"className":3242},[],[3244],{"type":45,"value":782},{"type":45,"value":3246}," in no-e2e mode.",{"type":40,"tag":2919,"props":3248,"children":3249},{},[3250,3258,3262,3266],{"type":40,"tag":2951,"props":3251,"children":3252},{},[3253],{"type":40,"tag":122,"props":3254,"children":3256},{"className":3255},[],[3257],{"type":45,"value":2437},{"type":40,"tag":2951,"props":3259,"children":3260},{},[3261],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3263,"children":3264},{},[3265],{"type":45,"value":3056},{"type":40,"tag":2951,"props":3267,"children":3268},{},[3269],{"type":45,"value":3270},"Extra text inserted after the description (e.g., root cause analysis)",{"type":40,"tag":2919,"props":3272,"children":3273},{},[3274,3282,3286,3290],{"type":40,"tag":2951,"props":3275,"children":3276},{},[3277],{"type":40,"tag":122,"props":3278,"children":3280},{"className":3279},[],[3281],{"type":45,"value":2465},{"type":40,"tag":2951,"props":3283,"children":3284},{},[3285],{"type":45,"value":2963},{"type":40,"tag":2951,"props":3287,"children":3288},{},[3289],{"type":45,"value":3056},{"type":40,"tag":2951,"props":3291,"children":3292},{},[3293,3295,3300,3302,3308],{"type":45,"value":3294},"Markdown checklist for the ",{"type":40,"tag":122,"props":3296,"children":3298},{"className":3297},[],[3299],{"type":45,"value":2458},{"type":45,"value":3301}," section (e.g., ",{"type":40,"tag":122,"props":3303,"children":3305},{"className":3304},[],[3306],{"type":45,"value":3307},"\"- [ ] Open menu\\n- [ ] Verify scrollbar on hover\"",{"type":45,"value":192},{"type":40,"tag":41,"props":3310,"children":3311},{},[3312,3314,3319],{"type":45,"value":3313},"Skills that chain into ",{"type":40,"tag":122,"props":3315,"children":3317},{"className":3316},[],[3318],{"type":45,"value":4},{"type":45,"value":372},{"type":40,"tag":110,"props":3321,"children":3322},{},[3323],{"type":40,"tag":114,"props":3324,"children":3325},{},[3326,3334,3336,3341,3343,3348,3350,3355,3357,3362],{"type":40,"tag":118,"props":3327,"children":3328},{},[3329],{"type":40,"tag":122,"props":3330,"children":3332},{"className":3331},[],[3333],{"type":45,"value":338},{"type":45,"value":3335}," — provides ",{"type":40,"tag":122,"props":3337,"children":3339},{"className":3338},[],[3340],{"type":45,"value":346},{"type":45,"value":3342}," plus the relevant issue fields, optionally ",{"type":40,"tag":122,"props":3344,"children":3346},{"className":3345},[],[3347],{"type":45,"value":1971},{"type":45,"value":3349}," (full-e2e mode only), ",{"type":40,"tag":122,"props":3351,"children":3353},{"className":3352},[],[3354],{"type":45,"value":2437},{"type":45,"value":3356},", and ",{"type":40,"tag":122,"props":3358,"children":3360},{"className":3359},[],[3361],{"type":45,"value":2465},{"type":45,"value":534},{"type":40,"tag":41,"props":3364,"children":3365},{},[3366],{"type":45,"value":3367},"\u003Creference_index>",{"type":40,"tag":103,"props":3369,"children":3371},{"id":3370},"reference-index",[3372],{"type":45,"value":3373},"Reference Index",{"type":40,"tag":2911,"props":3375,"children":3376},{},[3377,3393],{"type":40,"tag":2915,"props":3378,"children":3379},{},[3380],{"type":40,"tag":2919,"props":3381,"children":3382},{},[3383,3388],{"type":40,"tag":2923,"props":3384,"children":3385},{},[3386],{"type":45,"value":3387},"Reference",{"type":40,"tag":2923,"props":3389,"children":3390},{},[3391],{"type":45,"value":3392},"Load when...",{"type":40,"tag":2944,"props":3394,"children":3395},{},[3396,3412,3440],{"type":40,"tag":2919,"props":3397,"children":3398},{},[3399,3407],{"type":40,"tag":2951,"props":3400,"children":3401},{},[3402],{"type":40,"tag":122,"props":3403,"children":3405},{"className":3404},[],[3406],{"type":45,"value":286},{"type":40,"tag":2951,"props":3408,"children":3409},{},[3410],{"type":45,"value":3411},"Always — at the start of every invocation (Step 1)",{"type":40,"tag":2919,"props":3413,"children":3414},{},[3415,3423],{"type":40,"tag":2951,"props":3416,"children":3417},{},[3418],{"type":40,"tag":122,"props":3419,"children":3421},{"className":3420},[],[3422],{"type":45,"value":471},{"type":40,"tag":2951,"props":3424,"children":3425},{},[3426,3428,3433,3434,3439],{"type":45,"value":3427},"When resolving Jira context (Step 1.5, ",{"type":40,"tag":122,"props":3429,"children":3431},{"className":3430},[],[3432],{"type":45,"value":346},{"type":45,"value":364},{"type":40,"tag":122,"props":3435,"children":3437},{"className":3436},[],[3438],{"type":45,"value":370},{"type":45,"value":192},{"type":40,"tag":2919,"props":3441,"children":3442},{},[3443,3451],{"type":40,"tag":2951,"props":3444,"children":3445},{},[3446],{"type":40,"tag":122,"props":3447,"children":3449},{"className":3448},[],[3450],{"type":45,"value":549},{"type":40,"tag":2951,"props":3452,"children":3453},{},[3454,3456,3461,3462,3467],{"type":45,"value":3455},"When resolving GitHub issue context (Step 1.5, ",{"type":40,"tag":122,"props":3457,"children":3459},{"className":3458},[],[3460],{"type":45,"value":346},{"type":45,"value":364},{"type":40,"tag":122,"props":3463,"children":3465},{"className":3464},[],[3466],{"type":45,"value":15},{"type":45,"value":192},{"type":40,"tag":41,"props":3469,"children":3470},{},[3471],{"type":45,"value":3472},"\u003C\u002Freference_index>",{"items":3474,"total":3645},[3475,3491,3505,3524,3539,3556,3567,3585,3597,3608,3620,3632],{"slug":3476,"name":3476,"fn":3477,"description":3478,"org":3479,"tags":3480,"stars":23,"repoUrl":24,"updatedAt":3490},"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},[3481,3484,3487],{"name":3482,"slug":3483,"type":16},"Agents","agents",{"name":3485,"slug":3486,"type":16},"Code Analysis","code-analysis",{"name":3488,"slug":3489,"type":16},"Engineering","engineering","2026-07-16T06:03:24.758348",{"slug":3492,"name":3492,"fn":3493,"description":3494,"org":3495,"tags":3496,"stars":23,"repoUrl":24,"updatedAt":3504},"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},[3497,3498,3501],{"name":3488,"slug":3489,"type":16},{"name":3499,"slug":3500,"type":16},"Maintenance","maintenance",{"name":3502,"slug":3503,"type":16},"Migration","migration","2026-07-16T06:03:24.067361",{"slug":3506,"name":3506,"fn":3507,"description":3508,"org":3509,"tags":3510,"stars":23,"repoUrl":24,"updatedAt":3523},"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},[3511,3514,3517,3520],{"name":3512,"slug":3513,"type":16},"Automation","automation",{"name":3515,"slug":3516,"type":16},"Configuration","configuration",{"name":3518,"slug":3519,"type":16},"Containers","containers",{"name":3521,"slug":3522,"type":16},"Deployment","deployment","2026-07-16T06:03:27.784453",{"slug":338,"name":338,"fn":3525,"description":3526,"org":3527,"tags":3528,"stars":23,"repoUrl":24,"updatedAt":3538},"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},[3529,3532,3535],{"name":3530,"slug":3531,"type":16},"Debugging","debugging",{"name":3533,"slug":3534,"type":16},"QA","qa",{"name":3536,"slug":3537,"type":16},"Testing","testing","2026-07-29T06:00:33.054762",{"slug":3540,"name":3540,"fn":3541,"description":3542,"org":3543,"tags":3544,"stars":23,"repoUrl":24,"updatedAt":3555},"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},[3545,3548,3549,3552],{"name":3546,"slug":3547,"type":16},"Compliance","compliance",{"name":3488,"slug":3489,"type":16},{"name":3550,"slug":3551,"type":16},"Reporting","reporting",{"name":3553,"slug":3554,"type":16},"Security","security","2026-08-01T05:41:57.852801",{"slug":3557,"name":3557,"fn":3558,"description":3559,"org":3560,"tags":3561,"stars":23,"repoUrl":24,"updatedAt":3566},"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},[3562,3563],{"name":3521,"slug":3522,"type":16},{"name":3564,"slug":3565,"type":16},"Plugin Development","plugin-development","2026-07-16T06:02:28.983498",{"slug":3568,"name":3568,"fn":3569,"description":3570,"org":3571,"tags":3572,"stars":23,"repoUrl":24,"updatedAt":3584},"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},[3573,3576,3578,3581],{"name":3574,"slug":3575,"type":16},"Auth","auth",{"name":3577,"slug":370,"type":16},"Jira",{"name":3579,"slug":3580,"type":16},"MCP","mcp",{"name":3582,"slug":3583,"type":16},"OAuth","oauth","2026-07-29T06:00:33.525179",{"slug":3586,"name":3586,"fn":3587,"description":3588,"org":3589,"tags":3590,"stars":23,"repoUrl":24,"updatedAt":3596},"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},[3591,3592,3593],{"name":3512,"slug":3513,"type":16},{"name":3521,"slug":3522,"type":16},{"name":3594,"slug":3595,"type":16},"GitLab","gitlab","2026-07-16T06:00:19.516231",{"slug":3598,"name":3598,"fn":3599,"description":3600,"org":3601,"tags":3602,"stars":23,"repoUrl":24,"updatedAt":3607},"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},[3603,3604,3605,3606],{"name":3512,"slug":3513,"type":16},{"name":18,"slug":19,"type":16},{"name":3521,"slug":3522,"type":16},{"name":3488,"slug":3489,"type":16},"2026-07-16T06:03:28.123118",{"slug":3609,"name":3609,"fn":3610,"description":3611,"org":3612,"tags":3613,"stars":23,"repoUrl":24,"updatedAt":3619},"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},[3614,3615,3616],{"name":3546,"slug":3547,"type":16},{"name":3499,"slug":3500,"type":16},{"name":3617,"slug":3618,"type":16},"Operations","operations","2026-07-16T06:03:19.344038",{"slug":3621,"name":3621,"fn":3622,"description":3623,"org":3624,"tags":3625,"stars":23,"repoUrl":24,"updatedAt":3631},"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},[3626,3627,3630],{"name":3488,"slug":3489,"type":16},{"name":3628,"slug":3629,"type":16},"Frontend","frontend",{"name":3502,"slug":3503,"type":16},"2026-07-16T06:03:27.078987",{"slug":3633,"name":3633,"fn":3634,"description":3635,"org":3636,"tags":3637,"stars":23,"repoUrl":24,"updatedAt":3644},"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},[3638,3639,3642,3643],{"name":3512,"slug":3513,"type":16},{"name":3640,"slug":3641,"type":16},"Code Review","code-review",{"name":3521,"slug":3522,"type":16},{"name":3488,"slug":3489,"type":16},"2026-07-16T06:03:20.380044",24,{"items":3647,"total":3645},[3648,3654,3660,3667,3673,3680,3685],{"slug":3476,"name":3476,"fn":3477,"description":3478,"org":3649,"tags":3650,"stars":23,"repoUrl":24,"updatedAt":3490},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3651,3652,3653],{"name":3482,"slug":3483,"type":16},{"name":3485,"slug":3486,"type":16},{"name":3488,"slug":3489,"type":16},{"slug":3492,"name":3492,"fn":3493,"description":3494,"org":3655,"tags":3656,"stars":23,"repoUrl":24,"updatedAt":3504},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3657,3658,3659],{"name":3488,"slug":3489,"type":16},{"name":3499,"slug":3500,"type":16},{"name":3502,"slug":3503,"type":16},{"slug":3506,"name":3506,"fn":3507,"description":3508,"org":3661,"tags":3662,"stars":23,"repoUrl":24,"updatedAt":3523},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3663,3664,3665,3666],{"name":3512,"slug":3513,"type":16},{"name":3515,"slug":3516,"type":16},{"name":3518,"slug":3519,"type":16},{"name":3521,"slug":3522,"type":16},{"slug":338,"name":338,"fn":3525,"description":3526,"org":3668,"tags":3669,"stars":23,"repoUrl":24,"updatedAt":3538},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3670,3671,3672],{"name":3530,"slug":3531,"type":16},{"name":3533,"slug":3534,"type":16},{"name":3536,"slug":3537,"type":16},{"slug":3540,"name":3540,"fn":3541,"description":3542,"org":3674,"tags":3675,"stars":23,"repoUrl":24,"updatedAt":3555},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3676,3677,3678,3679],{"name":3546,"slug":3547,"type":16},{"name":3488,"slug":3489,"type":16},{"name":3550,"slug":3551,"type":16},{"name":3553,"slug":3554,"type":16},{"slug":3557,"name":3557,"fn":3558,"description":3559,"org":3681,"tags":3682,"stars":23,"repoUrl":24,"updatedAt":3566},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3683,3684],{"name":3521,"slug":3522,"type":16},{"name":3564,"slug":3565,"type":16},{"slug":3568,"name":3568,"fn":3569,"description":3570,"org":3686,"tags":3687,"stars":23,"repoUrl":24,"updatedAt":3584},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3688,3689,3690,3691],{"name":3574,"slug":3575,"type":16},{"name":3577,"slug":370,"type":16},{"name":3579,"slug":3580,"type":16},{"name":3582,"slug":3583,"type":16}]