[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H48R6ZH7YMVPMVWMMWT3RA":3,"skill-same:01M6H48R6ZH7YMVPMVWMMWT3RA":75},{"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":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":74},"01M6H48R6ZH7YMVPMVWMMWT3RA","dx-hub-init",null,"Initialize a hub directory for multi-repo orchestration. Discovers sibling repos, merges configs, validates CLI compatibility. Use when setting up hub mode for the first time. Trigger on \"init hub\", \"set up hub\", \"multi-repo setup\".","easingthemes\u002Fdx-aem-flow","easingthemes","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2750284?v=4","01M6H3XYGJY8QCX9ES36P2WF4H","Dragan Filipović","01M6H3XYMN1XVSGKN7N79SW3RH",7,"MIT","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-init\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"dx hub init","init","dx","hub","hub init","edit","mode","repo setup","time","default","up","directory","write","read","multi-repo","configure","Bash","SET","orchestration","cli","2026-11-10 10:12:30",false,"---\nname: dx-hub-init\ndescription: Initialize a hub directory for multi-repo orchestration. Discovers sibling repos, merges configs, validates CLI compatibility. Use when setting up hub mode for the first time. Trigger on \"init hub\", \"set up hub\", \"multi-repo setup\".\nwhen_to_use: \"Use when setting up a hub directory for multi-repo orchestration for the first time. Trigger on 'init hub', 'set up hub', 'multi-repo setup', 'initialize hub', or 'configure multi-repo orchestration'.\"\nargument-hint: \"[path to hub directory (default: ..\u002F.hub)]\"\ndisable-model-invocation: true\nallowed-tools: [\"Read\", \"Edit\", \"Glob\", \"Grep\", \"Write\", \"Bash\"]\n---\n\nYou set up a `.hub\u002F` directory that orchestrates work across multiple repos via dx-core hub mode.\n\n## Flow\n\n```dot\ndigraph hub_init {\n    \"Validate CLI\" [shape=box];\n    \"CLI compatible?\" [shape=diamond];\n    \"STOP: CLI incompatible\" [shape=doublecircle];\n    \"Determine hub path\" [shape=box];\n    \"Hub already exists?\" [shape=diamond];\n    \"Confirm reinit\" [shape=diamond];\n    \"STOP: User cancelled\" [shape=doublecircle];\n    \"Discover repos\" [shape=box];\n    \"Present repos\" [shape=box];\n    \"User selects repos\" [shape=diamond];\n    \"Build config\" [shape=box];\n    \"Create hub structure\" [shape=box];\n    \"Configure Claude Code settings\" [shape=box];\n    \"Generate CLAUDE.md\" [shape=box];\n    \"Offer workspace file\" [shape=diamond];\n    \"Create .code-workspace\" [shape=box];\n    \"Summary\" [shape=doublecircle];\n\n    \"Validate CLI\" -> \"CLI compatible?\";\n    \"CLI compatible?\" -> \"Determine hub path\" [label=\"yes\"];\n    \"CLI compatible?\" -> \"STOP: CLI incompatible\" [label=\"no\"];\n    \"Determine hub path\" -> \"Hub already exists?\";\n    \"Hub already exists?\" -> \"Confirm reinit\" [label=\"yes\"];\n    \"Hub already exists?\" -> \"Discover repos\" [label=\"no\"];\n    \"Confirm reinit\" -> \"Discover repos\" [label=\"yes, reinit\"];\n    \"Confirm reinit\" -> \"STOP: User cancelled\" [label=\"no\"];\n    \"Discover repos\" -> \"Present repos\";\n    \"Present repos\" -> \"User selects repos\";\n    \"User selects repos\" -> \"Build config\" [label=\"confirmed\"];\n    \"User selects repos\" -> \"STOP: User cancelled\" [label=\"none selected\"];\n    \"Build config\" -> \"Create hub structure\";\n    \"Create hub structure\" -> \"Configure Claude Code settings\";\n    \"Configure Claude Code settings\" -> \"Generate CLAUDE.md\";\n    \"Generate CLAUDE.md\" -> \"Offer workspace file\";\n    \"Offer workspace file\" -> \"Create .code-workspace\" [label=\"yes\"];\n    \"Offer workspace file\" -> \"Summary\" [label=\"no\"];\n    \"Create .code-workspace\" -> \"Summary\";\n}\n```\n\n## Node Details\n\n### Validate CLI\n\nRun:\n```bash\nclaude --version\nclaude -p --help 2>&1 | grep -q 'output-format'\n```\n\nBoth must succeed. If `claude --version` fails, the CLI is not installed. If `output-format` is absent, the CLI version is too old to support hub dispatch (requires `--output-format` flag for machine-readable output).\n\nFail with clear message:\n```\nERROR: Hub mode requires Claude Code CLI with --output-format support.\n  - Install: https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fclaude-code\n  - Minimum version: one that supports `claude -p --output-format`\n```\n\n### CLI compatible?\n\n- **yes** — both checks passed → proceed to \"Determine hub path\"\n- **no** — either check failed → go to \"STOP: CLI incompatible\"\n\n### STOP: CLI incompatible\n\nPrint the error message from \"Validate CLI\". STOP.\n\n### Determine hub path\n\nIf the user provided an argument, use it as the hub path. Otherwise default to `..\u002F.hub` relative to the current working directory.\n\nResolve to an absolute path for all subsequent operations:\n```bash\nHUB_PATH=$(realpath \"${ARGUMENT:-..\u002F.hub}\")\n```\n\nPrint: `Hub path: $HUB_PATH`\n\n### Hub already exists?\n\nCheck if `$HUB_PATH\u002F.ai\u002Fconfig.yaml` exists.\n\n- **yes** — a hub config already exists → go to \"Confirm reinit\"\n- **no** → proceed to \"Discover repos\"\n\n### Confirm reinit\n\nPrint:\n```\nHub already exists at $HUB_PATH\nReinitializing will overwrite config.yaml and CLAUDE.md (state\u002F and existing specs are preserved).\nContinue? [y\u002FN]\n```\n\nWait for user input.\n\n- **yes, reinit** → proceed to \"Discover repos\"\n- **no** → go to \"STOP: User cancelled\"\n\n### STOP: User cancelled\n\nPrint: `Hub init cancelled. Existing hub at $HUB_PATH is unchanged.` STOP.\n\n### Discover repos\n\nScan sibling directories (parent of `$HUB_PATH`) for repos that contain `.ai\u002Fconfig.yaml` with a `scm:` key.\n\n**Strategy 1 — filesystem scan:**\n```bash\nPARENT=$(dirname \"$HUB_PATH\")\nfor dir in \"$PARENT\"\u002F*\u002F; do\n  cfg=\"$dir\u002F.ai\u002Fconfig.yaml\"\n  if [ -f \"$cfg\" ] && grep -q '^scm:' \"$cfg\"; then\n    echo \"$dir\"\n  fi\ndone\n```\n\nFor each candidate, read `.ai\u002Fconfig.yaml` and extract:\n- `name` — the directory name (basename)\n- `scm.project` — ADO project name (may be absent)\n- `scm.base-branch` — default branch (may be absent, fallback `main`)\n\n**Strategy 2 — fallback (no siblings found):**\nIf no siblings are discovered, ask the user:\n```\nNo repos with dx config found in \u003Cparent>.\nEnter repo paths manually (absolute or relative to hub, comma-separated), or press Enter to abort:\n```\nParse the paths and load their configs the same way.\n\nExclude the hub directory itself from the list.\n\n### Present repos\n\nDisplay discovered repos as a numbered checklist:\n```\nDiscovered repos with dx config:\n\n  [1] repo-alpha        (branch: develop, project: MyProject)\n  [2] repo-beta         (branch: main, project: MyProject)\n  [3] repo-gamma        (branch: main, project: OtherProject)\n\nSelect repos to include in hub (e.g. 1,2 or all):\n```\n\n### User selects repos\n\nWait for user input.\n\n- **confirmed** — user entered at least one selection → resolve the list and proceed to \"Build config\"\n- **none selected** — user entered nothing, pressed Enter, or typed `0` → go to \"STOP: User cancelled\"\n\nAccept `all` to include every discovered repo.\n\n### Build config\n\nMerge selected repos into a hub `config.yaml`:\n\n```yaml\nhub:\n  enabled: true\n  terminal-delay: 5\n  state-ttl: 7d\n\nrepos:\n  - name: \u003Cdir-name>\n    path: ..\u002F\u003Cdir-name>\n    base-branch: \u003Cscm.base-branch from repo config, default: main>\n    capabilities: [\u003Cfe|be — infer from repo name or ask user>]\n    ado-project: \u003Cscm.project from repo config, omit if absent>\n```\n\nThe `capabilities` field is used by `\u002Fdx-hub-dispatch` to auto-detect which repos a ticket needs. Common values: `fe` (frontend), `be` (backend). If unsure, ask the user during repo selection. A repo can have multiple capabilities: `[fe, be]`.\n\nOne entry per selected repo. Paths are relative to the hub directory. No hardcoded org URLs, project names, or credentials.\n\n### Create hub structure\n\nCreate the hub directory layout:\n```bash\nmkdir -p \"$HUB_PATH\u002F.ai\u002Fspecs\"\nmkdir -p \"$HUB_PATH\u002F.ai\u002Frules\"\nmkdir -p \"$HUB_PATH\u002F.claude\u002Frules\"\nmkdir -p \"$HUB_PATH\u002Fstate\"\n```\n\nWrite `$HUB_PATH\u002F.ai\u002Fconfig.yaml` with the content built in \"Build config\".\n\nWrite `$HUB_PATH\u002F.gitignore`:\n```\nstate\u002F\n.ai\u002Fspecs\u002F\n```\n\n**Install hub rules:**\n\nCopy rule templates from the dx-hub plugin's `templates\u002Frules\u002F` directory to `$HUB_PATH\u002F.claude\u002Frules\u002F`:\n\n```bash\nfor tpl in ${CLAUDE_PLUGIN_DIR}\u002Ftemplates\u002Frules\u002F*.md.template; do\n  dest=\"$HUB_PATH\u002F.claude\u002Frules\u002F$(basename \"$tpl\" .template)\"\n  if [ ! -f \"$dest\" ]; then\n    cp \"$tpl\" \"$dest\"\n  fi\ndone\n```\n\nStrip the `.template` suffix. Do not overwrite existing files (user may have customized them).\n\nReport: \"Installed hub rules: \u003Clist of rule filenames>\"\n\n### Configure Claude Code settings\n\nThe hub directory needs Claude Code settings so that plugins and MCP servers are available when the user opens the hub in Claude Code. Read these from the first selected sibling repo — its `.claude\u002Fsettings.json` was created by `\u002Fdx-init`.\n\n**Step 1 — Read sibling settings:**\n\nPick the first selected repo. Read `\u003Crepo-path>\u002F.claude\u002Fsettings.json`. Extract:\n- `extraKnownMarketplaces` — the marketplace source(s)\n- `enabledPlugins` — which plugins are enabled\n- `enabledMcpjsonServers` — which MCP servers are enabled (if present)\n\nIf the first repo has no `.claude\u002Fsettings.json`, try the next selected repo. If none have it, warn:\n```\nWARNING: No sibling repo has .claude\u002Fsettings.json — plugins won't be available in the hub.\nRun \u002Fdx-init in at least one repo first, then re-run \u002Fdx-hub-init.\n```\nSkip this step (do not create settings files) and continue to \"Generate CLAUDE.md\".\n\n**Step 2 — Write `.claude\u002Fsettings.json`:**\n\nCheck if `$HUB_PATH\u002F.claude\u002Fsettings.json` already exists.\n- **If it exists on reinit:** Read it and merge — add missing keys but do not overwrite existing values (user may have customized permissions, env, etc.).\n- **If it does not exist:** Create it.\n\nWrite\u002Fmerge the following structure:\n\n```json\n{\n  \"plansDirectory\": \".ai\u002Fspecs\",\n  \"attribution\": {\n    \"commit\": \"\",\n    \"pr\": \"\"\n  },\n  \"enabledMcpjsonServers\": \u003Ccopied from sibling, or [\"ado\"] as minimum>,\n  \"enabledPlugins\": \u003Ccopied from sibling>,\n  \"extraKnownMarketplaces\": \u003Ccopied from sibling>\n}\n```\n\nDo NOT copy `permissions` from the sibling — the hub is an orchestrator directory, not a code repo. Let the user build up permissions naturally through Claude Code prompts.\n\n**Step 3 — Write `.claude\u002Fsettings.local.json`:**\n\nCheck if `$HUB_PATH\u002F.claude\u002Fsettings.local.json` already exists.\n- **If it exists:** Do not overwrite. Report \"Local secrets file validated\".\n- **If it does not exist:** Check if the sibling repo has `.claude\u002Fsettings.local.json`. If yes, copy its `env` block (secrets like `AEM_INSTANCES`, API keys). If no, create a minimal placeholder:\n\n```json\n{\n  \"env\": {}\n}\n```\n\nReport: \"Created `.claude\u002Fsettings.local.json` — add credentials if needed for hub dispatch.\"\n\n**Step 4 — Create `.mcp.json`:**\n\nThe hub needs project-level MCP servers so the user can read tickets, check PRs, and query docs directly from the hub directory. Read the sibling repo's `.mcp.json` and copy relevant servers.\n\n1. Pick the first selected repo. Read `\u003Crepo-path>\u002F.mcp.json`.\n2. **If it exists:** Copy the full `mcpServers` object. The hub is an orchestration directory — it benefits from having all the same MCP servers (ADO for tickets\u002FPRs, context7 for docs, Atlassian if configured).\n3. **If no sibling has `.mcp.json`:** Warn and skip:\n   ```\n   WARNING: No sibling repo has .mcp.json — MCP tools (ADO, etc.) won't be available in the hub.\n   Run \u002Fdx-init in at least one repo first, then re-run \u002Fdx-hub-init.\n   ```\n\n**If `$HUB_PATH\u002F.mcp.json` already exists on reinit:** Read it and merge — add missing server entries but do not overwrite existing ones (user may have customized args, added servers).\n\n**Step 5 — Add vscode-automator MCP server:**\n\nThe hub's dispatch mechanism uses the `vscode-automator` MCP server to open VS Code terminals. Add it to the merged MCP config:\n\n```json\n{\n  \"vscode-automator\": {\n    \"command\": \"node\",\n    \"args\": [\"\u003Cpath-to-dx-aem-flow>\u002Ftools\u002Fvscode-automator\u002Fserver.mjs\"],\n    \"type\": \"stdio\"\n  }\n}\n```\n\nResolve `\u003Cpath-to-dx-aem-flow>` from the plugin's installed location. If the plugin is installed via marketplace, the path is relative to the marketplace cache. If you cannot resolve the absolute path, use a relative path from the hub directory to the `tools\u002Fvscode-automator\u002Fserver.mjs` file.\n\nWrite `$HUB_PATH\u002F.mcp.json`:\n```json\n{\n  \"mcpServers\": \u003Cmerged mcpServers from sibling + vscode-automator>\n}\n```\n\nReport: \"Created `.mcp.json` — MCP servers: \u003Clist of server names> + vscode-automator\"\n\n### Generate CLAUDE.md\n\nWrite `$HUB_PATH\u002FCLAUDE.md`:\n\n```markdown\n# Hub — Multi-Repo Orchestrator\n\nThis is a hub directory — it contains no code. It orchestrates work\nacross multiple repos via dx-core hub mode.\n\n## Repos\n\n\u003C!-- populated by dx-hub-init, do not edit manually -->\n\u003Clist of repo names and paths from config>\n\n## Commands\n\nNo build commands. This directory dispatches to repos.\n\n## MCP Servers\n\nADO MCP is configured — use `mcp__ado__wit_work_item` (`action: \"get\"`, or\n`action: \"get_batch\"` for several IDs) to read tickets directly.\n\n## Specs & Progress\n\nCheck sibling repos for dx workflow output:\n- Specs live in `\u003Crepo-path>\u002F.ai\u002Fspecs\u002F\u003Cticket-id>-\u003Cslug>\u002F`\n- See `.claude\u002Frules\u002Fhub-orchestration.md` for the full spec directory convention\n\n## Rules\n\n- Never edit code files from this directory\n- Use \u002Fdx-hub-status to check in-flight work\n- Dispatch happens via hub-enabled dx-core skills\n- Config lives in `.ai\u002Fconfig.yaml` — edit it to add\u002Fremove repos\n- See `.claude\u002Frules\u002F` for detailed hub behavior rules\n```\n\nReplace the `\u003Clist of repo names and paths from config>` placeholder with the actual repo list formatted as:\n```\n- **repo-alpha** → `..\u002Frepo-alpha` (branch: develop)\n- **repo-beta** → `..\u002Frepo-beta` (branch: main)\n```\n\n### Offer workspace file\n\nAsk:\n```\nCreate a VS Code workspace file at $HUB_PATH\u002Fhub.code-workspace?\nThis lets you open all repos side-by-side in VS Code. [y\u002FN]\n```\n\n- **yes** → proceed to \"Create .code-workspace\"\n- **no** → proceed to \"Summary\"\n\n### Create .code-workspace\n\nWrite `$HUB_PATH\u002Fhub.code-workspace`:\n\n```json\n{\n  \"folders\": [\n    { \"name\": \"hub\", \"path\": \".\" },\n    { \"name\": \"\u003Crepo-name>\", \"path\": \"..\u002F\u003Crepo-name>\" }\n  ],\n  \"settings\": {}\n}\n```\n\nOne folder entry per selected repo, plus the hub itself as the first entry. Use the repo directory name as the `name` field.\n\n### Summary\n\nPrint:\n\n```markdown\n## Hub Initialized\n\n**Location:** $HUB_PATH\n**Repos:** \u003CN> repos configured\n**Terminal delay:** 5s (configurable via hub.terminal-delay)\n**Workspace file:** \u003Ccreated at hub.code-workspace | not created>\n\n### Files created:\n- `.ai\u002Fconfig.yaml` — hub config with repo registry\n- `.claude\u002Fsettings.json` — marketplace, plugins, MCP servers (from sibling repo)\n- `.claude\u002Fsettings.local.json` — local env vars \u002F secrets placeholder\n- `.claude\u002Frules\u002F` — hub convention rules\n- `.mcp.json` — MCP servers (ADO, context7, etc. from sibling repo)\n- `CLAUDE.md` — hub instructions for Claude\n- `state\u002F` — runtime dispatch state (gitignored)\n- `.gitignore` — ignores state and specs\n\n### Plugins:\n- **Marketplace:** \u003Cmarketplace name from sibling>\n- **Enabled:** \u003Clist of enabled plugins>\n- **MCP servers:** \u003Clist of enabled MCP servers>\n\n### Next steps:\n- Open $HUB_PATH in Claude Code to use hub mode\n- Run `\u002Fdx-hub-status` to verify connectivity\n- Run `\u002Fdx-hub-dispatch` with a ticket ID to start coordinated work\n```\n\n## Examples\n\n### Initialize hub with default path\n```\n\u002Fdx-hub-init\n```\nScans `..` for sibling repos with dx config, prompts for selection, creates `..\u002F.hub\u002F` with merged config, CLAUDE.md, and state directory.\n\n### Initialize hub at a custom path\n```\n\u002Fdx-hub-init \u002Fworkspace\u002Fmy-hub\n```\nSame as above but creates the hub at the specified absolute path.\n\n### Reinitialize an existing hub\n```\n\u002Fdx-hub-init\n```\nIf `..\u002F.hub\u002F.ai\u002Fconfig.yaml` already exists, prompts for confirmation before overwriting config and CLAUDE.md. State and existing specs are preserved.\n\n## Troubleshooting\n\n### \"CLI incompatible\" error\n**Cause:** `claude --version` failed or `--output-format` flag is not available in the installed CLI version.\n**Fix:** Update Claude Code CLI to the latest version. Hub dispatch relies on `claude -p --output-format json` for machine-readable subagent output.\n\n### No repos discovered\n**Cause:** Sibling directories either have no `.ai\u002Fconfig.yaml`, or their config does not contain a `scm:` key.\n**Fix:** Run `\u002Fdx-init` in each repo first to generate the config. Then re-run `\u002Fdx-hub-init`. Alternatively, enter paths manually when prompted.\n\n### Hub already exists — want to add a repo\n**Cause:** Re-running init overwrites the full repo list.\n**Fix:** Edit `.ai\u002Fconfig.yaml` directly to append a new entry under `repos:`. Follow the existing format (name, path, base-branch, ado-project).\n\n### No plugins available in hub\n**Cause:** No sibling repo had `.claude\u002Fsettings.json` when hub-init ran, so marketplace and plugin settings were not copied.\n**Fix:** Run `\u002Fdx-init` in at least one sibling repo first, then re-run `\u002Fdx-hub-init`. The init reads `extraKnownMarketplaces` and `enabledPlugins` from the first sibling's `.claude\u002Fsettings.json`.\n\n### Workspace file not opening all repos\n**Cause:** Relative paths in `hub.code-workspace` are resolved from the hub directory. If repos moved, paths break.\n**Fix:** Edit `hub.code-workspace` to update the `path` values, or re-run `\u002Fdx-hub-init` to regenerate it.\n\n## Rules\n\n- **No hardcoded values** — all org names, project names, branch names, and URLs come from `.ai\u002Fconfig.yaml` in each repo\n- **Relative paths in config** — repo paths in `hub\u002Fconfig.yaml` are always relative to the hub directory (e.g., `..\u002Frepo-name`)\n- **Preserve state on reinit** — `state\u002F` and `.ai\u002Fspecs\u002F` are never deleted during reinit\n- **CLI check is mandatory** — never skip the CLI compatibility check; hub dispatch will silently fail without it\n","You set up a `.hub\u002F` directory that orchestrates work across multiple repos via dx-core hub mode.\n\n## Flow\n\n```dot\ndigraph hub_init {\n    \"Validate CLI\" [shape=box];\n    \"CLI compatible?\" [shape=diamond];\n    \"STOP: CLI incompatible\" [shape=doublecircle];\n    \"Determine hub path\" [shape=box];\n    \"Hub already exists?\" [shape=diamond];\n    \"Confirm reinit\" [shape=diamond];\n    \"STOP: User cancelled\" [shape=doublecircle];\n    \"Discover repos\" [shape=box];\n    \"Present repos\" [shape=box];\n    \"User selects repos\" [shape=diamond];\n    \"Build config\" [shape=box];\n    \"Create hub structure\" [shape=box];\n    \"Configure Claude Code settings\" [shape=box];\n    \"Generate CLAUDE.md\" [shape=box];\n    \"Offer workspace file\" [shape=diamond];\n    \"Create .code-workspace\" [shape=box];\n    \"Summary\" [shape=doublecircle];\n\n    \"Validate CLI\" -> \"CLI compatible?\";\n    \"CLI compatible?\" -> \"Determine hub path\" [label=\"yes\"];\n    \"CLI compatible?\" -> \"STOP: CLI incompatible\" [label=\"no\"];\n    \"Determine hub path\" -> \"Hub already exists?\";\n    \"Hub already exists?\" -> \"Confirm reinit\" [label=\"yes\"];\n    \"Hub already exists?\" -> \"Discover repos\" [label=\"no\"];\n    \"Confirm reinit\" -> \"Discover repos\" [label=\"yes, reinit\"];\n    \"Confirm reinit\" -> \"STOP: User cancelled\" [label=\"no\"];\n    \"Discover repos\" -> \"Present repos\";\n    \"Present repos\" -> \"User selects repos\";\n    \"User selects repos\" -> \"Build config\" [label=\"confirmed\"];\n    \"User selects repos\" -> \"STOP: User cancelled\" [label=\"none selected\"];\n    \"Build config\" -> \"Create hub structure\";\n    \"Create hub structure\" -> \"Configure Claude Code settings\";\n    \"Configure Claude Code settings\" -> \"Generate CLAUDE.md\";\n    \"Generate CLAUDE.md\" -> \"Offer workspace file\";\n    \"Offer workspace file\" -> \"Create .code-workspace\" [label=\"yes\"];\n    \"Offer workspace file\" -> \"Summary\" [label=\"no\"];\n    \"Create .code-workspace\" -> \"Summary\";\n}\n```\n\n## Node Details\n\n### Validate CLI\n\nRun:\n```bash\nclaude --version\nclaude -p --help 2>&1 | grep -q 'output-format'\n```\n\nBoth must succeed. If `claude --version` fails, the CLI is not installed. If `output-format` is absent, the CLI version is too old to support hub dispatch (requires `--output-format` flag for machine-readable output).\n\nFail with clear message:\n```\nERROR: Hub mode requires Claude Code CLI with --output-format support.\n  - Install: https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fclaude-code\n  - Minimum version: one that supports `claude -p --output-format`\n```\n\n### CLI compatible?\n\n- **yes** — both checks passed → proceed to \"Determine hub path\"\n- **no** — either check failed → go to \"STOP: CLI incompatible\"\n\n### STOP: CLI incompatible\n\nPrint the error message from \"Validate CLI\". STOP.\n\n### Determine hub path\n\nIf the user provided an argument, use it as the hub path. Otherwise default to `..\u002F.hub` relative to the current working directory.\n\nResolve to an absolute path for all subsequent operations:\n```bash\nHUB_PATH=$(realpath \"${ARGUMENT:-..\u002F.hub}\")\n```\n\nPrint: `Hub path: $HUB_PATH`\n\n### Hub already exists?\n\nCheck if `$HUB_PATH\u002F.ai\u002Fconfig.yaml` exists.\n\n- **yes** — a hub config already exists → go to \"Confirm reinit\"\n- **no** → proceed to \"Discover repos\"\n\n### Confirm reinit\n\nPrint:\n```\nHub already exists at $HUB_PATH\nReinitializing will overwrite config.yaml and CLAUDE.md (state\u002F and existing specs are preserved).\nContinue? [y\u002FN]\n```\n\nWait for user input.\n\n- **yes, reinit** → proceed to \"Discover repos\"\n- **no** → go to \"STOP: User cancelled\"\n\n### STOP: User cancelled\n\nPrint: `Hub init cancelled. Existing hub at $HUB_PATH is unchanged.` STOP.\n\n### Discover repos\n\nScan sibling directories (parent of `$HUB_PATH`) for repos that contain `.ai\u002Fconfig.yaml` with a `scm:` key.\n\n**Strategy 1 — filesystem scan:**\n```bash\nPARENT=$(dirname \"$HUB_PATH\")\nfor dir in \"$PARENT\"\u002F*\u002F; do\n  cfg=\"$dir\u002F.ai\u002Fconfig.yaml\"\n  if [ -f \"$cfg\" ] && grep -q '^scm:' \"$cfg\"; then\n    echo \"$dir\"\n  fi\ndone\n```\n\nFor each candidate, read `.ai\u002Fconfig.yaml` and extract:\n- `name` — the directory name (basename)\n- `scm.project` — ADO project name (may be absent)\n- `scm.base-branch` — default branch (may be absent, fallback `main`)\n\n**Strategy 2 — fallback (no siblings found):**\nIf no siblings are discovered, ask the user:\n```\nNo repos with dx config found in \u003Cparent>.\nEnter repo paths manually (absolute or relative to hub, comma-separated), or press Enter to abort:\n```\nParse the paths and load their configs the same way.\n\nExclude the hub directory itself from the list.\n\n### Present repos\n\nDisplay discovered repos as a numbered checklist:\n```\nDiscovered repos with dx config:\n\n  [1] repo-alpha        (branch: develop, project: MyProject)\n  [2] repo-beta         (branch: main, project: MyProject)\n  [3] repo-gamma        (branch: main, project: OtherProject)\n\nSelect repos to include in hub (e.g. 1,2 or all):\n```\n\n### User selects repos\n\nWait for user input.\n\n- **confirmed** — user entered at least one selection → resolve the list and proceed to \"Build config\"\n- **none selected** — user entered nothing, pressed Enter, or typed `0` → go to \"STOP: User cancelled\"\n\nAccept `all` to include every discovered repo.\n\n### Build config\n\nMerge selected repos into a hub `config.yaml`:\n\n```yaml\nhub:\n  enabled: true\n  terminal-delay: 5\n  state-ttl: 7d\n\nrepos:\n  - name: \u003Cdir-name>\n    path: ..\u002F\u003Cdir-name>\n    base-branch: \u003Cscm.base-branch from repo config, default: main>\n    capabilities: [\u003Cfe|be — infer from repo name or ask user>]\n    ado-project: \u003Cscm.project from repo config, omit if absent>\n```\n\nThe `capabilities` field is used by `\u002Fdx-hub-dispatch` to auto-detect which repos a ticket needs. Common values: `fe` (frontend), `be` (backend). If unsure, ask the user during repo selection. A repo can have multiple capabilities: `[fe, be]`.\n\nOne entry per selected repo. Paths are relative to the hub directory. No hardcoded org URLs, project names, or credentials.\n\n### Create hub structure\n\nCreate the hub directory layout:\n```bash\nmkdir -p \"$HUB_PATH\u002F.ai\u002Fspecs\"\nmkdir -p \"$HUB_PATH\u002F.ai\u002Frules\"\nmkdir -p \"$HUB_PATH\u002F.claude\u002Frules\"\nmkdir -p \"$HUB_PATH\u002Fstate\"\n```\n\nWrite `$HUB_PATH\u002F.ai\u002Fconfig.yaml` with the content built in \"Build config\".\n\nWrite `$HUB_PATH\u002F.gitignore`:\n```\nstate\u002F\n.ai\u002Fspecs\u002F\n```\n\n**Install hub rules:**\n\nCopy rule templates from the dx-hub plugin's `templates\u002Frules\u002F` directory to `$HUB_PATH\u002F.claude\u002Frules\u002F`:\n\n```bash\nfor tpl in ${CLAUDE_PLUGIN_DIR}\u002Ftemplates\u002Frules\u002F*.md.template; do\n  dest=\"$HUB_PATH\u002F.claude\u002Frules\u002F$(basename \"$tpl\" .template)\"\n  if [ ! -f \"$dest\" ]; then\n    cp \"$tpl\" \"$dest\"\n  fi\ndone\n```\n\nStrip the `.template` suffix. Do not overwrite existing files (user may have customized them).\n\nReport: \"Installed hub rules: \u003Clist of rule filenames>\"\n\n### Configure Claude Code settings\n\nThe hub directory needs Claude Code settings so that plugins and MCP servers are available when the user opens the hub in Claude Code. Read these from the first selected sibling repo — its `.claude\u002Fsettings.json` was created by `\u002Fdx-init`.\n\n**Step 1 — Read sibling settings:**\n\nPick the first selected repo. Read `\u003Crepo-path>\u002F.claude\u002Fsettings.json`. Extract:\n- `extraKnownMarketplaces` — the marketplace source(s)\n- `enabledPlugins` — which plugins are enabled\n- `enabledMcpjsonServers` — which MCP servers are enabled (if present)\n\nIf the first repo has no `.claude\u002Fsettings.json`, try the next selected repo. If none have it, warn:\n```\nWARNING: No sibling repo has .claude\u002Fsettings.json — plugins won't be available in the hub.\nRun \u002Fdx-init in at least one repo first, then re-run \u002Fdx-hub-init.\n```\nSkip this step (do not create settings files) and continue to \"Generate CLAUDE.md\".\n\n**Step 2 — Write `.claude\u002Fsettings.json`:**\n\nCheck if `$HUB_PATH\u002F.claude\u002Fsettings.json` already exists.\n- **If it exists on reinit:** Read it and merge — add missing keys but do not overwrite existing values (user may have customized permissions, env, etc.).\n- **If it does not exist:** Create it.\n\nWrite\u002Fmerge the following structure:\n\n```json\n{\n  \"plansDirectory\": \".ai\u002Fspecs\",\n  \"attribution\": {\n    \"commit\": \"\",\n    \"pr\": \"\"\n  },\n  \"enabledMcpjsonServers\": \u003Ccopied from sibling, or [\"ado\"] as minimum>,\n  \"enabledPlugins\": \u003Ccopied from sibling>,\n  \"extraKnownMarketplaces\": \u003Ccopied from sibling>\n}\n```\n\nDo NOT copy `permissions` from the sibling — the hub is an orchestrator directory, not a code repo. Let the user build up permissions naturally through Claude Code prompts.\n\n**Step 3 — Write `.claude\u002Fsettings.local.json`:**\n\nCheck if `$HUB_PATH\u002F.claude\u002Fsettings.local.json` already exists.\n- **If it exists:** Do not overwrite. Report \"Local secrets file validated\".\n- **If it does not exist:** Check if the sibling repo has `.claude\u002Fsettings.local.json`. If yes, copy its `env` block (secrets like `AEM_INSTANCES`, API keys). If no, create a minimal placeholder:\n\n```json\n{\n  \"env\": {}\n}\n```\n\nReport: \"Created `.claude\u002Fsettings.local.json` — add credentials if needed for hub dispatch.\"\n\n**Step 4 — Create `.mcp.json`:**\n\nThe hub needs project-level MCP servers so the user can read tickets, check PRs, and query docs directly from the hub directory. Read the sibling repo's `.mcp.json` and copy relevant servers.\n\n1. Pick the first selected repo. Read `\u003Crepo-path>\u002F.mcp.json`.\n2. **If it exists:** Copy the full `mcpServers` object. The hub is an orchestration directory — it benefits from having all the same MCP servers (ADO for tickets\u002FPRs, context7 for docs, Atlassian if configured).\n3. **If no sibling has `.mcp.json`:** Warn and skip:\n   ```\n   WARNING: No sibling repo has .mcp.json — MCP tools (ADO, etc.) won't be available in the hub.\n   Run \u002Fdx-init in at least one repo first, then re-run \u002Fdx-hub-init.\n   ```\n\n**If `$HUB_PATH\u002F.mcp.json` already exists on reinit:** Read it and merge — add missing server entries but do not overwrite existing ones (user may have customized args, added servers).\n\n**Step 5 — Add vscode-automator MCP server:**\n\nThe hub's dispatch mechanism uses the `vscode-automator` MCP server to open VS Code terminals. Add it to the merged MCP config:\n\n```json\n{\n  \"vscode-automator\": {\n    \"command\": \"node\",\n    \"args\": [\"\u003Cpath-to-dx-aem-flow>\u002Ftools\u002Fvscode-automator\u002Fserver.mjs\"],\n    \"type\": \"stdio\"\n  }\n}\n```\n\nResolve `\u003Cpath-to-dx-aem-flow>` from the plugin's installed location. If the plugin is installed via marketplace, the path is relative to the marketplace cache. If you cannot resolve the absolute path, use a relative path from the hub directory to the `tools\u002Fvscode-automator\u002Fserver.mjs` file.\n\nWrite `$HUB_PATH\u002F.mcp.json`:\n```json\n{\n  \"mcpServers\": \u003Cmerged mcpServers from sibling + vscode-automator>\n}\n```\n\nReport: \"Created `.mcp.json` — MCP servers: \u003Clist of server names> + vscode-automator\"\n\n### Generate CLAUDE.md\n\nWrite `$HUB_PATH\u002FCLAUDE.md`:\n\n```markdown\n# Hub — Multi-Repo Orchestrator\n\nThis is a hub directory — it contains no code. It orchestrates work\nacross multiple repos via dx-core hub mode.\n\n## Repos\n\n\u003C!-- populated by dx-hub-init, do not edit manually -->\n\u003Clist of repo names and paths from config>\n\n## Commands\n\nNo build commands. This directory dispatches to repos.\n\n## MCP Servers\n\nADO MCP is configured — use `mcp__ado__wit_work_item` (`action: \"get\"`, or\n`action: \"get_batch\"` for several IDs) to read tickets directly.\n\n## Specs & Progress\n\nCheck sibling repos for dx workflow output:\n- Specs live in `\u003Crepo-path>\u002F.ai\u002Fspecs\u002F\u003Cticket-id>-\u003Cslug>\u002F`\n- See `.claude\u002Frules\u002Fhub-orchestration.md` for the full spec directory convention\n\n## Rules\n\n- Never edit code files from this directory\n- Use \u002Fdx-hub-status to check in-flight work\n- Dispatch happens via hub-enabled dx-core skills\n- Config lives in `.ai\u002Fconfig.yaml` — edit it to add\u002Fremove repos\n- See `.claude\u002Frules\u002F` for detailed hub behavior rules\n```\n\nReplace the `\u003Clist of repo names and paths from config>` placeholder with the actual repo list formatted as:\n```\n- **repo-alpha** → `..\u002Frepo-alpha` (branch: develop)\n- **repo-beta** → `..\u002Frepo-beta` (branch: main)\n```\n\n### Offer workspace file\n\nAsk:\n```\nCreate a VS Code workspace file at $HUB_PATH\u002Fhub.code-workspace?\nThis lets you open all repos side-by-side in VS Code. [y\u002FN]\n```\n\n- **yes** → proceed to \"Create .code-workspace\"\n- **no** → proceed to \"Summary\"\n\n### Create .code-workspace\n\nWrite `$HUB_PATH\u002Fhub.code-workspace`:\n\n```json\n{\n  \"folders\": [\n    { \"name\": \"hub\", \"path\": \".\" },\n    { \"name\": \"\u003Crepo-name>\", \"path\": \"..\u002F\u003Crepo-name>\" }\n  ],\n  \"settings\": {}\n}\n```\n\nOne folder entry per selected repo, plus the hub itself as the first entry. Use the repo directory name as the `name` field.\n\n### Summary\n\nPrint:\n\n```markdown\n## Hub Initialized\n\n**Location:** $HUB_PATH\n**Repos:** \u003CN> repos configured\n**Terminal delay:** 5s (configurable via hub.terminal-delay)\n**Workspace file:** \u003Ccreated at hub.code-workspace | not created>\n\n### Files created:\n- `.ai\u002Fconfig.yaml` — hub config with repo registry\n- `.claude\u002Fsettings.json` — marketplace, plugins, MCP servers (from sibling repo)\n- `.claude\u002Fsettings.local.json` — local env vars \u002F secrets placeholder\n- `.claude\u002Frules\u002F` — hub convention rules\n- `.mcp.json` — MCP servers (ADO, context7, etc. from sibling repo)\n- `CLAUDE.md` — hub instructions for Claude\n- `state\u002F` — runtime dispatch state (gitignored)\n- `.gitignore` — ignores state and specs\n\n### Plugins:\n- **Marketplace:** \u003Cmarketplace name from sibling>\n- **Enabled:** \u003Clist of enabled plugins>\n- **MCP servers:** \u003Clist of enabled MCP servers>\n\n### Next steps:\n- Open $HUB_PATH in Claude Code to use hub mode\n- Run `\u002Fdx-hub-status` to verify connectivity\n- Run `\u002Fdx-hub-dispatch` with a ticket ID to start coordinated work\n```\n\n## Examples\n\n### Initialize hub with default path\n```\n\u002Fdx-hub-init\n```\nScans `..` for sibling repos with dx config, prompts for selection, creates `..\u002F.hub\u002F` with merged config, CLAUDE.md, and state directory.\n\n### Initialize hub at a custom path\n```\n\u002Fdx-hub-init \u002Fworkspace\u002Fmy-hub\n```\nSame as above but creates the hub at the specified absolute path.\n\n### Reinitialize an existing hub\n```\n\u002Fdx-hub-init\n```\nIf `..\u002F.hub\u002F.ai\u002Fconfig.yaml` already exists, prompts for confirmation before overwriting config and CLAUDE.md. State and existing specs are preserved.\n\n## Troubleshooting\n\n### \"CLI incompatible\" error\n**Cause:** `claude --version` failed or `--output-format` flag is not available in the installed CLI version.\n**Fix:** Update Claude Code CLI to the latest version. Hub dispatch relies on `claude -p --output-format json` for machine-readable subagent output.\n\n### No repos discovered\n**Cause:** Sibling directories either have no `.ai\u002Fconfig.yaml`, or their config does not contain a `scm:` key.\n**Fix:** Run `\u002Fdx-init` in each repo first to generate the config. Then re-run `\u002Fdx-hub-init`. Alternatively, enter paths manually when prompted.\n\n### Hub already exists — want to add a repo\n**Cause:** Re-running init overwrites the full repo list.\n**Fix:** Edit `.ai\u002Fconfig.yaml` directly to append a new entry under `repos:`. Follow the existing format (name, path, base-branch, ado-project).\n\n### No plugins available in hub\n**Cause:** No sibling repo had `.claude\u002Fsettings.json` when hub-init ran, so marketplace and plugin settings were not copied.\n**Fix:** Run `\u002Fdx-init` in at least one sibling repo first, then re-run `\u002Fdx-hub-init`. The init reads `extraKnownMarketplaces` and `enabledPlugins` from the first sibling's `.claude\u002Fsettings.json`.\n\n### Workspace file not opening all repos\n**Cause:** Relative paths in `hub.code-workspace` are resolved from the hub directory. If repos moved, paths break.\n**Fix:** Edit `hub.code-workspace` to update the `path` values, or re-run `\u002Fdx-hub-init` to regenerate it.\n\n## Rules\n\n- **No hardcoded values** — all org names, project names, branch names, and URLs come from `.ai\u002Fconfig.yaml` in each repo\n- **Relative paths in config** — repo paths in `hub\u002Fconfig.yaml` are always relative to the hub directory (e.g., `..\u002Frepo-name`)\n- **Preserve state on reinit** — `state\u002F` and `.ai\u002Fspecs\u002F` are never deleted during reinit\n- **CLI check is mandatory** — never skip the CLI compatibility check; hub dispatch will silently fail without it\n",{"name":5,"description":7,"when_to_use":44,"allowed-tools":45,"argument-hint":51,"disable-model-invocation":52},"Use when setting up a hub directory for multi-repo orchestration for the first time. Trigger on 'init hub', 'set up hub', 'multi-repo setup', 'initialize hub', or 'configure multi-repo orchestration'.",[46,47,48,49,50,35],"Read","Edit","Glob","Grep","Write","[path to hub directory (default: ..\u002F.hub)]",true,"main","a99cabc3f459fbeaa42b13a1604db1bccb6a364b","plugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-init",3,"https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow","https:\u002F\u002Fgithub.com\u002Feasingthemes","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fdraganfilipovic\u002F","Agentic SDLC platform in production. I build agent-ready codebases. AEM MCP Server author.","2026-11-11 09:59:48",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":52},[64,67,70],{"tool":65,"command":66},"npx","npx skills add easingthemes\u002Fdx-aem-flow --skill dx-hub-init",{"tool":68,"command":69},"bunx","bunx skills add easingthemes\u002Fdx-aem-flow --skill dx-hub-init",{"tool":71,"command":72},"pnpm","pnpm dlx skills add easingthemes\u002Fdx-aem-flow --skill dx-hub-init","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-init\u002FSKILL.md",[],[76,97,121,137,152,175],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":39},"01M6H48W19F46A7B7TSSQAMYRW","dx-hub-status","Show hub dispatch status — which repos are running, done, blocked or failed. Use for 'hub status', 'what's running'.","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-status\u002FSKILL.md",[],[21,83,22,84,85,86,87,88,89,90,91,92,35,93,94,32,31,95,96],"dx hub status","status","hub status","which","show","for","ticket","clean","use","done","id","dispatch","repos","grep",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":108,"publishedAt":39},"01M6H48K267CWEF8YNN3Y49BVT","dx-hub-dispatch","Dispatch a ticket to several repos — open an independent Claude session per repo in VS Code terminals. Use for 'hub dispatch', 'work on ticket across repos'.","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-dispatch\u002FSKILL.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[21,109,94,22,110,88,111,112,113,89,114,115,91,116,35,117,118,119,93,120],"dx hub dispatch","ado","repo","work on","session","open","MCP","URL","vscode","code","across","work",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":39},"01M6H48FAWKTT6AAWT3H80ZKE0","dx-hub-config","View and edit hub configuration — add repos, adjust terminal delay. Use to manage hub settings. Trigger on \"hub config\", \"add repo to hub\", \"terminal delay\".","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-config\u002FSKILL.md",[],[21,128,22,129,87,130,111,131,132,133,134,91,34,35,135,32,136,31,24,95],"dx hub config","config","view","manage","trigger","true","adjust","terminal","settings",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":39},"01M6H48BNMYEJY6CCWPYHNQDAT","dx-discover-repos","Resolve which repos a work item touches (explicit directive → simple block → cross-repo table → LLM). Used by the KAI-HUB router to fan an agent out across repos; 'which repos'.","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-discover-repos\u002FSKILL.md",[],[144,21,145,95,86,111,119,146,93,147,120,148,22,149,150,151],"discover","dx discover repos","router","directive","simple","block","sonnet","table",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":159,"publishedAt":39},"01M6H487QA1FDSBT1HTZGW4HAQ","dx-upgrade","Upgrade a consumer project to the installed plugin versions — run dx-doctor, fix stale and missing files, list manual actions. Use after upgrading plugins.","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-core\u002Fskills\u002Fdx-upgrade\u002FSKILL.md",[158],{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},[160,21,161,162,163,164,165,166,167,168,32,31,24,169,170,171,172,91,173,174],"upgrade","dx upgrade","project","actions","search","fix","files","auto","run","list","doctor","manual","missing","plugin","plugins",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":181,"publishedAt":39},"01M6H483MFY4W4TPMWJJPG9JZW","dx-ticket-analyze","Research an ADO\u002FJira ticket and list the source files and assets it involves. Use for 'analyze ticket', 'what files does this touch?', 'find files for this story'.","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-core\u002Fskills\u002Fdx-ticket-analyze\u002FSKILL.md",[],[89,182,21,183,164,166,116,120,184,32,31,185,24,186,169,187,188,189,110,88],"analyze","dx ticket analyze","haiku","jira","issue","source","atlassian","jira ticket"]