From dx-core
Check health of all dx workflow files — config, rules, scripts, seed data, MCP, settings. Detects installed plugins and checks each. Use after upgrading plugins or when something seems broken.
npx claudepluginhub easingthemes/dx-aem-flow --plugin dx-coreThis skill is limited to using the following tools:
You are a diagnostic tool for the dx workflow setup in a consumer project. You check all init-generated files across all installed plugins, then print a status report with actionable remediation.
Audits repository for baseline compliance across 9 categories: configuration, code quality, git hygiene, CI/CD, testing, security, documentation, Clank integration, MCP. Emits Markdown report and JSON sidecar.
Assesses codebase for AI agent readiness by detecting stacks, monorepos, git setup, and evaluating style, testing, code quality, secrets, and file sizes.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
You are a diagnostic tool for the dx workflow setup in a consumer project. You check all init-generated files across all installed plugins, then print a status report with actionable remediation.
This skill is read-only. Never modify, fix, or create anything.
Glob with exact path patterns — never [ -f ], test -f, or ls in BashRead to read files — never cat, head, or diff in BashRead, compare in-context — never shell diffgit branch -a (step 6a) — nothing else in this skill needs BashGlob/Read tools in a single response for efficiency — do not serialize into one Bash command with &&/||Read .ai/config.yaml. If it does not exist:
✗ FATAL: .ai/config.yaml not found. Run /dx-init first.
STOP.
Detect which plugins are configured:
aem: section present in config.yaml.ai/project/ directory exists with seed data files.ai/automation/infra.json existsParse the argument:
dx — check dx core onlyaem — check AEM plugin onlyseed-data or data — check seed data onlyauto — check automation plugin onlyall or no argument — check everythingIf the user requests a specific plugin that is not configured, report: ⚠ <plugin> plugin not configured. Skipping.
Check existence and validity of every file dx-init generates.
Read .ai/config.yaml and verify these required keys exist and are non-empty:
project.nameproject.prefixscm.providerscm.orgscm.base-branchbuild.commandReport each: ✓ present or ✗ MISSING.
Read dx.version from .ai/config.yaml:
⚠ dx.version not set — run /dx-upgrade to add version tracking⚠ Config version <version> behind plugin <plugin-version> — run /dx-upgrade✓ dx.version: <version>To determine the current plugin version, read version from the dx-core plugin.json.
Check for the deprecated adapt-generated profile file .ai/project.yaml (NOT .ai/project/project.yaml — that's seed data and is checked in section 8):
⚠ DEPRECATED: .ai/project.yaml found. Run /dx-upgrade to migrate fields to config.yaml.✓ not present (expected — fields are in config.yaml)Check existence of:
.ai/README.md → ✓ present or ✗ MISSINGagent.index.md (project root) → ✓ present or ✗ MISSING.ai/me.md → ✓ present or ⚠ missing (optional — created by /dx-init)Find the dx plugin directory by searching for this skill's own location:
Glob: "**/skills/dx-doctor/SKILL.md"
Navigate up 3 levels from the skill directory to get the dx plugin root.
Compare installed files against plugin source:
| Installed | Plugin Source |
|---|---|
.ai/lib/audit.sh | <dx-plugin>/data/lib/audit.sh |
.ai/lib/dx-common.sh | <dx-plugin>/data/lib/dx-common.sh |
.ai/lib/pre-review-checks.sh | <dx-plugin>/data/lib/pre-review-checks.sh |
.ai/lib/plan-metadata.sh | <dx-plugin>/data/lib/plan-metadata.sh |
.ai/lib/gather-context.sh | <dx-plugin>/data/lib/gather-context.sh |
.ai/lib/ensure-feature-branch.sh | <dx-plugin>/data/lib/ensure-feature-branch.sh |
.ai/lib/queue-pipeline.sh | <dx-plugin>/data/lib/queue-pipeline.sh |
.claude/hooks/stop-guard.sh | <dx-plugin>/data/hooks/stop-guard.sh |
For each:
✗ MISSING✓ up to date#) where the change is a genericized example name (e.g., plugin uses myai-dedupe but project uses kai-dedupe) → ✓ up to date (project-specific examples). Plugin templates use generic placeholder names in code comments; consumer projects replace these with real infrastructure names. This is NOT staleness.⚠ STALE (plugin version updated — run /dx-upgrade)Plugin documentation is public at https://easingthemes.github.io/dx-aem-flow/
If .ai/docs/ exists in the project, note: ℹ .ai/docs/ found — these are no longer synced from plugins. Safe to remove if not project-specific.
Check .ai/templates/ directory structure and staleness against <dx-plugin>/data/templates/:
For each subdirectory (spec/, wiki/, ado-comments/):
.ai/templates/<subdir>/ exists → if not, ✗ MISSING*.template file in the plugin source:
.ai/templates/<subdir>/<name> exists
✗ MISSING✓ up to date⚠ stale (plugin template updated — run /dx-upgrade)Report count: Output templates (<N> present, <M> stale, <K> missing out of <T> templates)
Compare installed rules against plugin templates. The dx plugin templates live at <dx-plugin>/templates/rules/.
.ai/rules/)| Installed | Template |
|---|---|
.ai/rules/pr-review.md | pr-review.md.template |
.ai/rules/pr-answer.md | pr-answer.md.template |
.ai/rules/pragmatism.md | pragmatism.md.template |
.ai/rules/plan-format.md | plan-format.md.template |
Note: If AEM plugin is configured, pr-review.md and pr-answer.md will have AEM sections appended — this is expected. When comparing, check whether the dx template portion (before the AEM section) matches the template. If only the AEM section differs, report as up to date for dx purposes.
.claude/rules/)| Installed | Template |
|---|---|
.claude/rules/reuse-first.md | universal-reuse-first.md.template |
For each rule:
✗ MISSING✓ up to date⚠ stale (plugin template updated — run /dx-upgrade)Read scm.provider from config.yaml.
If ado:
.mcp.json exists → ✓ or ✗ MISSINGmcpServers.ado entry → ✓ or ✗ MISSINGargs array contains the org from scm.org → ✓ matches or ⚠ org mismatch (config: <config-org>, .mcp.json: <mcp-org>)If not ado: Report — Not ADO, MCP check skipped
Security: Never print credentials, tokens, or full args arrays. Only report structure and org name.
Check .claude/settings.json:
attribution key with commit and pr subkeys
✓ attribution configured⚠ attribution settings missing (run /dx-upgrade)⚠ .claude/settings.json missingRead .gitignore (if it exists). Check for these entries (exact or parent-covering pattern):
.ai/specs/ → ✓ or ⚠ NOT in .gitignore.ai/run-context/ → ✓ or ⚠ NOT in .gitignore.ai/research/ → ✓ or ⚠ NOT in .gitignoreIf .gitignore does not exist → ⚠ no .gitignore found
Cross-check config values against the filesystem:
Run:
git branch -a 2>/dev/null
Check if scm.base-branch value appears in the output:
✓ branch exists⚠ branch '<name>' not found in local or remote branchesCheck that the build tool referenced in build.command has its config file:
mvn → check pom.xml existsnpm or npx → check package.json existsgradle → check build.gradle or build.gradle.kts existscargo → check Cargo.toml existsgo → check go.mod exists✓ build config found⚠ build command uses <tool> but <config-file> not foundSkip if .github/agents/ doesn't exist — Copilot was never enabled.
If it exists, check:
Compare installed agents in .github/agents/ against plugin templates in <dx-plugin>/templates/agents/:
For each *.agent.md.template in the plugin:
.github/agents/<name>.agent.md exists
✗ MISSING✓ up to date⚠ stale (plugin template updated — run /dx-upgrade)Report count: Copilot agents (<N> present, <M> stale, <K> missing out of <T> templates)
Skip if aem plugin not configured or not in scope.
Find the aem plugin directory:
Glob: "**/skills/aem-init/SKILL.md"
Navigate up 3 levels to get the aem plugin root.
Check these keys exist in the aem: section:
aem.component-path → ✓ or ✗ MISSINGaem.author-url → ✓ or ✗ MISSINGCheck existence and staleness of AEM rules in .claude/rules/. Compare each against <aem-plugin>/templates/rules/*.template:
| Installed | Template |
|---|---|
.claude/rules/be-components.md | be-components.md.template |
.claude/rules/be-sling-models.md | be-sling-models.md.template |
.claude/rules/be-testing.md | be-testing.md.template |
.claude/rules/fe-clientlibs.md | fe-clientlibs.md.template |
.claude/rules/fe-javascript.md | fe-javascript.md.template |
.claude/rules/fe-styles.md | fe-styles.md.template |
.claude/rules/naming.md | naming.md.template |
.claude/rules/accessibility.md | accessibility.md.template |
For each: missing → ✗ MISSING, content matches → ✓ up to date, differs → ⚠ stale.
Note: Some rules may have been intentionally deleted by dx-init step 8a (project type filtering). If .ai/config.yaml has project.type: aem-frontend, expect be-*.md files to be absent — report as — filtered (aem-frontend) not as missing.
Read .ai/rules/pr-review.md and .ai/rules/pr-answer.md. Check each contains an AEM-related section (grep for ## AEM or ## Sling):
✓ AEM sections present⚠ AEM sections missing from <file> (run /dx-upgrade)Print: → For component, OSGi, dispatcher, and instance checks, run /aem-doctor
Check for legacy config patterns that need migration:
aem.repos section exists in config → ⚠ MIGRATE: aem.repos should be merged into top-level repos:. Run /dx-upgrade or /dx-syncaem.current-repo field exists → ⚠ MIGRATE: aem.current-repo is deprecated. Run /dx-upgrade or /dx-syncrepos: entries exist but any entry lacks a path field → ⚠ repos entries missing path field. Run /dx-upgradeSkip if .ai/project/ directory does not exist or not in scope.
Check which seed data files exist in .ai/project/ and report line counts:
| File | Purpose | Expected |
|---|---|---|
project.yaml | Repos, brands, markets, platforms | yes |
file-patterns.yaml | Source file path patterns | yes |
content-paths.yaml | AEM content tree, language defaults | optional |
component-index-project.md | Enriched component catalog | yes |
architecture.md | Rendering pipelines, patterns | yes |
features.md | Domain feature documentation | yes |
component-index.md | Local repo component scan | generated by /aem-init |
For each: exists → ✓ present (<N> lines), missing (expected) → ✗ MISSING, missing (optional) → ⚠ not present (optional)
For each .yaml file in .ai/project/:
project.yaml: verify platforms[].id values are referenced by at least one entry in repos[] or brands[].markets[]✓ valid or ⚠ syntax issues: <details>Check existence and staleness in .claude/rules/. Compare against <aem-plugin>/templates/rules/:
| Installed | Template |
|---|---|
.claude/rules/audit.md | audit.md.template |
.claude/rules/qa-basic-auth.md | qa-basic-auth.md.template |
Skip if automation plugin not configured or not in scope.
.ai/automation/infra.json exists → ✓ or ✗ MISSINGautomationProfile value → report: Profile: <full-hub|consumer> (if field absent, report Profile: full-hub (legacy — no profile field)). Treat legacy pr-only and pr-delegation values as consumer.{{ placeholder remnants — profile-aware check:
{{...}} placeholders in the filefull-hub: all pipelines + Lambda + storage + monitoring + apiGateway + webhooksconsumer: pr-review, pr-answer, eval, devagent, bugfix, dod-fix pipeline entries + webhooks.pr-answer (consumers need their own repo-scoped PR Answer hook)webhooks.pr-answer for consumers) → ⚠ unresolved— hub-only (not applicable for consumer)✓ no unresolved placeholders⚠ <N> unresolved placeholders + list only the relevant onesℹ <N> hub-only placeholders ignored (not applicable for consumer — these entries belong to the hub project)consumer but infra.json contains lambdas, storage, monitoring, or apiGateway sections → ⚠ infra.json contains hub-only sections (likely initialized with old plugin). Run /auto-init to re-scaffold with correct profile. Note: webhooks.pr-answer IS expected for consumers (repo-scoped hook) — only WI webhook entries are hub-only..ai/automation/repos.json exists and is valid JSON → ✓ or ✗.ai/automation/policy/pipeline-policy.yaml exists → ✓ or ✗Read automationProfile from infra.json. Check only files expected for the profile:
✗.pr-only/pr-delegation): Only expect pipeline YAMLs for consumer agents and config files. Do NOT report missing Lambda handlers (lambda/), agent step directories (agents/dor/, agents/pr-review/, agents/pr-answer/), or shared libs as errors — these are hub-only files.Print: → For pipeline, Lambda, and env var checks, run /auto-doctor
Use this exact format with status indicators:
✓ — check passed⚠ — warning (works but attention needed)✗ — error (broken or missing)— — skipped (not applicable)=== dx Project Doctor ===
Plugins detected: dx, aem, seed-data
dx Core Files Status
─────────────────────────────────────────────────────────
.ai/config.yaml ✓ valid (6 required keys)
project.name ✓ present
scm.provider ✓ present
...
.ai/project.yaml (deprecated) ✓ not present
.ai/README.md ✓ present
agent.index.md ✓ present
.ai/me.md ⚠ missing (optional)
.ai/lib/audit.sh ✓ up to date
.ai/lib/dx-common.sh ✓ up to date
.ai/lib/pre-review-checks.sh ✓ up to date
.ai/lib/plan-metadata.sh ✓ up to date
.ai/lib/gather-context.sh ✓ up to date
.ai/lib/ensure-feature-branch.sh ✓ up to date
.ai/lib/queue-pipeline.sh ✓ up to date
.claude/hooks/stop-guard.sh ⚠ STALE
Plugin version updated — run /dx-upgrade
Docs (8 templates) ✓ 8 present, 0 stale
Output templates (11 templates) ✓ 11 present, 0 stale
dx Rule Files Status
─────────────────────────────────────────────────────────
.ai/rules/pr-review.md ✓ up to date
.ai/rules/pr-answer.md ⚠ stale
Template updated — run /dx-upgrade
.ai/rules/pragmatism.md ✓ up to date
.ai/rules/plan-format.md ✓ up to date
.claude/rules/reuse-first.md ✓ up to date
MCP Configuration Status
─────────────────────────────────────────────────────────
.mcp.json ✓ ADO MCP configured
Settings Status
─────────────────────────────────────────────────────────
.claude/settings.json ✓ attribution configured
.gitignore Coverage Status
─────────────────────────────────────────────────────────
.ai/specs/ ✓ in .gitignore
.ai/run-context/ ⚠ NOT in .gitignore
.ai/research/ ✓ in .gitignore
References Status
─────────────────────────────────────────────────────────
Base branch (develop) ✓ exists
Build tool (mvn) ✓ pom.xml found
Copilot Files Status
─────────────────────────────────────────────────────────
Copilot agents (14 templates) ✓ 14 present, 0 stale
Copilot skills (31 templates) ✓ 31 present, 0 stale
Shared files (7 files) ✓ 7 present, 0 stale
AEM Plugin Status
─────────────────────────────────────────────────────────
aem: config section ✓ valid
aem.component-path ✓ present
aem.author-url ✓ present
AEM rules (8 files) ✓ all present
be-components.md ⚠ stale
AEM sections in shared rules ✓ present
→ For component/OSGi/dispatcher/instance checks, run /aem-doctor
Project Seed Data Status
─────────────────────────────────────────────────────────
.ai/project/ ✓ 6 files present
project.yaml ✓ present (277 lines), valid
file-patterns.yaml ✓ present (119 lines), valid
content-paths.yaml ✓ present (58 lines), valid
component-index-project.md ✓ present (478 lines)
architecture.md ✓ present (100 lines)
features.md ✓ present (112 lines)
AEM rules ✓ all present
Automation Plugin Status
─────────────────────────────────────────────────────────
.ai/automation/infra.json ✓ valid
Profile consumer
Relevant placeholders ⚠ 3 unresolved
{{PR_REVIEW_PIPELINE_ID}}
{{PR_ANSWER_PIPELINE_ID}}
{{EVAL_PIPELINE_ID}}
Hub-only placeholders ℹ 8 ignored (hub-only)
.ai/automation/repos.json ✓ valid JSON
.ai/automation/policy/pipeline-policy.yaml ✓ present
→ For pipeline/Lambda/env checks, run /auto-doctor
Summary: 25 passed, 4 warnings, 0 errors
→ Run /dx-upgrade to fix 4 stale/missing items
For each warning/error, include a one-line remediation below the status.
/dx-doctor
Detects installed plugins (dx, aem, seed-data, auto), runs all checks, prints status report with pass/warn/error counts.
/dx-doctor aem
Only checks AEM plugin files — config keys, rule files, AEM sections in shared rules.
/dx-doctor
Compares installed files against plugin templates. Reports stale files that need updating via /dx-upgrade.
Cause: Project hasn't been initialized.
Fix: Run /dx-init to set up the project.
Cause: Plugin templates have been updated but consumer project files haven't been refreshed.
Fix: Run /dx-upgrade to update stale files automatically.
Cause: Plugin isn't installed or was installed to a different path.
Fix: Check that plugins are installed via /plugin install. The skill locates plugins by searching for their skill files.
⚠ <plugin> plugin directory not found. Cannot compare file versions. Checking existence only..gitignore doesn't exist, report it but don't treat it as fatal.ai/config.yaml, never hardcode