[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ACVB23NM9FCW05HZPNA2V1":3,"skill-same:01M6ACVB23NM9FCW05HZPNA2V1":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":6,"updatedAt":53,"install":54,"resources":66},"01M6ACVB23NM9FCW05HZPNA2V1","pull-request",null,"Open a pull request for the current Horizon UI branch the right way — run the full preflight gate first (changelog + docs updated, type-check + build \"compiling passed\", new UI strings translated across all 8 locales, license headers, lint + unit tests, live-OAP validation), commit with NO AI trailers, push, and open the PR against apache\u002Fskywalking-horizon-ui. After it merges, return to main, fast-forward to latest, and delete the merged local branch.","apache\u002Fskywalking-horizon-ui","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6ACV2YS1FGZP4TNKNEXCRTY",23,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-horizon-ui\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpull-request\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,9,36,37,38],"pull request","pull","docs","unit tests","commit","pr","delete","run","lint","validation","changelog","push","skywalking","license","ui","2026-11-10 10:12:30",false,"---\nname: pull-request\ndescription: Open a pull request for the current Horizon UI branch the right way — run the full preflight gate first (changelog + docs updated, type-check + build \"compiling passed\", new UI strings translated across all 8 locales, license headers, lint + unit tests, live-OAP validation), commit with NO AI trailers, push, and open the PR against apache\u002Fskywalking-horizon-ui. After it merges, return to main, fast-forward to latest, and delete the merged local branch.\nuser-invocable: true\n---\n\n# Open (and clean up after) a Horizon UI pull request\n\nUse this when the developer asks to open a PR \u002F push changes for review. The\npreflight gate below mirrors what CI (`.github\u002Fworkflows\u002Fci.yaml`) will run, so\na green gate means a green PR. Run everything from the **repo root**.\n\n## Ground rules (non-negotiable)\n\n- **No AI attribution, ever.** Never add `Co-Authored-By: Claude` (or any\n  AI \u002F Anthropic \u002F `noreply@anthropic.com` line) and never append the\n  \"? Generated with Claude Code\" footer to a commit message or PR body.\n  This is a per-project directive in `CLAUDE.md`.\n- **Never commit on `main`.** Branch first. `origin` is\n  `apache\u002Fskywalking-horizon-ui`; committers push branches **directly** to it\n  (no fork). Confirm you can with\n  `gh api repos\u002Fapache\u002Fskywalking-horizon-ui -q .permissions` (look for\n  `\"push\": true`).\n\n## 1 — Preflight gate (do this BEFORE opening the PR)\n\nWalk the list in order. Each item maps to a thing CI enforces or a thing a\nreviewer will bounce the PR for. If you genuinely can't run one, say so in the\nPR body rather than skipping silently.\n\n### A. Changelog updated\nIf the change is **operator-visible** — a new page \u002F tab \u002F widget, a new\ncomponent flag, a bundled-template change (a layer gaining a capability, new\ndashboards \u002F widgets \u002F metrics), a new admin surface — add an entry to the\nchangelog file of the version in development: `docs\u002Fchangelog\u002F\u003Cversion>.md`,\nwhere `\u003Cversion>` is what `package.json` carries as `*-dev` (`1.0.0-dev` →\n`docs\u002Fchangelog\u002F1.0.0.md`). Written from the operator's point of view. **One\nline per paragraph \u002F bullet — no hard wrap** (house style; see `CLAUDE.md`).\nEvery released version keeps its own file and those are frozen — never edit\nthem. A pure refactor \u002F tooling \u002F internal-docs change gets **no** changelog\nentry.\n\n### B. docs\u002F updated\nIf observable behavior or configuration changed, update the public docs under\n`docs\u002F` (end-user \u002F operator POV — what it does, how to configure it, how to\noperate it; never internal code narration). Flat layout, registered in\n`docs\u002Fmenu.yml`. Same one-line-per-paragraph house style.\n\n### C. Compiling passed (type-check + build)\nThis is what \"compiling passed\" means here — CI type-checks, then builds both\napps as part of `pnpm package`:\n\n```bash\npnpm -r run type-check                              # vue-tsc + tsc, strict, no `any`\npnpm --filter @skywalking-horizon-ui\u002Fui build       # vite build (UI)\npnpm --filter @skywalking-horizon-ui\u002Fbff build      # esbuild bundle (BFF)\n```\n\n### D. New UI strings are translated (all 8 locales)\nA new on-screen string must not ship hardcoded or English-only.\n\n- **UI chrome** strings live in `apps\u002Fui\u002Fsrc\u002Fi18n\u002Flocales\u002F\u003Clocale>.json`.\n  **English (`en.json`) is the source of truth — author the key there first**,\n  then add the *same* key with a real translation to every other catalog:\n  `zh-CN, es, pt, ja, ko, de, fr`. A missing key silently falls back to\n  English, so \"did I actually translate it?\" needs an explicit check:\n\n  ```bash\n  # Report en.json keys still missing from each non-English UI catalog:\n  node -e '\n  const fs=require(\"fs\"),d=\"apps\u002Fui\u002Fsrc\u002Fi18n\u002Flocales\u002F\";\n  const flat=(o,p=\"\")=>Object.entries(o).flatMap(([k,v])=>v&&typeof v===\"object\"?flat(v,p+k+\".\"):[p+k]);\n  const en=new Set(flat(JSON.parse(fs.readFileSync(d+\"en.json\"))));\n  for(const l of [\"zh-CN\",\"es\",\"pt\",\"ja\",\"ko\",\"de\",\"fr\"]){\n    const have=new Set(flat(JSON.parse(fs.readFileSync(d+l+\".json\"))));\n    const miss=[...en].filter(k=>!have.has(k));\n    console.log(l, miss.length?(\"missing \"+miss.length+\": \"+miss.slice(0,8).join(\", \")):\"complete\");\n  }'\n  ```\n\n- **BFF-shipped template** strings (bundled layer \u002F overview dashboards) are\n  translated via sibling `*.i18n.\u003Clang>.json` overlays, not the UI catalogs.\n  Validate their structure (catalog drift = a key not in the source template is\n  an error):\n\n  ```bash\n  pnpm --filter @skywalking-horizon-ui\u002Fbff run i18n:validate\n  ```\n\n- **Translation policy** (`CLAUDE.md`): translate *meaning*, not words. Product \u002F\n  protocol names, OAP scope enums (Service \u002F ServiceInstance \u002F Endpoint \u002F\n  Process), layer keys, MQE function names, metric ids, env vars, HTTP \u002F SQL \u002F\n  log keywords stay **verbatim** in every locale. OAP-supplied data (service \u002F\n  instance \u002F endpoint names, alarm rule names, log lines, span ops, tag values)\n  is **never** translated. AI-seeded translations are acceptable to ship.\n\n### E. License headers\nEvery new `.ts` \u002F `.vue` \u002F `.js` \u002F `.mjs` \u002F `.yaml` \u002F `.yml` \u002F `.css` \u002F `.scss`\nneeds the Apache header (JSON \u002F Markdown \u002F lock files excluded):\n\n```bash\npnpm license:check        # license-eye -c .licenserc.yaml header check\npnpm license:fix          # auto-insert any missing headers, then re-check\n```\n\n### F. Lint + unit tests\n```bash\npnpm -r run lint\npnpm -r run test:unit\n```\n\n### G. Validate against a live OAP (when the change touches OAP wire\u002Frender)\nA green type-check does **not** prove a feature works. If the change touches an\nOAP query, a wire shape, a metric\u002FMQE, or a rendered screen, boot against a real\nOAP (`\u002Flocal-boot` — demo or local) and confirm the actual request\u002Fresponse and\nthe rendered UI. \"I couldn't validate against OAP\" is an honest thing to put in\nthe PR; shipping an unvalidated wire change as \"done\" is not.\n\n## 2 — Branch, commit, push\n\n```bash\n# Branch off main if you're on it (type: feat | fix | chore | docs | refactor):\ngit checkout -b \u003Ctype>\u002F\u003Cshort-slug>\n\ngit add \u003Conly the files you changed>      # not a blanket `git add -A`\ngit commit -F - \u003C\u003C'MSG'\n\u003Ctype>(\u003Cscope>): \u003Cimperative subject>\n\n\u003Cbody: what changed and why, operator POV where relevant>\nMSG\n# ^ NO Co-Authored-By \u002F AI footer.\n\ngit push -u origin \u003Ctype>\u002F\u003Cshort-slug>\n```\n\n## 3 — Open the PR\n\n```bash\ngh pr create --repo apache\u002Fskywalking-horizon-ui \\\n  --base main --head \u003Ctype>\u002F\u003Cshort-slug> \\\n  --title \"\u003Cconventional-commit title>\" \\\n  --body \"$(cat \u003C\u003C'BODY'\n## Why\n\u003Cthe problem \u002F motivation>\n\n## What\n\u003Cthe change, reviewer-facing>\n\n## Validation\n\u003Ctype-check\u002Fbuild green; live-OAP render checked, or why not; i18n filled>\nBODY\n)\"\n```\n\nNo AI footer in the body. Capture the returned PR URL\u002Fnumber for step 4.\n\n### The PR body describes the feature, not how it was reviewed\n\nThe body is what a reviewer or a future archaeologist reads to understand the\n**change** — what it does, why, how it was validated. It is never a log of the\nprocess that produced it.\n\n**Never add a \"Review round N\" (or \"Round N feedback\", \"Findings from review\",\netc.) section**, even when a branch goes through several rounds of external\nreview (human or automated — `codex`, ultrareview, a colleague's pass) before\nmerge. Each round's fixes fold silently into the relevant `## What` \u002F\n`## Validation` paragraph as if they had always been there — the reader does\nnot need to know a bug was found on round 5 and fixed on round 6; they need to\nknow the shipped behavior is correct now. If a fix is worth a sentence, it\nearns that sentence in the section describing the feature it touches, phrased\nas a fact about the code, not as a narrated correction (\"X is now refused\"\ninstead of \"round 6 found that X was silently rounded, now fixed\").\n\nThis applies whether the PR was **squashed to one commit** (the common case\nhere) or kept as several — either way, the description is authored once, for\nthe state being merged, not accreted turn-by-turn as review comments land.\n\nWhen you're updating an already-open PR's body after another review pass:\n**rewrite the relevant section in place**, don't append a new one. If a\nsection starts to read like a changelog of the review itself, that's the\nsignal to fold it back into the feature description and delete the seams.\n\nOperator-visible fixes still belong in the in-development changelog file\n(`docs\u002Fchangelog\u002F\u003Cversion>.md`) per the usual house style (see the preflight\ngate above) — that file *is* allowed to say what changed, because it's read\nchronologically across releases. The PR body is not; it's read once, describing\none final state.\n\n## 4 — After the PR is MERGED: return to main, update, delete the branch\n\nOnly run this once the PR actually shows `MERGED`. Don't assume — check.\n\n```bash\nPR=\u003Cnumber>; BR=\u003Ctype>\u002F\u003Cshort-slug>\n\ngh pr view \"$PR\" --repo apache\u002Fskywalking-horizon-ui --json state -q .state   # expect: MERGED\n\ngit checkout main\ngit pull --ff-only origin main          # main is the default branch — safe to fast-forward\ngit branch -d \"$BR\"                      # safe delete; only removes a fully-merged branch\n# If it was SQUASH-merged, your branch commit isn't an ancestor of main, so `-d`\n# errors \"not fully merged\". You already confirmed MERGED via gh above, so force it:\ngit branch -D \"$BR\"\n\ngit remote prune origin                  # drop the stale remote-tracking ref (GitHub auto-deletes the head branch on merge)\n```\n\nGotchas:\n- This repo's primary clone is sometimes parked on a feature branch on purpose.\n  If you have other WIP, confirm before switching to `main` and deleting.\n- If the remote head branch was **not** auto-deleted on merge and you want it\n  gone too: `git push origin --delete \"$BR\"`.\n","# Open (and clean up after) a Horizon UI pull request\n\nUse this when the developer asks to open a PR \u002F push changes for review. The\npreflight gate below mirrors what CI (`.github\u002Fworkflows\u002Fci.yaml`) will run, so\na green gate means a green PR. Run everything from the **repo root**.\n\n## Ground rules (non-negotiable)\n\n- **No AI attribution, ever.** Never add `Co-Authored-By: Claude` (or any\n  AI \u002F Anthropic \u002F `noreply@anthropic.com` line) and never append the\n  \"? Generated with Claude Code\" footer to a commit message or PR body.\n  This is a per-project directive in `CLAUDE.md`.\n- **Never commit on `main`.** Branch first. `origin` is\n  `apache\u002Fskywalking-horizon-ui`; committers push branches **directly** to it\n  (no fork). Confirm you can with\n  `gh api repos\u002Fapache\u002Fskywalking-horizon-ui -q .permissions` (look for\n  `\"push\": true`).\n\n## 1 — Preflight gate (do this BEFORE opening the PR)\n\nWalk the list in order. Each item maps to a thing CI enforces or a thing a\nreviewer will bounce the PR for. If you genuinely can't run one, say so in the\nPR body rather than skipping silently.\n\n### A. Changelog updated\nIf the change is **operator-visible** — a new page \u002F tab \u002F widget, a new\ncomponent flag, a bundled-template change (a layer gaining a capability, new\ndashboards \u002F widgets \u002F metrics), a new admin surface — add an entry to the\nchangelog file of the version in development: `docs\u002Fchangelog\u002F\u003Cversion>.md`,\nwhere `\u003Cversion>` is what `package.json` carries as `*-dev` (`1.0.0-dev` →\n`docs\u002Fchangelog\u002F1.0.0.md`). Written from the operator's point of view. **One\nline per paragraph \u002F bullet — no hard wrap** (house style; see `CLAUDE.md`).\nEvery released version keeps its own file and those are frozen — never edit\nthem. A pure refactor \u002F tooling \u002F internal-docs change gets **no** changelog\nentry.\n\n### B. docs\u002F updated\nIf observable behavior or configuration changed, update the public docs under\n`docs\u002F` (end-user \u002F operator POV — what it does, how to configure it, how to\noperate it; never internal code narration). Flat layout, registered in\n`docs\u002Fmenu.yml`. Same one-line-per-paragraph house style.\n\n### C. Compiling passed (type-check + build)\nThis is what \"compiling passed\" means here — CI type-checks, then builds both\napps as part of `pnpm package`:\n\n```bash\npnpm -r run type-check                              # vue-tsc + tsc, strict, no `any`\npnpm --filter @skywalking-horizon-ui\u002Fui build       # vite build (UI)\npnpm --filter @skywalking-horizon-ui\u002Fbff build      # esbuild bundle (BFF)\n```\n\n### D. New UI strings are translated (all 8 locales)\nA new on-screen string must not ship hardcoded or English-only.\n\n- **UI chrome** strings live in `apps\u002Fui\u002Fsrc\u002Fi18n\u002Flocales\u002F\u003Clocale>.json`.\n  **English (`en.json`) is the source of truth — author the key there first**,\n  then add the *same* key with a real translation to every other catalog:\n  `zh-CN, es, pt, ja, ko, de, fr`. A missing key silently falls back to\n  English, so \"did I actually translate it?\" needs an explicit check:\n\n  ```bash\n  # Report en.json keys still missing from each non-English UI catalog:\n  node -e '\n  const fs=require(\"fs\"),d=\"apps\u002Fui\u002Fsrc\u002Fi18n\u002Flocales\u002F\";\n  const flat=(o,p=\"\")=>Object.entries(o).flatMap(([k,v])=>v&&typeof v===\"object\"?flat(v,p+k+\".\"):[p+k]);\n  const en=new Set(flat(JSON.parse(fs.readFileSync(d+\"en.json\"))));\n  for(const l of [\"zh-CN\",\"es\",\"pt\",\"ja\",\"ko\",\"de\",\"fr\"]){\n    const have=new Set(flat(JSON.parse(fs.readFileSync(d+l+\".json\"))));\n    const miss=[...en].filter(k=>!have.has(k));\n    console.log(l, miss.length?(\"missing \"+miss.length+\": \"+miss.slice(0,8).join(\", \")):\"complete\");\n  }'\n  ```\n\n- **BFF-shipped template** strings (bundled layer \u002F overview dashboards) are\n  translated via sibling `*.i18n.\u003Clang>.json` overlays, not the UI catalogs.\n  Validate their structure (catalog drift = a key not in the source template is\n  an error):\n\n  ```bash\n  pnpm --filter @skywalking-horizon-ui\u002Fbff run i18n:validate\n  ```\n\n- **Translation policy** (`CLAUDE.md`): translate *meaning*, not words. Product \u002F\n  protocol names, OAP scope enums (Service \u002F ServiceInstance \u002F Endpoint \u002F\n  Process), layer keys, MQE function names, metric ids, env vars, HTTP \u002F SQL \u002F\n  log keywords stay **verbatim** in every locale. OAP-supplied data (service \u002F\n  instance \u002F endpoint names, alarm rule names, log lines, span ops, tag values)\n  is **never** translated. AI-seeded translations are acceptable to ship.\n\n### E. License headers\nEvery new `.ts` \u002F `.vue` \u002F `.js` \u002F `.mjs` \u002F `.yaml` \u002F `.yml` \u002F `.css` \u002F `.scss`\nneeds the Apache header (JSON \u002F Markdown \u002F lock files excluded):\n\n```bash\npnpm license:check        # license-eye -c .licenserc.yaml header check\npnpm license:fix          # auto-insert any missing headers, then re-check\n```\n\n### F. Lint + unit tests\n```bash\npnpm -r run lint\npnpm -r run test:unit\n```\n\n### G. Validate against a live OAP (when the change touches OAP wire\u002Frender)\nA green type-check does **not** prove a feature works. If the change touches an\nOAP query, a wire shape, a metric\u002FMQE, or a rendered screen, boot against a real\nOAP (`\u002Flocal-boot` — demo or local) and confirm the actual request\u002Fresponse and\nthe rendered UI. \"I couldn't validate against OAP\" is an honest thing to put in\nthe PR; shipping an unvalidated wire change as \"done\" is not.\n\n## 2 — Branch, commit, push\n\n```bash\n# Branch off main if you're on it (type: feat | fix | chore | docs | refactor):\ngit checkout -b \u003Ctype>\u002F\u003Cshort-slug>\n\ngit add \u003Conly the files you changed>      # not a blanket `git add -A`\ngit commit -F - \u003C\u003C'MSG'\n\u003Ctype>(\u003Cscope>): \u003Cimperative subject>\n\n\u003Cbody: what changed and why, operator POV where relevant>\nMSG\n# ^ NO Co-Authored-By \u002F AI footer.\n\ngit push -u origin \u003Ctype>\u002F\u003Cshort-slug>\n```\n\n## 3 — Open the PR\n\n```bash\ngh pr create --repo apache\u002Fskywalking-horizon-ui \\\n  --base main --head \u003Ctype>\u002F\u003Cshort-slug> \\\n  --title \"\u003Cconventional-commit title>\" \\\n  --body \"$(cat \u003C\u003C'BODY'\n## Why\n\u003Cthe problem \u002F motivation>\n\n## What\n\u003Cthe change, reviewer-facing>\n\n## Validation\n\u003Ctype-check\u002Fbuild green; live-OAP render checked, or why not; i18n filled>\nBODY\n)\"\n```\n\nNo AI footer in the body. Capture the returned PR URL\u002Fnumber for step 4.\n\n### The PR body describes the feature, not how it was reviewed\n\nThe body is what a reviewer or a future archaeologist reads to understand the\n**change** — what it does, why, how it was validated. It is never a log of the\nprocess that produced it.\n\n**Never add a \"Review round N\" (or \"Round N feedback\", \"Findings from review\",\netc.) section**, even when a branch goes through several rounds of external\nreview (human or automated — `codex`, ultrareview, a colleague's pass) before\nmerge. Each round's fixes fold silently into the relevant `## What` \u002F\n`## Validation` paragraph as if they had always been there — the reader does\nnot need to know a bug was found on round 5 and fixed on round 6; they need to\nknow the shipped behavior is correct now. If a fix is worth a sentence, it\nearns that sentence in the section describing the feature it touches, phrased\nas a fact about the code, not as a narrated correction (\"X is now refused\"\ninstead of \"round 6 found that X was silently rounded, now fixed\").\n\nThis applies whether the PR was **squashed to one commit** (the common case\nhere) or kept as several — either way, the description is authored once, for\nthe state being merged, not accreted turn-by-turn as review comments land.\n\nWhen you're updating an already-open PR's body after another review pass:\n**rewrite the relevant section in place**, don't append a new one. If a\nsection starts to read like a changelog of the review itself, that's the\nsignal to fold it back into the feature description and delete the seams.\n\nOperator-visible fixes still belong in the in-development changelog file\n(`docs\u002Fchangelog\u002F\u003Cversion>.md`) per the usual house style (see the preflight\ngate above) — that file *is* allowed to say what changed, because it's read\nchronologically across releases. The PR body is not; it's read once, describing\none final state.\n\n## 4 — After the PR is MERGED: return to main, update, delete the branch\n\nOnly run this once the PR actually shows `MERGED`. Don't assume — check.\n\n```bash\nPR=\u003Cnumber>; BR=\u003Ctype>\u002F\u003Cshort-slug>\n\ngh pr view \"$PR\" --repo apache\u002Fskywalking-horizon-ui --json state -q .state   # expect: MERGED\n\ngit checkout main\ngit pull --ff-only origin main          # main is the default branch — safe to fast-forward\ngit branch -d \"$BR\"                      # safe delete; only removes a fully-merged branch\n# If it was SQUASH-merged, your branch commit isn't an ancestor of main, so `-d`\n# errors \"not fully merged\". You already confirmed MERGED via gh above, so force it:\ngit branch -D \"$BR\"\n\ngit remote prune origin                  # drop the stale remote-tracking ref (GitHub auto-deletes the head branch on merge)\n```\n\nGotchas:\n- This repo's primary clone is sometimes parked on a feature branch on purpose.\n  If you have other WIP, confirm before switching to `main` and deleting.\n- If the remote head branch was **not** auto-deleted on merge and you want it\n  gone too: `git push origin --delete \"$BR\"`.\n",{"name":5,"description":7,"user-invocable":44},true,"main","e5e3bbc552ddcc65d15221621d94012f2eee19df",".claude\u002Fskills\u002Fpull-request",10,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-horizon-ui","https:\u002F\u002Fskywalking.apache.org\u002F","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-11 11:55:13",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":44},[56,59,62],{"tool":57,"command":58},"npx","npx skills add apache\u002Fskywalking-horizon-ui --skill pull-request",{"tool":60,"command":61},"bunx","bunx skills add apache\u002Fskywalking-horizon-ui --skill pull-request",{"tool":63,"command":64},"pnpm","pnpm dlx skills add apache\u002Fskywalking-horizon-ui --skill pull-request","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-horizon-ui\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fpull-request\u002FSKILL.md",[],[68,83],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":39},"01M6ACV7ME2VDF1F60XFB5SMPP","local-boot","Boot the Horizon UI dev env (BFF + UI) against a local OAP or the public Apache demo OAP. Uses the repo's committed, env-driven horizon.yaml — the same config the image ships — and injects the OAP target + dev users purely via HORIZON_* environment variables. Handles the apps\u002Fbff cwd \u002F HORIZON_CONFIG gotcha and the demo OAP password (kept out of git via the cached oap-demo-env-auth.key). Also covers booting with the AI assistant enabled (Amazon Bedrock \u002F DeepSeek), keyed from the git-ignored bedrocks-api.key.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-horizon-ui\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Flocal-boot\u002FSKILL.md",[],[75,76,77,78,79,80,81,82,9,38],"boot","local boot","image","assistant","auth","config","git","dev",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":96,"publishedAt":39},"01M6ACV56VGHYB8QWD8KMZTJZ9","build-dashboard","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-horizon-ui\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fbuild-dashboard\u002FSKILL.md",[88,91],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[97,98],"dashboard","build dashboard"]