[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H48K267CWEF8YNN3Y49BVT":3,"skill-same:01M6H48K267CWEF8YNN3Y49BVT":82},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":6,"ownerHtmlUrl":64,"ownerBlogUrl":65,"ownerDescription":66,"updatedAt":67,"install":68,"resources":81},"01M6H48K267CWEF8YNN3Y49BVT","dx-hub-dispatch",null,"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'.","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-dispatch\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"dispatch","dx hub dispatch","dx","hub","Bash","work on","work","repo","session","use","MCP","open","code","across","id","ticket","ado","URL","for","vscode","2026-11-10 10:12:30",false,"---\nname: dx-hub-dispatch\ndescription: \"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'.\"\nargument-hint: \"\u003CADO Work Item ID, Jira key, or URL> [repo-a repo-b ...] [--skill \u002Fdx-agent-all]\"\nallowed-tools: [\"Read\", \"Edit\", \"Glob\", \"Grep\", \"Write\", \"Bash\", \"mcp__vscode-automator__*\", \"mcp__ado__*\", \"mcp__atlassian__*\"]\n---\n\nYou dispatch a ticket to one or more repos by opening independent Claude Code sessions in VS Code terminals. The hub does NOT plan or implement — it fetches the ticket, determines which repos are involved, and launches real Claude sessions in each repo with a delegation prompt.\n\n## Pre-flight\n\nRead `.ai\u002Fconfig.yaml`. If `hub.enabled` is not `true`, STOP:\n\n> Hub mode is not enabled. Run `\u002Fdx-hub-init` first.\n\nRead:\n- `hub.terminal-delay` — seconds to wait for Claude to start in terminal (default: `5`)\n- `repos[]` — list of repos with `name`, `path`, `capabilities`\n\nRead `shared\u002Fprovider-config.md` for provider detection and tool mapping.\n\nRead `.ai\u002Fconfig.yaml`:\n- `tracker.provider` (or `scm.provider` for backward compat) — `ado` (default) or `jira`\n\n**If provider = ado:**\n- `scm.org`, `scm.project`\n\n**If provider = jira:**\n- `jira.url`, `jira.project-key`\n\n## Flow\n\n```dot\ndigraph hub_dispatch {\n    \"Parse arguments\" [shape=box];\n    \"Fetch ticket\" [shape=box];\n    \"Determine repos\" [shape=box];\n    \"Repos resolved?\" [shape=diamond];\n    \"STOP: no repos\" [shape=doublecircle];\n    \"Confirm dispatch\" [shape=diamond];\n    \"STOP: cancelled\" [shape=doublecircle];\n    \"Create state dir\" [shape=box];\n    \"Save raw ticket\" [shape=box];\n    \"Write context.md\" [shape=box];\n    \"Pre-seed repos\" [shape=box];\n    \"Launch terminals\" [shape=box];\n    \"Write status.json\" [shape=box];\n    \"Summary\" [shape=doublecircle];\n\n    \"Parse arguments\" -> \"Fetch ticket\";\n    \"Fetch ticket\" -> \"Determine repos\";\n    \"Determine repos\" -> \"Repos resolved?\";\n    \"Repos resolved?\" -> \"Confirm dispatch\" [label=\"yes\"];\n    \"Repos resolved?\" -> \"STOP: no repos\" [label=\"no\"];\n    \"Confirm dispatch\" -> \"Create state dir\" [label=\"yes\"];\n    \"Confirm dispatch\" -> \"STOP: cancelled\" [label=\"no\"];\n    \"Create state dir\" -> \"Save raw ticket\";\n    \"Save raw ticket\" -> \"Write context.md\";\n    \"Write context.md\" -> \"Pre-seed repos\";\n    \"Pre-seed repos\" -> \"Launch terminals\";\n    \"Launch terminals\" -> \"Write status.json\";\n    \"Write status.json\" -> \"Summary\";\n}\n```\n\n## Node Details\n\n### Parse arguments\n\nParse `$ARGUMENTS`:\n\n1. **Ticket ID** (required) — first positional arg. Numeric ADO ID, Jira key (`PROJ-123`), or full URL. Extract ID from URLs.\n2. **Repo names** (optional) — additional positional args matching `repos[].name` from config. If provided, skip auto-detection and use these.\n3. **`--skill`** (optional) — skill to run in each repo. Default: `\u002Fdx-agent-all`.\n\nExamples:\n```\n\u002Fdx-hub-dispatch 2471234\n\u002Fdx-hub-dispatch 2471234 repo-fe repo-be\n\u002Fdx-hub-dispatch 2471234 --skill \u002Fdx-req\n\u002Fdx-hub-dispatch PROJ-123 repo-fe --skill \u002Fdx-agent-all\n```\n\n### Fetch ticket\n\nFetch the work item using the configured provider.\n\n**ADO:**\n```\nmcp__ado__wit_work_item\n  action: \"get\"\n  project: \"\u003Cscm.project>\"\n  id: \u003Cwork item ID>\n  expand: \"Relations\"\n```\n\n**Jira:**\n```\nmcp__atlassian__jira_get_issue\n  issue_key: \"\u003Cissue key>\"\n```\n\nExtract and hold in memory:\n- **ID** — work item ID or Jira key\n- **Title** — work item title\n- **Type** — User Story, Bug, Task, etc.\n- **Description** — full description text\n- **Acceptance Criteria** — if present\n- **State** — current state\n- **Relations** — linked items\n\nAlso fetch comments:\n\n**ADO:**\n```\nmcp__ado__wit_work_item\n  action: \"list_comments\"\n  project: \"\u003Cscm.project>\"\n  workItemId: \u003Cid>\n```\n\n### Determine repos\n\nIf repo names were provided as arguments, use those directly — look them up in `repos[]` by name.\n\nIf no repos specified, determine from ticket content:\n\n1. **Check ticket title and description** for explicit repo\u002Flayer mentions:\n   - Keywords like \"frontend\", \"FE\", \"UI\", \"React\", \"Angular\" → match repos with `capabilities: [fe]`\n   - Keywords like \"backend\", \"BE\", \"API\", \"service\", \"endpoint\" → match repos with `capabilities: [be]`\n   - Keywords like \"full stack\", \"both\", \"end-to-end\" → match both `fe` and `be` repos\n   - Keywords matching a repo name directly → match that repo\n\n2. **Check linked work items** — if the ticket has child tasks with repo-specific titles, use those as hints.\n\n3. **If still ambiguous** — ask the user which repos to dispatch to, showing the full repo list from config.\n\n### Repos resolved?\n\n- **yes** — at least one repo matched → proceed to \"Confirm dispatch\"\n- **no** — no repos could be determined → go to \"STOP: no repos\"\n\n### STOP: no repos\n\nPrint:\n```\nCould not determine which repos are involved in ticket \u003Cid>.\n\nAvailable repos:\n  - \u003Cname> (capabilities: \u003Ccaps>) — \u003Cpath>\n  ...\n\nRe-run with explicit repos: \u002Fdx-hub-dispatch \u003Cid> \u003Crepo-name> [\u003Crepo-name> ...]\n```\nSTOP.\n\n### Confirm dispatch\n\nPrint the dispatch plan:\n```\nHub Dispatch Plan\n─────────────────────────────\nTicket:  \u003Cid> — \u003Ctitle>\nType:    \u003Ctype>\nSkill:   \u003Cskill>\nRepos:   \u003Crepo-a> (\u003Ccaps>), \u003Crepo-b> (\u003Ccaps>)\n\nThis will open \u003CN> VS Code terminals, each running an independent Claude session.\nProceed? [Y\u002Fn]\n```\n\n- **yes** (or Enter) → proceed\n- **no** → go to \"STOP: cancelled\"\n\n### STOP: cancelled\n\nPrint: `Dispatch cancelled.` STOP.\n\n### Create state dir\n\n```bash\nHUB_ROOT=\"$(pwd)\"\nSTATE_DIR=\"state\u002F\u003Cticket-id>\"\nmkdir -p \"$STATE_DIR\"\n```\n\n### Save raw ticket\n\nDetermine the correct filename based on ticket type:\n- **Bug** type → `raw-bug.md`\n- **All other types** (User Story, Task, etc.) → `raw-story.md`\n\nWrite the raw ticket content to `$STATE_DIR\u002F\u003Cfilename>` using the same faithful-dump format as `dx-req` (for stories) or `dx-bug-triage` (for bugs). Do NOT editorialize — this is a faithful copy of the ADO\u002FJira content.\n\nFor detailed format, follow the same structure as `dx-req` step 10 or `dx-bug-triage` step 9.\n\n### Write context.md\n\nWrite `$STATE_DIR\u002Fcontext.md`:\n\n```markdown\n# Cross-Repo Context\n\n**Ticket:** \u003Cid> — \u003Ctitle>\n**Type:** \u003Ctype>\n**Dispatched:** \u003CISO timestamp>\n\n## Involved Repos\n\n| Repo | Role | Path |\n|------|------|------|\n| \u003Crepo-a> | \u003Ccapabilities as role: fe→Frontend, be→Backend> | \u003Cabsolute path> |\n| \u003Crepo-b> | \u003Crole> | \u003Cabsolute path> |\n\n## Coordination Notes\n\n- Each repo runs its own requirements analysis and implementation planning.\n- This ticket involves multiple repos — coordinate shared interfaces (API contracts, shared types, event schemas) carefully.\n- If you need to know what another repo is doing, check its spec directory: `\u003Cother-repo-path>\u002F.ai\u002Fspecs\u002F\u003Cticket-slug>\u002F`\n\n## What Each Repo Handles\n\n\u003CFor each repo, write 1-2 sentences about what that repo's focus should be based on the ticket content and the repo's capabilities. Keep it brief — the repo's own dx-req will do the deep analysis.>\n```\n\n### Pre-seed repos\n\nFor each target repo:\n\n1. Generate the spec directory name using the same slugify logic:\n   ```bash\n   DIR_NAME=$(\u003Cid>-\u003Cslugified-title>)\n   REPO_SPEC_DIR=\"\u003Crepo-abs-path>\u002F.ai\u002Fspecs\u002F${DIR_NAME}\"\n   ```\n\n2. Create the directory:\n   ```bash\n   mkdir -p \"$REPO_SPEC_DIR\"\n   ```\n\n3. Copy the raw ticket file:\n   ```bash\n   cp \"$STATE_DIR\u002F\u003Craw-story.md|raw-bug.md>\" \"$REPO_SPEC_DIR\u002F\"\n   ```\n\nThis pre-seeds each repo so `dx-req` \u002F `dx-bug-triage` will find `raw-story.md` \u002F `raw-bug.md` already present and skip the ADO\u002FJira fetch.\n\n### Launch terminals\n\nFor each target repo, open a VS Code terminal and start a Claude session:\n\n**Step 1 — Open new terminal:**\n```\nmcp__vscode-automator__vscode_new_terminal\n```\n\nWait 1 second for terminal to initialize.\n\n**Step 2 — cd into the repo:**\n```\nmcp__vscode-automator__vscode_type\n  text: \"cd \u003Crepo-absolute-path>\"\n```\n```\nmcp__vscode-automator__vscode_keystroke\n  key: \"return\"\n```\n\nWait 1 second.\n\n**Step 3 — Start Claude:**\n```\nmcp__vscode-automator__vscode_type\n  text: \"claude\"\n```\n```\nmcp__vscode-automator__vscode_keystroke\n  key: \"return\"\n```\n\nWait `hub.terminal-delay` seconds (default: 5) for Claude to start.\n\n**Step 4 — Type the delegation prompt:**\n\nBuild the prompt (no line breaks — single continuous text):\n\n```\nTicket \u003Cid> raw content is pre-seeded at .ai\u002Fspecs\u002F\u003Cdir-name>\u002F\u003Craw-file>. Cross-repo context at \u003Chub-abs-path>\u002Fstate\u002F\u003Cticket-id>\u002Fcontext.md — read it before starting. You handle the \u003Crepo-name> portion (\u003Crole>). Also involved: \u003Cother-repos-and-roles>. When done or blocked, update status in \u003Chub-abs-path>\u002Fstate\u002F\u003Cticket-id>\u002Fstatus.json — set repos.\u003Crepo-name> to done, blocked, or failed. Now run: \u003Cskill> \u003Cticket-id>\n```\n\n```\nmcp__vscode-automator__vscode_type\n  text: \"\u003Cdelegation prompt>\"\n```\n```\nmcp__vscode-automator__vscode_keystroke\n  key: \"return\"\n```\n\nWait 2 seconds before opening the next terminal (to avoid focus conflicts).\n\n### Write status.json\n\nWrite `$STATE_DIR\u002Fstatus.json`:\n\n```json\n{\n  \"ticket\": \"\u003Cticket-id>\",\n  \"title\": \"\u003Ctitle>\",\n  \"type\": \"\u003Ctype>\",\n  \"skill\": \"\u003Cskill>\",\n  \"started\": \"\u003CISO timestamp>\",\n  \"repos\": {\n    \"\u003Crepo-a>\": \"running\",\n    \"\u003Crepo-b>\": \"running\"\n  }\n}\n```\n\n### Summary\n\nPrint:\n\n```\nHub Dispatch Started\n────────────────────────────────\nTicket:    \u003Cid> — \u003Ctitle>\nSkill:     \u003Cskill>\nTerminals: \u003CN> sessions launched\n\n  \u003Crepo-a> (\u003Crole>) — running\n  \u003Crepo-b> (\u003Crole>) — running\n\nState: state\u002F\u003Cticket-id>\u002F\n\nNext:\n  \u002Fdx-hub-status \u003Cticket-id>    — check progress\n  Switch to terminal tabs to monitor each session directly\n```\n\n## Examples\n\n### Dispatch a story to auto-detected repos\n```\n\u002Fdx-hub-dispatch 2471234\n```\nFetches ticket, detects FE\u002FBE scope from content, opens 2 terminals.\n\n### Dispatch to specific repos\n```\n\u002Fdx-hub-dispatch 2471234 repo-fe repo-be\n```\nSkips auto-detection, dispatches to named repos.\n\n### Dispatch with a different skill\n```\n\u002Fdx-hub-dispatch 2471234 --skill \u002Fdx-req\n```\nOnly runs requirements phase, not full pipeline.\n\n### Dispatch a Jira ticket\n```\n\u002Fdx-hub-dispatch PROJ-123 repo-fe\n```\n\n## Troubleshooting\n\n### VS Code terminals not opening\n**Cause:** vscode-automator MCP server not running or macOS Accessibility permission not granted.\n**Fix:** Check that vscode-automator is registered in `.mcp.json` and that your terminal app has Accessibility permission in System Preferences → Privacy & Security → Accessibility.\n\n### Claude not starting in terminal\n**Cause:** `hub.terminal-delay` too short — Claude CLI takes time to initialize.\n**Fix:** Increase `hub.terminal-delay` in `.ai\u002Fconfig.yaml` (try `8` or `10`).\n\n### Wrong repo detected\n**Cause:** Ticket content didn't contain clear FE\u002FBE keywords.\n**Fix:** Re-run with explicit repo names: `\u002Fdx-hub-dispatch \u003Cid> \u003Crepo-name>`.\n\n### Raw ticket not found in repo\n**Cause:** Pre-seed step failed (directory permissions or path mismatch).\n**Fix:** Check that repo paths in config are correct. The raw file should be at `\u003Crepo>\u002F.ai\u002Fspecs\u002F\u003Cid>-\u003Cslug>\u002Fraw-story.md`.\n\n## Rules\n\n- **Hub never plans or implements** — it only fetches, routes, and launches\n- **No hardcoded values** — all org names, project names, paths from config\n- **Pre-seed raw files** — copy to each repo so skills skip redundant ADO fetches\n- **One terminal per repo** — each gets its own independent Claude session\n- **vscode-automator is macOS only** — this skill requires macOS with Accessibility permission\n","You dispatch a ticket to one or more repos by opening independent Claude Code sessions in VS Code terminals. The hub does NOT plan or implement — it fetches the ticket, determines which repos are involved, and launches real Claude sessions in each repo with a delegation prompt.\n\n## Pre-flight\n\nRead `.ai\u002Fconfig.yaml`. If `hub.enabled` is not `true`, STOP:\n\n> Hub mode is not enabled. Run `\u002Fdx-hub-init` first.\n\nRead:\n- `hub.terminal-delay` — seconds to wait for Claude to start in terminal (default: `5`)\n- `repos[]` — list of repos with `name`, `path`, `capabilities`\n\nRead `shared\u002Fprovider-config.md` for provider detection and tool mapping.\n\nRead `.ai\u002Fconfig.yaml`:\n- `tracker.provider` (or `scm.provider` for backward compat) — `ado` (default) or `jira`\n\n**If provider = ado:**\n- `scm.org`, `scm.project`\n\n**If provider = jira:**\n- `jira.url`, `jira.project-key`\n\n## Flow\n\n```dot\ndigraph hub_dispatch {\n    \"Parse arguments\" [shape=box];\n    \"Fetch ticket\" [shape=box];\n    \"Determine repos\" [shape=box];\n    \"Repos resolved?\" [shape=diamond];\n    \"STOP: no repos\" [shape=doublecircle];\n    \"Confirm dispatch\" [shape=diamond];\n    \"STOP: cancelled\" [shape=doublecircle];\n    \"Create state dir\" [shape=box];\n    \"Save raw ticket\" [shape=box];\n    \"Write context.md\" [shape=box];\n    \"Pre-seed repos\" [shape=box];\n    \"Launch terminals\" [shape=box];\n    \"Write status.json\" [shape=box];\n    \"Summary\" [shape=doublecircle];\n\n    \"Parse arguments\" -> \"Fetch ticket\";\n    \"Fetch ticket\" -> \"Determine repos\";\n    \"Determine repos\" -> \"Repos resolved?\";\n    \"Repos resolved?\" -> \"Confirm dispatch\" [label=\"yes\"];\n    \"Repos resolved?\" -> \"STOP: no repos\" [label=\"no\"];\n    \"Confirm dispatch\" -> \"Create state dir\" [label=\"yes\"];\n    \"Confirm dispatch\" -> \"STOP: cancelled\" [label=\"no\"];\n    \"Create state dir\" -> \"Save raw ticket\";\n    \"Save raw ticket\" -> \"Write context.md\";\n    \"Write context.md\" -> \"Pre-seed repos\";\n    \"Pre-seed repos\" -> \"Launch terminals\";\n    \"Launch terminals\" -> \"Write status.json\";\n    \"Write status.json\" -> \"Summary\";\n}\n```\n\n## Node Details\n\n### Parse arguments\n\nParse `$ARGUMENTS`:\n\n1. **Ticket ID** (required) — first positional arg. Numeric ADO ID, Jira key (`PROJ-123`), or full URL. Extract ID from URLs.\n2. **Repo names** (optional) — additional positional args matching `repos[].name` from config. If provided, skip auto-detection and use these.\n3. **`--skill`** (optional) — skill to run in each repo. Default: `\u002Fdx-agent-all`.\n\nExamples:\n```\n\u002Fdx-hub-dispatch 2471234\n\u002Fdx-hub-dispatch 2471234 repo-fe repo-be\n\u002Fdx-hub-dispatch 2471234 --skill \u002Fdx-req\n\u002Fdx-hub-dispatch PROJ-123 repo-fe --skill \u002Fdx-agent-all\n```\n\n### Fetch ticket\n\nFetch the work item using the configured provider.\n\n**ADO:**\n```\nmcp__ado__wit_work_item\n  action: \"get\"\n  project: \"\u003Cscm.project>\"\n  id: \u003Cwork item ID>\n  expand: \"Relations\"\n```\n\n**Jira:**\n```\nmcp__atlassian__jira_get_issue\n  issue_key: \"\u003Cissue key>\"\n```\n\nExtract and hold in memory:\n- **ID** — work item ID or Jira key\n- **Title** — work item title\n- **Type** — User Story, Bug, Task, etc.\n- **Description** — full description text\n- **Acceptance Criteria** — if present\n- **State** — current state\n- **Relations** — linked items\n\nAlso fetch comments:\n\n**ADO:**\n```\nmcp__ado__wit_work_item\n  action: \"list_comments\"\n  project: \"\u003Cscm.project>\"\n  workItemId: \u003Cid>\n```\n\n### Determine repos\n\nIf repo names were provided as arguments, use those directly — look them up in `repos[]` by name.\n\nIf no repos specified, determine from ticket content:\n\n1. **Check ticket title and description** for explicit repo\u002Flayer mentions:\n   - Keywords like \"frontend\", \"FE\", \"UI\", \"React\", \"Angular\" → match repos with `capabilities: [fe]`\n   - Keywords like \"backend\", \"BE\", \"API\", \"service\", \"endpoint\" → match repos with `capabilities: [be]`\n   - Keywords like \"full stack\", \"both\", \"end-to-end\" → match both `fe` and `be` repos\n   - Keywords matching a repo name directly → match that repo\n\n2. **Check linked work items** — if the ticket has child tasks with repo-specific titles, use those as hints.\n\n3. **If still ambiguous** — ask the user which repos to dispatch to, showing the full repo list from config.\n\n### Repos resolved?\n\n- **yes** — at least one repo matched → proceed to \"Confirm dispatch\"\n- **no** — no repos could be determined → go to \"STOP: no repos\"\n\n### STOP: no repos\n\nPrint:\n```\nCould not determine which repos are involved in ticket \u003Cid>.\n\nAvailable repos:\n  - \u003Cname> (capabilities: \u003Ccaps>) — \u003Cpath>\n  ...\n\nRe-run with explicit repos: \u002Fdx-hub-dispatch \u003Cid> \u003Crepo-name> [\u003Crepo-name> ...]\n```\nSTOP.\n\n### Confirm dispatch\n\nPrint the dispatch plan:\n```\nHub Dispatch Plan\n─────────────────────────────\nTicket:  \u003Cid> — \u003Ctitle>\nType:    \u003Ctype>\nSkill:   \u003Cskill>\nRepos:   \u003Crepo-a> (\u003Ccaps>), \u003Crepo-b> (\u003Ccaps>)\n\nThis will open \u003CN> VS Code terminals, each running an independent Claude session.\nProceed? [Y\u002Fn]\n```\n\n- **yes** (or Enter) → proceed\n- **no** → go to \"STOP: cancelled\"\n\n### STOP: cancelled\n\nPrint: `Dispatch cancelled.` STOP.\n\n### Create state dir\n\n```bash\nHUB_ROOT=\"$(pwd)\"\nSTATE_DIR=\"state\u002F\u003Cticket-id>\"\nmkdir -p \"$STATE_DIR\"\n```\n\n### Save raw ticket\n\nDetermine the correct filename based on ticket type:\n- **Bug** type → `raw-bug.md`\n- **All other types** (User Story, Task, etc.) → `raw-story.md`\n\nWrite the raw ticket content to `$STATE_DIR\u002F\u003Cfilename>` using the same faithful-dump format as `dx-req` (for stories) or `dx-bug-triage` (for bugs). Do NOT editorialize — this is a faithful copy of the ADO\u002FJira content.\n\nFor detailed format, follow the same structure as `dx-req` step 10 or `dx-bug-triage` step 9.\n\n### Write context.md\n\nWrite `$STATE_DIR\u002Fcontext.md`:\n\n```markdown\n# Cross-Repo Context\n\n**Ticket:** \u003Cid> — \u003Ctitle>\n**Type:** \u003Ctype>\n**Dispatched:** \u003CISO timestamp>\n\n## Involved Repos\n\n| Repo | Role | Path |\n|------|------|------|\n| \u003Crepo-a> | \u003Ccapabilities as role: fe→Frontend, be→Backend> | \u003Cabsolute path> |\n| \u003Crepo-b> | \u003Crole> | \u003Cabsolute path> |\n\n## Coordination Notes\n\n- Each repo runs its own requirements analysis and implementation planning.\n- This ticket involves multiple repos — coordinate shared interfaces (API contracts, shared types, event schemas) carefully.\n- If you need to know what another repo is doing, check its spec directory: `\u003Cother-repo-path>\u002F.ai\u002Fspecs\u002F\u003Cticket-slug>\u002F`\n\n## What Each Repo Handles\n\n\u003CFor each repo, write 1-2 sentences about what that repo's focus should be based on the ticket content and the repo's capabilities. Keep it brief — the repo's own dx-req will do the deep analysis.>\n```\n\n### Pre-seed repos\n\nFor each target repo:\n\n1. Generate the spec directory name using the same slugify logic:\n   ```bash\n   DIR_NAME=$(\u003Cid>-\u003Cslugified-title>)\n   REPO_SPEC_DIR=\"\u003Crepo-abs-path>\u002F.ai\u002Fspecs\u002F${DIR_NAME}\"\n   ```\n\n2. Create the directory:\n   ```bash\n   mkdir -p \"$REPO_SPEC_DIR\"\n   ```\n\n3. Copy the raw ticket file:\n   ```bash\n   cp \"$STATE_DIR\u002F\u003Craw-story.md|raw-bug.md>\" \"$REPO_SPEC_DIR\u002F\"\n   ```\n\nThis pre-seeds each repo so `dx-req` \u002F `dx-bug-triage` will find `raw-story.md` \u002F `raw-bug.md` already present and skip the ADO\u002FJira fetch.\n\n### Launch terminals\n\nFor each target repo, open a VS Code terminal and start a Claude session:\n\n**Step 1 — Open new terminal:**\n```\nmcp__vscode-automator__vscode_new_terminal\n```\n\nWait 1 second for terminal to initialize.\n\n**Step 2 — cd into the repo:**\n```\nmcp__vscode-automator__vscode_type\n  text: \"cd \u003Crepo-absolute-path>\"\n```\n```\nmcp__vscode-automator__vscode_keystroke\n  key: \"return\"\n```\n\nWait 1 second.\n\n**Step 3 — Start Claude:**\n```\nmcp__vscode-automator__vscode_type\n  text: \"claude\"\n```\n```\nmcp__vscode-automator__vscode_keystroke\n  key: \"return\"\n```\n\nWait `hub.terminal-delay` seconds (default: 5) for Claude to start.\n\n**Step 4 — Type the delegation prompt:**\n\nBuild the prompt (no line breaks — single continuous text):\n\n```\nTicket \u003Cid> raw content is pre-seeded at .ai\u002Fspecs\u002F\u003Cdir-name>\u002F\u003Craw-file>. Cross-repo context at \u003Chub-abs-path>\u002Fstate\u002F\u003Cticket-id>\u002Fcontext.md — read it before starting. You handle the \u003Crepo-name> portion (\u003Crole>). Also involved: \u003Cother-repos-and-roles>. When done or blocked, update status in \u003Chub-abs-path>\u002Fstate\u002F\u003Cticket-id>\u002Fstatus.json — set repos.\u003Crepo-name> to done, blocked, or failed. Now run: \u003Cskill> \u003Cticket-id>\n```\n\n```\nmcp__vscode-automator__vscode_type\n  text: \"\u003Cdelegation prompt>\"\n```\n```\nmcp__vscode-automator__vscode_keystroke\n  key: \"return\"\n```\n\nWait 2 seconds before opening the next terminal (to avoid focus conflicts).\n\n### Write status.json\n\nWrite `$STATE_DIR\u002Fstatus.json`:\n\n```json\n{\n  \"ticket\": \"\u003Cticket-id>\",\n  \"title\": \"\u003Ctitle>\",\n  \"type\": \"\u003Ctype>\",\n  \"skill\": \"\u003Cskill>\",\n  \"started\": \"\u003CISO timestamp>\",\n  \"repos\": {\n    \"\u003Crepo-a>\": \"running\",\n    \"\u003Crepo-b>\": \"running\"\n  }\n}\n```\n\n### Summary\n\nPrint:\n\n```\nHub Dispatch Started\n────────────────────────────────\nTicket:    \u003Cid> — \u003Ctitle>\nSkill:     \u003Cskill>\nTerminals: \u003CN> sessions launched\n\n  \u003Crepo-a> (\u003Crole>) — running\n  \u003Crepo-b> (\u003Crole>) — running\n\nState: state\u002F\u003Cticket-id>\u002F\n\nNext:\n  \u002Fdx-hub-status \u003Cticket-id>    — check progress\n  Switch to terminal tabs to monitor each session directly\n```\n\n## Examples\n\n### Dispatch a story to auto-detected repos\n```\n\u002Fdx-hub-dispatch 2471234\n```\nFetches ticket, detects FE\u002FBE scope from content, opens 2 terminals.\n\n### Dispatch to specific repos\n```\n\u002Fdx-hub-dispatch 2471234 repo-fe repo-be\n```\nSkips auto-detection, dispatches to named repos.\n\n### Dispatch with a different skill\n```\n\u002Fdx-hub-dispatch 2471234 --skill \u002Fdx-req\n```\nOnly runs requirements phase, not full pipeline.\n\n### Dispatch a Jira ticket\n```\n\u002Fdx-hub-dispatch PROJ-123 repo-fe\n```\n\n## Troubleshooting\n\n### VS Code terminals not opening\n**Cause:** vscode-automator MCP server not running or macOS Accessibility permission not granted.\n**Fix:** Check that vscode-automator is registered in `.mcp.json` and that your terminal app has Accessibility permission in System Preferences → Privacy & Security → Accessibility.\n\n### Claude not starting in terminal\n**Cause:** `hub.terminal-delay` too short — Claude CLI takes time to initialize.\n**Fix:** Increase `hub.terminal-delay` in `.ai\u002Fconfig.yaml` (try `8` or `10`).\n\n### Wrong repo detected\n**Cause:** Ticket content didn't contain clear FE\u002FBE keywords.\n**Fix:** Re-run with explicit repo names: `\u002Fdx-hub-dispatch \u003Cid> \u003Crepo-name>`.\n\n### Raw ticket not found in repo\n**Cause:** Pre-seed step failed (directory permissions or path mismatch).\n**Fix:** Check that repo paths in config are correct. The raw file should be at `\u003Crepo>\u002F.ai\u002Fspecs\u002F\u003Cid>-\u003Cslug>\u002Fraw-story.md`.\n\n## Rules\n\n- **Hub never plans or implements** — it only fetches, routes, and launches\n- **No hardcoded values** — all org names, project names, paths from config\n- **Pre-seed raw files** — copy to each repo so skills skip redundant ADO fetches\n- **One terminal per repo** — each gets its own independent Claude session\n- **vscode-automator is macOS only** — this skill requires macOS with Accessibility permission\n",{"name":5,"description":7,"allowed-tools":49,"argument-hint":58},[50,51,52,53,54,28,55,56,57],"Read","Edit","Glob","Grep","Write","mcp__vscode-automator__*","mcp__ado__*","mcp__atlassian__*","\u003CADO Work Item ID, Jira key, or URL> [repo-a repo-b ...] [--skill \u002Fdx-agent-all]","main","a99cabc3f459fbeaa42b13a1604db1bccb6a364b","plugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-dispatch",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":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add easingthemes\u002Fdx-aem-flow --skill dx-hub-dispatch",{"tool":74,"command":75},"bunx","bunx skills add easingthemes\u002Fdx-aem-flow --skill dx-hub-dispatch",{"tool":77,"command":78},"pnpm","pnpm dlx skills add easingthemes\u002Fdx-aem-flow --skill dx-hub-dispatch","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-dispatch\u002FSKILL.md",true,[],[83,101,123,139,154,177],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":44},"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",[],[26,90,27,91,92,93,94,42,39,95,33,96,28,38,24,97,98,99,100],"dx hub status","status","hub status","which","show","clean","done","read","write","repos","grep",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":44},"01M6H48R6ZH7YMVPMVWMMWT3RA","dx-hub-init","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\".","https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-hub\u002Fskills\u002Fdx-hub-init\u002FSKILL.md",[],[108,109,26,110,27,111,112,113,114,115,116,117,118,119,28,120,121,97,98,122],"init","hub init","dx hub init","SET","time","mode","default","up","repo setup","orchestration","configure","multi-repo","cli","directory","edit",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":44},"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",[],[26,130,27,131,94,132,31,133,134,135,136,33,118,28,137,97,138,98,122,99],"dx hub config","config","view","manage","trigger","true","adjust","terminal","settings",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":44},"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",[],[146,26,147,99,93,31,37,148,38,149,30,150,27,151,152,153],"discover","dx discover repos","router","directive","simple","block","sonnet","table",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":161,"publishedAt":44},"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",[160],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[162,26,163,164,165,166,167,168,169,170,97,98,122,171,172,173,174,33,175,176],"upgrade","dx upgrade","project","actions","search","fix","files","auto","run","list","doctor","manual","missing","plugin","plugins",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":44},"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",[],[39,184,26,185,166,168,41,30,186,97,98,187,122,188,171,189,190,191,40,42],"analyze","dx ticket analyze","haiku","jira","issue","source","atlassian","jira ticket"]