[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H4367RKF553KAMNCFCYYWB":3,"skill-same:01M6H4367RKF553KAMNCFCYYWB":83},{"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":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":61,"ownerDescription":62,"updatedAt":63,"install":64,"resources":76},"01M6H4367RKF553KAMNCFCYYWB","dx-eject",null,"Eject all plugin assets into the consumer repo — copies skills, agents, rules, templates, shared files, hooks, and MCP config so the project works without plugins installed. Use when a team wants to own all dx files locally instead of depending on plugins.","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-core\u002Fskills\u002Fdx-eject\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],"dx","dx eject","eject","write","read","plugin","self","team","Rules","use","auto","MCP","files","true","hooks","trigger","search","repo","project","shared","2026-11-10 10:12:30",false,"---\nname: dx-eject\ndescription: Eject all plugin assets into the consumer repo — copies skills, agents, rules, templates, shared files, hooks, and MCP config so the project works without plugins installed. Use when a team wants to own all dx files locally instead of depending on plugins.\nwhen_to_use: \"Use when a team wants to own all dx files locally without depending on plugins. Trigger on 'eject', 'copy plugin files locally', 'make dx self-contained', or 'I want to own the dx files'.\"\nargument-hint: \"[dx|aem|auto|all]\"\ndisable-model-invocation: true\nallowed-tools: [\"read\", \"edit\", \"search\", \"write\", \"agent\"]\n---\n\nYou eject (copy) all plugin assets into the consumer project so it can operate independently without any dx plugins installed. This is a **one-way, irreversible operation** — after ejecting, the project owns all files and plugin updates no longer propagate automatically.\n\n## Tool Usage Rules\n\n- **File existence:** Use `Glob` — never `[ -f ]`, `test -f`, or Bash test commands\n- **File content reads:** Use `Read` — never `cat` or `head` in Bash\n- **File writes:** Use `Write` or `Edit` — never `echo >` in Bash\n- **Bash is ONLY for:** running `eject.sh`, `chmod +x`, `git` commands, and install scripts\n- **Parallel operations:** Call multiple `Read`\u002F`Write`\u002F`Glob` tools in parallel when independent\n\n## 0. Pre-flight Checks\n\n### 0a. Verify dx is initialized\n\nCheck that `.ai\u002Fconfig.yaml` exists (use Glob). If not:\n```\n✗ FATAL: .ai\u002Fconfig.yaml not found. Run \u002Fdx-init first before ejecting.\n```\nSTOP.\n\n### 0b. Resolve Plugin Directories\n\nFind each installed plugin root:\n\n- **dx plugin:** Glob for `**\u002Fskills\u002Fdx-doctor\u002FSKILL.md`, navigate up 3 levels\n- **aem plugin:** Glob for `**\u002Fskills\u002Faem-init\u002FSKILL.md`, navigate up 3 levels\n- **auto plugin:** Glob for `**\u002Fskills\u002Fauto-init\u002FSKILL.md`, navigate up 3 levels\n\nParse the argument to determine scope:\n- `dx` — eject dx-core only\n- `aem` — eject dx-aem only\n- `auto` — eject dx-automation only\n- `all` or no argument — eject all detected plugins\n\nIf a requested plugin is not found, report: `⚠ \u003Cplugin> plugin not detected. Skipping.`\n\n### 0c. Warn the User\n\nPresent this warning and **wait for explicit confirmation**:\n\n```markdown\n## ⚠ Eject Warning\n\nThis will copy ALL assets from the following plugins into your repo:\n- dx-core (49 skills, 7 agents, 5 rules, shared files, data, templates)\n- dx-hub (5 skills, data, templates)\n- dx-aem (12 skills, 6 agents, shared files, templates)\n- dx-automation (10 skills, 1 rule, data files, templates)\n\n### What happens:\n1. **Claude Code skills** → `.claude\u002Fskills\u002F` (shadows plugin skills — Claude Code loads local over plugin)\n2. **Claude Code agents** → `.claude\u002Fagents\u002F` (local agent definitions)\n3. **Copilot agents** → `.github\u002Fagents\u002F`\n4. **Plugin originals** → `.ai\u002Fejected\u002F` (rules, shared, data, templates, hooks, manifests)\n6. **Hooks config** → merged into `.claude\u002Fhooks.json`\n\n### After ejecting:\n- You can uninstall the plugins (`\u002Fplugin uninstall dx-core`, etc.)\n- All skills and agents work from local files\n- You are responsible for maintaining and updating these files\n- `\u002Fdx-upgrade` and `\u002Fdx-doctor` will no longer work (they depend on plugin directories)\n- To get plugin updates, you must manually diff and merge\n\n**This cannot be undone. Proceed?** (yes\u002Fno)\n```\n\nIf the user says no, STOP.\n\n## 1. Run the Eject Script\n\nThe eject script copies all plugin files into the project. Run it from the project root:\n\n```bash\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Feject.sh \u003Cdx-plugin> [\u003Caem-plugin>] [\u003Cauto-plugin>]\n```\n\nPass only the plugin directories that are in scope (based on the user's argument).\n\nThe script creates this structure:\n\n```\n.claude\u002F\n├── skills\u002F           # All plugin skills (Claude Code local overrides)\n│   ├── dx-req\u002FSKILL.md\n│   ├── dx-plan\u002FSKILL.md\n│   ├── aem-component\u002FSKILL.md\n│   ├── auto-deploy\u002FSKILL.md\n│   └── ...\n├── agents\u002F           # All plugin agents (Claude Code local)\n│   ├── dx-pr-reviewer.md\n│   ├── dx-code-reviewer.md\n│   ├── aem-inspector.md\n│   └── ...\n└── hooks\u002F            # Hooks (already installed by dx-init)\n\n.github\u002F\n└── agents\u002F           # Copilot agents\n    ├── DxCodeReview.agent.md\n    └── ...\n\n.ai\u002Fejected\u002F          # Plugin source-of-truth archive\n├── plugin-rules\u002F     # Plugin default rules (read-only reference)\n├── shared\u002F           # Shared reference docs (ado-config.md, git-rules.md, etc.)\n├── data\u002F             # Plugin data originals organized by plugin name\n│   ├── dx-core\u002F  # lib\u002F, templates\u002F, hooks\u002F\n│   ├── dx-aem\u002F             # (if applicable)\n│   └── dx-automation\u002F      # pipelines\u002F, lambda\u002F, scripts\u002F, policy\u002F\n├── templates\u002F        # All plugin templates organized by plugin name\n│   ├── dx-core\u002F  # rules\u002F, skills\u002F, agents\u002F, docs\u002F, instructions\u002F\n│   ├── dx-aem\u002F             # rules\u002F, agents\u002F, instructions\u002F\n│   └── dx-automation\u002F      # rules\u002F\n├── hooks\u002F            # Plugin hooks.json files\n│   └── dx-core\u002Fhooks.json\n└── manifests\u002F        # Plugin version snapshots\n    ├── dx-core.json\n    ├── dx-aem.json\n    └── dx-automation.json\n```\n\n## 2. Merge Hooks Configuration\n\nAfter the script runs, merge plugin hooks into the project's `.claude\u002Fhooks.json`.\n\nRead `.ai\u002Fejected\u002Fhooks\u002Fdx-core\u002Fhooks.json` (if it exists). This contains the Stop hook that runs `stop-guard.sh`.\n\nCheck if `.claude\u002Fhooks.json` already exists:\n- **If it exists:** Read it, check if the Stop hook is already present. If not, merge the hook entry.\n- **If it doesn't exist:** Create it with the hook from the plugin.\n\n**Important:** The hook command references `$CLAUDE_PROJECT_DIR\u002F.claude\u002Fhooks\u002Fstop-guard.sh` — this path is already correct for an ejected project since `stop-guard.sh` was installed by dx-init to `.claude\u002Fhooks\u002F`.\n\n## 3. Merge MCP Configuration\n\nRead the project's existing `.mcp.json`.\n\nFor each ejected plugin that has MCP servers:\n- **dx-core:** Empty mcpServers (ADO MCP configured separately) — no merge needed\n- **dx-aem:** Has `AEM` (HTTP) and `playwright` (stdio) servers\n- **dx-automation:** No .mcp.json\n\nCheck if the AEM MCP entries already exist in `.mcp.json`. If not, merge them. If they already exist (because dx-init\u002Faem-init already configured them), skip.\n\n## 4. Update Shared File References in Skills\n\nSome ejected skills reference files via plugin-relative paths (e.g., `..\u002F..\u002Fshared\u002Fgit-rules.md`, `shared\u002Fado-config.md`). After ejecting, these files live at `.ai\u002Fejected\u002Fshared\u002F`.\n\n**Claude Code handles this automatically** — skills in `.claude\u002Fskills\u002F` are loaded as local overrides, and shared files are resolved relative to the skill's plugin origin. Since the plugin will be uninstalled, we need to update any skill that reads shared files.\n\nScan all ejected skills in `.claude\u002Fskills\u002F*\u002FSKILL.md` for references to paths like (in this order):\n- `..\u002F..\u002Fshared\u002F` → replace with `.ai\u002Fejected\u002Fshared\u002F` (skills reference shared files relative to their own directory, which resolves to the plugin root on Claude Code and Copilot CLI alike; after ejecting, that relation no longer holds)\n- `shared\u002F` → replace with `.ai\u002Fejected\u002Fshared\u002F`\n- `\u003Cplugin-dir>\u002Fshared\u002F` → replace with `.ai\u002Fejected\u002Fshared\u002F`\n\nUse `Read` to check each skill file, and `Edit` to update references if found.\n\nSimilarly, scan ejected agents in `.claude\u002Fagents\u002F*.md` for shared file references and update them.\n\n## 5. Update .gitignore\n\nCheck if `.gitignore` contains `.ai\u002Fejected\u002F`. If not, add it to the \"AI workflow\" section:\n\n```\n# AI workflow (ejected plugin assets)\n.ai\u002Fejected\u002F\n```\n\nWait — `.ai\u002Fejected\u002F` should actually be **committed** since it's the source of truth for the project post-eject. Do NOT add it to .gitignore.\n\nCheck that these paths are NOT in .gitignore (they need to be committed):\n- `.claude\u002Fskills\u002F`\n- `.claude\u002Fagents\u002F`\n- `.github\u002Fagents\u002F`\n- `.ai\u002Fejected\u002F`\n\nIf any are gitignored, report as a manual action: \"Remove `\u003Cpath>` from .gitignore — these ejected files must be committed.\"\n\n## 6. Create Eject Manifest\n\nWrite `.ai\u002Fejected\u002FEJECT.md` with metadata about the ejection:\n\n```markdown\n# Ejected Plugin Assets\n\n**Ejected on:** \u003Ccurrent date>\n**Plugins ejected:**\n\n| Plugin | Version | Skills | Agents |\n|--------|---------|--------|--------|\n| dx-core | 2.19.0 | 45 | 5 |\n| dx-aem | 2.19.0 | 10 | 5 |\n| dx-automation | 2.19.0 | 11 | 0 |\n\n## Post-Eject Notes\n\n- All skills now load from `.claude\u002Fskills\u002F` (Claude Code)\n- All agents now load from `.claude\u002Fagents\u002F` (Claude Code) and `.github\u002Fagents\u002F` (Copilot)\n- Plugin originals are archived in `.ai\u002Fejected\u002F` for reference\n- To update: manually diff against newer plugin versions and merge changes\n- `\u002Fdx-doctor` and `\u002Fdx-upgrade` are no longer functional (they require plugin directories)\n- The ejected `\u002Fdx-doctor` skill can be adapted to check local files instead\n\n## File Ownership\n\n| Directory | Owner | Purpose |\n|-----------|-------|---------|\n| `.claude\u002Fskills\u002F` | Project | Claude Code skills (edit freely) |\n| `.claude\u002Fagents\u002F` | Project | Claude Code agents (edit freely) |\n| `.github\u002Fagents\u002F` | Project | Copilot agents (regenerate from templates if needed) |\n| `.ai\u002Fejected\u002F` | Archive | Plugin originals — reference only, do not edit |\n| `.ai\u002Frules\u002F` | Project | Shared rules (already project-owned) |\n| `.claude\u002Frules\u002F` | Project | Convention rules (already project-owned) |\n| `.ai\u002Flib\u002F` | Project | Utility scripts (already project-owned) |\n| `.ai\u002Ftemplates\u002F` | Project | Output templates (already project-owned) |\n```\n\nRead each ejected plugin manifest from `.ai\u002Fejected\u002Fmanifests\u002F` to get the version numbers.\n\n## 7. Summary Report\n\n```markdown\n## Eject Complete\n\n### Ejected\n| Category | Count | Location |\n|----------|-------|----------|\n| Claude Code skills | 66 | .claude\u002Fskills\u002F |\n| Claude Code agents | 10 | .claude\u002Fagents\u002F |\n| Copilot agents | 24 | .github\u002Fagents\u002F |\n| Plugin rules | 5 | .ai\u002Fejected\u002Fplugin-rules\u002F |\n| Shared files | 8 | .ai\u002Fejected\u002Fshared\u002F |\n| Data files | N | .ai\u002Fejected\u002Fdata\u002F |\n| Templates | N | .ai\u002Fejected\u002Ftemplates\u002F |\n| Manifests | 3 | .ai\u002Fejected\u002Fmanifests\u002F |\n\n### Next Steps\n1. **Verify skills work:** Run `\u002Fdx-help \"test\"` to confirm local skills load\n2. **Uninstall plugins:** `\u002Fplugin uninstall dx-core`, `\u002Fplugin uninstall dx-aem`, `\u002Fplugin uninstall dx-automation`\n3. **Commit ejected files:** `git add .claude\u002Fskills\u002F .claude\u002Fagents\u002F .github\u002F .ai\u002Fejected\u002F && git commit -m \"Eject dx plugins into local repo\"`\n4. **Update CLAUDE.md:** Note that this project uses ejected (local) skills, not plugins\n\n### Manual Actions\n\u003Clist any .gitignore issues, missing MCP config, or path reference updates that couldn't be automated>\n\n### What No Longer Works\n- `\u002Fdx-upgrade` — no plugin directories to pull updates from\n- `\u002Fdx-doctor` — plugin directory checks will fail\n- Plugin auto-updates on `\u002Fplugin install` — files are now local\n\n### What Still Works\n- All `\u002Fdx-*`, `\u002Faem-*`, `\u002Fauto-*` skills — loaded from `.claude\u002Fskills\u002F`\n- All Copilot skills and agents — loaded from `.github\u002F` (Copilot also reads `.claude\u002Fagents\u002F` but ignores Claude-only fields — see Troubleshooting)\n- `.ai\u002Fconfig.yaml`, `.ai\u002Frules\u002F`, `.claude\u002Frules\u002F` — unchanged\n- `.ai\u002Flib\u002F`, `.ai\u002Ftemplates\u002F` — unchanged\n```\n\n## Examples\n\n1. `\u002Fdx-eject all` — Ejects all 3 plugins. Copies 73 skills, 13 agents, templates, and data files. Creates `.ai\u002Fejected\u002F` archive. Reports 3 manifests saved for version tracking.\n\n2. `\u002Fdx-eject dx` — Ejects only dx-core. Copies 50 skills and 7 agents. AEM and automation plugins remain as plugins.\n\n3. `\u002Fdx-eject aem` — Ejects only dx-aem. Copies 12 AEM skills and 6 AEM agents. dx-core stays as a plugin (AEM skills depend on dx skills, which still load from the plugin).\n\n## Troubleshooting\n\n- **\"Skills not loading after eject\"**\n  **Cause:** Plugin is still installed and takes priority, or `.claude\u002Fskills\u002F` is gitignored.\n  **Fix:** Uninstall the plugin first, then verify `.claude\u002Fskills\u002F` is not in `.gitignore`.\n\n- **\"Shared file not found\" errors in skills**\n  **Cause:** Skills reference `shared\u002F` paths that are now at `.ai\u002Fejected\u002Fshared\u002F`.\n  **Fix:** Step 4 should have updated these references. If missed, manually update the skill's file path references.\n\n- **\"dx-doctor fails after eject\"**\n  **Cause:** Expected — dx-doctor looks for plugin directories which no longer exist.\n  **Fix:** Edit `.claude\u002Fskills\u002Fdx-doctor\u002FSKILL.md` to check `.ai\u002Fejected\u002F` instead of plugin directories. Or remove the dx-doctor skill if not needed.\n\n- **\"Copilot CLI warns `unknown fields ignored` for `.claude\u002Fagents\u002F*.md`\"**\n  **Cause:** Copilot CLI also reads `.claude\u002Fagents\u002F` (v1.0.108+). It drops Claude-only fields (`effort`, `memory`, `maxTurns`, `disallowedTools`, `isolation`) and falls back from `model: opus` to the picker model. Dropping `disallowedTools` means the ejected `dx-code-reviewer` is **not read-only on Copilot**. On a name clash `.github\u002Fagents\u002F` wins.\n  **Fix:** Expected — on Copilot use the `.github\u002Fagents\u002F` agents (`DxCodeReview` for reviews). If the team uses only Copilot, `.claude\u002Fagents\u002F` can be deleted.\n\n- **\"Want to go back to plugins\"**\n  **Cause:** Ejecting is one-way, but you can reverse it manually.\n  **Fix:** Delete `.claude\u002Fskills\u002F`, `.claude\u002Fagents\u002F`, `.ai\u002Fejected\u002F`. Reinstall plugins with `\u002Fplugin install`. Run `\u002Fdx-upgrade all`.\n\n## Rules\n\n- **Confirm before ejecting** — always show the warning and wait for explicit yes\n- **Archive everything** — copy plugin originals to `.ai\u002Fejected\u002F` even if already installed elsewhere\n- **Never modify .ai\u002Fconfig.yaml** — eject copies files, it doesn't change configuration\n- **Never modify .ai\u002Frules\u002F or .claude\u002Frules\u002F** — these are already project-owned and installed\n- **Never modify .ai\u002Flib\u002F or .ai\u002Ftemplates\u002F** — these are already installed by dx-init\n- **Track versions** — save plugin manifests so the team knows what version they ejected from\n- **One-way operation** — make this clear to the user; there's no \"un-eject\"\n","You eject (copy) all plugin assets into the consumer project so it can operate independently without any dx plugins installed. This is a **one-way, irreversible operation** — after ejecting, the project owns all files and plugin updates no longer propagate automatically.\n\n## Tool Usage Rules\n\n- **File existence:** Use `Glob` — never `[ -f ]`, `test -f`, or Bash test commands\n- **File content reads:** Use `Read` — never `cat` or `head` in Bash\n- **File writes:** Use `Write` or `Edit` — never `echo >` in Bash\n- **Bash is ONLY for:** running `eject.sh`, `chmod +x`, `git` commands, and install scripts\n- **Parallel operations:** Call multiple `Read`\u002F`Write`\u002F`Glob` tools in parallel when independent\n\n## 0. Pre-flight Checks\n\n### 0a. Verify dx is initialized\n\nCheck that `.ai\u002Fconfig.yaml` exists (use Glob). If not:\n```\n✗ FATAL: .ai\u002Fconfig.yaml not found. Run \u002Fdx-init first before ejecting.\n```\nSTOP.\n\n### 0b. Resolve Plugin Directories\n\nFind each installed plugin root:\n\n- **dx plugin:** Glob for `**\u002Fskills\u002Fdx-doctor\u002FSKILL.md`, navigate up 3 levels\n- **aem plugin:** Glob for `**\u002Fskills\u002Faem-init\u002FSKILL.md`, navigate up 3 levels\n- **auto plugin:** Glob for `**\u002Fskills\u002Fauto-init\u002FSKILL.md`, navigate up 3 levels\n\nParse the argument to determine scope:\n- `dx` — eject dx-core only\n- `aem` — eject dx-aem only\n- `auto` — eject dx-automation only\n- `all` or no argument — eject all detected plugins\n\nIf a requested plugin is not found, report: `⚠ \u003Cplugin> plugin not detected. Skipping.`\n\n### 0c. Warn the User\n\nPresent this warning and **wait for explicit confirmation**:\n\n```markdown\n## ⚠ Eject Warning\n\nThis will copy ALL assets from the following plugins into your repo:\n- dx-core (49 skills, 7 agents, 5 rules, shared files, data, templates)\n- dx-hub (5 skills, data, templates)\n- dx-aem (12 skills, 6 agents, shared files, templates)\n- dx-automation (10 skills, 1 rule, data files, templates)\n\n### What happens:\n1. **Claude Code skills** → `.claude\u002Fskills\u002F` (shadows plugin skills — Claude Code loads local over plugin)\n2. **Claude Code agents** → `.claude\u002Fagents\u002F` (local agent definitions)\n3. **Copilot agents** → `.github\u002Fagents\u002F`\n4. **Plugin originals** → `.ai\u002Fejected\u002F` (rules, shared, data, templates, hooks, manifests)\n6. **Hooks config** → merged into `.claude\u002Fhooks.json`\n\n### After ejecting:\n- You can uninstall the plugins (`\u002Fplugin uninstall dx-core`, etc.)\n- All skills and agents work from local files\n- You are responsible for maintaining and updating these files\n- `\u002Fdx-upgrade` and `\u002Fdx-doctor` will no longer work (they depend on plugin directories)\n- To get plugin updates, you must manually diff and merge\n\n**This cannot be undone. Proceed?** (yes\u002Fno)\n```\n\nIf the user says no, STOP.\n\n## 1. Run the Eject Script\n\nThe eject script copies all plugin files into the project. Run it from the project root:\n\n```bash\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Feject.sh \u003Cdx-plugin> [\u003Caem-plugin>] [\u003Cauto-plugin>]\n```\n\nPass only the plugin directories that are in scope (based on the user's argument).\n\nThe script creates this structure:\n\n```\n.claude\u002F\n├── skills\u002F           # All plugin skills (Claude Code local overrides)\n│   ├── dx-req\u002FSKILL.md\n│   ├── dx-plan\u002FSKILL.md\n│   ├── aem-component\u002FSKILL.md\n│   ├── auto-deploy\u002FSKILL.md\n│   └── ...\n├── agents\u002F           # All plugin agents (Claude Code local)\n│   ├── dx-pr-reviewer.md\n│   ├── dx-code-reviewer.md\n│   ├── aem-inspector.md\n│   └── ...\n└── hooks\u002F            # Hooks (already installed by dx-init)\n\n.github\u002F\n└── agents\u002F           # Copilot agents\n    ├── DxCodeReview.agent.md\n    └── ...\n\n.ai\u002Fejected\u002F          # Plugin source-of-truth archive\n├── plugin-rules\u002F     # Plugin default rules (read-only reference)\n├── shared\u002F           # Shared reference docs (ado-config.md, git-rules.md, etc.)\n├── data\u002F             # Plugin data originals organized by plugin name\n│   ├── dx-core\u002F  # lib\u002F, templates\u002F, hooks\u002F\n│   ├── dx-aem\u002F             # (if applicable)\n│   └── dx-automation\u002F      # pipelines\u002F, lambda\u002F, scripts\u002F, policy\u002F\n├── templates\u002F        # All plugin templates organized by plugin name\n│   ├── dx-core\u002F  # rules\u002F, skills\u002F, agents\u002F, docs\u002F, instructions\u002F\n│   ├── dx-aem\u002F             # rules\u002F, agents\u002F, instructions\u002F\n│   └── dx-automation\u002F      # rules\u002F\n├── hooks\u002F            # Plugin hooks.json files\n│   └── dx-core\u002Fhooks.json\n└── manifests\u002F        # Plugin version snapshots\n    ├── dx-core.json\n    ├── dx-aem.json\n    └── dx-automation.json\n```\n\n## 2. Merge Hooks Configuration\n\nAfter the script runs, merge plugin hooks into the project's `.claude\u002Fhooks.json`.\n\nRead `.ai\u002Fejected\u002Fhooks\u002Fdx-core\u002Fhooks.json` (if it exists). This contains the Stop hook that runs `stop-guard.sh`.\n\nCheck if `.claude\u002Fhooks.json` already exists:\n- **If it exists:** Read it, check if the Stop hook is already present. If not, merge the hook entry.\n- **If it doesn't exist:** Create it with the hook from the plugin.\n\n**Important:** The hook command references `$CLAUDE_PROJECT_DIR\u002F.claude\u002Fhooks\u002Fstop-guard.sh` — this path is already correct for an ejected project since `stop-guard.sh` was installed by dx-init to `.claude\u002Fhooks\u002F`.\n\n## 3. Merge MCP Configuration\n\nRead the project's existing `.mcp.json`.\n\nFor each ejected plugin that has MCP servers:\n- **dx-core:** Empty mcpServers (ADO MCP configured separately) — no merge needed\n- **dx-aem:** Has `AEM` (HTTP) and `playwright` (stdio) servers\n- **dx-automation:** No .mcp.json\n\nCheck if the AEM MCP entries already exist in `.mcp.json`. If not, merge them. If they already exist (because dx-init\u002Faem-init already configured them), skip.\n\n## 4. Update Shared File References in Skills\n\nSome ejected skills reference files via plugin-relative paths (e.g., `..\u002F..\u002Fshared\u002Fgit-rules.md`, `shared\u002Fado-config.md`). After ejecting, these files live at `.ai\u002Fejected\u002Fshared\u002F`.\n\n**Claude Code handles this automatically** — skills in `.claude\u002Fskills\u002F` are loaded as local overrides, and shared files are resolved relative to the skill's plugin origin. Since the plugin will be uninstalled, we need to update any skill that reads shared files.\n\nScan all ejected skills in `.claude\u002Fskills\u002F*\u002FSKILL.md` for references to paths like (in this order):\n- `..\u002F..\u002Fshared\u002F` → replace with `.ai\u002Fejected\u002Fshared\u002F` (skills reference shared files relative to their own directory, which resolves to the plugin root on Claude Code and Copilot CLI alike; after ejecting, that relation no longer holds)\n- `shared\u002F` → replace with `.ai\u002Fejected\u002Fshared\u002F`\n- `\u003Cplugin-dir>\u002Fshared\u002F` → replace with `.ai\u002Fejected\u002Fshared\u002F`\n\nUse `Read` to check each skill file, and `Edit` to update references if found.\n\nSimilarly, scan ejected agents in `.claude\u002Fagents\u002F*.md` for shared file references and update them.\n\n## 5. Update .gitignore\n\nCheck if `.gitignore` contains `.ai\u002Fejected\u002F`. If not, add it to the \"AI workflow\" section:\n\n```\n# AI workflow (ejected plugin assets)\n.ai\u002Fejected\u002F\n```\n\nWait — `.ai\u002Fejected\u002F` should actually be **committed** since it's the source of truth for the project post-eject. Do NOT add it to .gitignore.\n\nCheck that these paths are NOT in .gitignore (they need to be committed):\n- `.claude\u002Fskills\u002F`\n- `.claude\u002Fagents\u002F`\n- `.github\u002Fagents\u002F`\n- `.ai\u002Fejected\u002F`\n\nIf any are gitignored, report as a manual action: \"Remove `\u003Cpath>` from .gitignore — these ejected files must be committed.\"\n\n## 6. Create Eject Manifest\n\nWrite `.ai\u002Fejected\u002FEJECT.md` with metadata about the ejection:\n\n```markdown\n# Ejected Plugin Assets\n\n**Ejected on:** \u003Ccurrent date>\n**Plugins ejected:**\n\n| Plugin | Version | Skills | Agents |\n|--------|---------|--------|--------|\n| dx-core | 2.19.0 | 45 | 5 |\n| dx-aem | 2.19.0 | 10 | 5 |\n| dx-automation | 2.19.0 | 11 | 0 |\n\n## Post-Eject Notes\n\n- All skills now load from `.claude\u002Fskills\u002F` (Claude Code)\n- All agents now load from `.claude\u002Fagents\u002F` (Claude Code) and `.github\u002Fagents\u002F` (Copilot)\n- Plugin originals are archived in `.ai\u002Fejected\u002F` for reference\n- To update: manually diff against newer plugin versions and merge changes\n- `\u002Fdx-doctor` and `\u002Fdx-upgrade` are no longer functional (they require plugin directories)\n- The ejected `\u002Fdx-doctor` skill can be adapted to check local files instead\n\n## File Ownership\n\n| Directory | Owner | Purpose |\n|-----------|-------|---------|\n| `.claude\u002Fskills\u002F` | Project | Claude Code skills (edit freely) |\n| `.claude\u002Fagents\u002F` | Project | Claude Code agents (edit freely) |\n| `.github\u002Fagents\u002F` | Project | Copilot agents (regenerate from templates if needed) |\n| `.ai\u002Fejected\u002F` | Archive | Plugin originals — reference only, do not edit |\n| `.ai\u002Frules\u002F` | Project | Shared rules (already project-owned) |\n| `.claude\u002Frules\u002F` | Project | Convention rules (already project-owned) |\n| `.ai\u002Flib\u002F` | Project | Utility scripts (already project-owned) |\n| `.ai\u002Ftemplates\u002F` | Project | Output templates (already project-owned) |\n```\n\nRead each ejected plugin manifest from `.ai\u002Fejected\u002Fmanifests\u002F` to get the version numbers.\n\n## 7. Summary Report\n\n```markdown\n## Eject Complete\n\n### Ejected\n| Category | Count | Location |\n|----------|-------|----------|\n| Claude Code skills | 66 | .claude\u002Fskills\u002F |\n| Claude Code agents | 10 | .claude\u002Fagents\u002F |\n| Copilot agents | 24 | .github\u002Fagents\u002F |\n| Plugin rules | 5 | .ai\u002Fejected\u002Fplugin-rules\u002F |\n| Shared files | 8 | .ai\u002Fejected\u002Fshared\u002F |\n| Data files | N | .ai\u002Fejected\u002Fdata\u002F |\n| Templates | N | .ai\u002Fejected\u002Ftemplates\u002F |\n| Manifests | 3 | .ai\u002Fejected\u002Fmanifests\u002F |\n\n### Next Steps\n1. **Verify skills work:** Run `\u002Fdx-help \"test\"` to confirm local skills load\n2. **Uninstall plugins:** `\u002Fplugin uninstall dx-core`, `\u002Fplugin uninstall dx-aem`, `\u002Fplugin uninstall dx-automation`\n3. **Commit ejected files:** `git add .claude\u002Fskills\u002F .claude\u002Fagents\u002F .github\u002F .ai\u002Fejected\u002F && git commit -m \"Eject dx plugins into local repo\"`\n4. **Update CLAUDE.md:** Note that this project uses ejected (local) skills, not plugins\n\n### Manual Actions\n\u003Clist any .gitignore issues, missing MCP config, or path reference updates that couldn't be automated>\n\n### What No Longer Works\n- `\u002Fdx-upgrade` — no plugin directories to pull updates from\n- `\u002Fdx-doctor` — plugin directory checks will fail\n- Plugin auto-updates on `\u002Fplugin install` — files are now local\n\n### What Still Works\n- All `\u002Fdx-*`, `\u002Faem-*`, `\u002Fauto-*` skills — loaded from `.claude\u002Fskills\u002F`\n- All Copilot skills and agents — loaded from `.github\u002F` (Copilot also reads `.claude\u002Fagents\u002F` but ignores Claude-only fields — see Troubleshooting)\n- `.ai\u002Fconfig.yaml`, `.ai\u002Frules\u002F`, `.claude\u002Frules\u002F` — unchanged\n- `.ai\u002Flib\u002F`, `.ai\u002Ftemplates\u002F` — unchanged\n```\n\n## Examples\n\n1. `\u002Fdx-eject all` — Ejects all 3 plugins. Copies 73 skills, 13 agents, templates, and data files. Creates `.ai\u002Fejected\u002F` archive. Reports 3 manifests saved for version tracking.\n\n2. `\u002Fdx-eject dx` — Ejects only dx-core. Copies 50 skills and 7 agents. AEM and automation plugins remain as plugins.\n\n3. `\u002Fdx-eject aem` — Ejects only dx-aem. Copies 12 AEM skills and 6 AEM agents. dx-core stays as a plugin (AEM skills depend on dx skills, which still load from the plugin).\n\n## Troubleshooting\n\n- **\"Skills not loading after eject\"**\n  **Cause:** Plugin is still installed and takes priority, or `.claude\u002Fskills\u002F` is gitignored.\n  **Fix:** Uninstall the plugin first, then verify `.claude\u002Fskills\u002F` is not in `.gitignore`.\n\n- **\"Shared file not found\" errors in skills**\n  **Cause:** Skills reference `shared\u002F` paths that are now at `.ai\u002Fejected\u002Fshared\u002F`.\n  **Fix:** Step 4 should have updated these references. If missed, manually update the skill's file path references.\n\n- **\"dx-doctor fails after eject\"**\n  **Cause:** Expected — dx-doctor looks for plugin directories which no longer exist.\n  **Fix:** Edit `.claude\u002Fskills\u002Fdx-doctor\u002FSKILL.md` to check `.ai\u002Fejected\u002F` instead of plugin directories. Or remove the dx-doctor skill if not needed.\n\n- **\"Copilot CLI warns `unknown fields ignored` for `.claude\u002Fagents\u002F*.md`\"**\n  **Cause:** Copilot CLI also reads `.claude\u002Fagents\u002F` (v1.0.108+). It drops Claude-only fields (`effort`, `memory`, `maxTurns`, `disallowedTools`, `isolation`) and falls back from `model: opus` to the picker model. Dropping `disallowedTools` means the ejected `dx-code-reviewer` is **not read-only on Copilot**. On a name clash `.github\u002Fagents\u002F` wins.\n  **Fix:** Expected — on Copilot use the `.github\u002Fagents\u002F` agents (`DxCodeReview` for reviews). If the team uses only Copilot, `.claude\u002Fagents\u002F` can be deleted.\n\n- **\"Want to go back to plugins\"**\n  **Cause:** Ejecting is one-way, but you can reverse it manually.\n  **Fix:** Delete `.claude\u002Fskills\u002F`, `.claude\u002Fagents\u002F`, `.ai\u002Fejected\u002F`. Reinstall plugins with `\u002Fplugin install`. Run `\u002Fdx-upgrade all`.\n\n## Rules\n\n- **Confirm before ejecting** — always show the warning and wait for explicit yes\n- **Archive everything** — copy plugin originals to `.ai\u002Fejected\u002F` even if already installed elsewhere\n- **Never modify .ai\u002Fconfig.yaml** — eject copies files, it doesn't change configuration\n- **Never modify .ai\u002Frules\u002F or .claude\u002Frules\u002F** — these are already project-owned and installed\n- **Never modify .ai\u002Flib\u002F or .ai\u002Ftemplates\u002F** — these are already installed by dx-init\n- **Track versions** — save plugin manifests so the team knows what version they ejected from\n- **One-way operation** — make this clear to the user; there's no \"un-eject\"\n",{"name":5,"description":7,"when_to_use":49,"allowed-tools":50,"argument-hint":53,"disable-model-invocation":54},"Use when a team wants to own all dx files locally without depending on plugins. Trigger on 'eject', 'copy plugin files locally', 'make dx self-contained', or 'I want to own the dx files'.",[28,51,40,27,52],"edit","agent","[dx|aem|auto|all]",true,"main","5c642842a92100dc7561ae0682a152a74846e186","plugins\u002Fdx-core\u002Fskills\u002Fdx-eject",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":65,"prompt":75,"zipAvailable":54},[66,69,72],{"tool":67,"command":68},"npx","npx skills add easingthemes\u002Fdx-aem-flow --skill dx-eject",{"tool":70,"command":71},"bunx","bunx skills add easingthemes\u002Fdx-aem-flow --skill dx-eject",{"tool":73,"command":74},"pnpm","pnpm dlx skills add easingthemes\u002Fdx-aem-flow --skill dx-eject","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-core\u002Fskills\u002Fdx-eject\u002FSKILL.md",[77],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Feject.sh","SCRIPT","脚本",8687,"https:\u002F\u002Fgithub.com\u002Feasingthemes\u002Fdx-aem-flow\u002Fblob\u002Fmain\u002Fplugins\u002Fdx-core\u002Fskills\u002Fdx-eject\u002Fscripts\u002Feject.sh",[84,106,127,145,159,174],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"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",[],[24,91,92,93,94,95,96,97,98,99,33,100,101,102,103,28,27,104,105],"dx hub status","hub","status","hub status","which","show","for","ticket","clean","done","Bash","id","dispatch","repos","grep",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"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",[],[113,114,24,115,92,116,117,118,119,120,121,122,123,124,101,125,126,28,27,51],"init","hub init","dx hub init","SET","time","mode","default","up","repo setup","orchestration","configure","multi-repo","cli","directory",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":134,"publishedAt":44},"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",[133],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[24,135,103,92,136,97,41,137,138,98,139,35,33,140,101,141,142,143,102,144],"dx hub dispatch","ado","work on","session","open","URL","vscode","code","across","work",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"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",[],[24,152,92,153,96,154,41,155,39,37,156,33,123,101,157,28,158,27,51,104],"dx hub config","config","view","manage","adjust","terminal","settings",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":165,"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",[],[166,24,167,104,95,41,143,168,102,169,144,170,92,171,172,173],"discover","dx discover repos","router","directive","simple","block","sonnet","table",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":181,"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",[180],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[182,24,183,42,184,40,185,36,34,186,28,27,51,187,188,189,190,33,29,191],"upgrade","dx upgrade","actions","fix","run","list","doctor","manual","missing","plugins"]