Config Reference

Every field in .ai/config.yaml -- generated by /dx-init, extended by /aem-init

Migration Note: project.yaml Deprecated

The .ai/project.yaml file is deprecated. Its fields have been absorbed into config.yaml under project:, toolchain:, and build: sections. Run /dx-upgrade to migrate automatically. The seed data file .ai/project/project.yaml is NOT affected.

Overview

Config File

All skills read .ai/config.yaml at runtime. Never hardcode project-specific values.

Generated by

/dx-init creates the base file. /aem-init appends the aem: section.

Override Precedence

.ai/rules/ > config.yaml overrides: > plugin defaults

Config-Driven

Build commands, branch names, URLs, paths — all read from config. Zero hardcoded values.

Required

project

Project identity

FieldTypeRequiredDescription
namestringyesHuman-readable project name
prefixstringyesShort prefix used in naming conventions
typestringyesProject type detected by /dx-adapt (e.g., aem-fullstack, aem-frontend, frontend, java)
rolestringyesRepo role: frontend | backend | fullstack | config. Determines which AEM rule templates are installed.
Example
project:
name: "My Project"
prefix: "myproject"
type: aem-fullstack
role: fullstack
Required

scm

Source control and wiki configuration

FieldTypeRequiredDescription
providerstringyesado or github
orgstringyesOrganization URL
projectstringyesProject name within the org
repo-idstringnoRepository UUID (auto-discovered if not set)
base-branchstringyesDefault PR target (e.g., develop, main)
wiki-idstringnoADO wiki identifier UUID (for /dx-doc-gen, /dx-pr-review-report)
wiki-projectstringnoADO project that owns the wiki (if different from scm.project)
wiki-doc-rootstringnoRoot wiki path for technical documentation (sprint subfolders created beneath)
wiki-pr-review-rootstringnoRoot wiki path for PR review reports
wiki-dor-urlstringyesFull URL to the DoR wiki page — /dx-req fetches checklist from here
wiki-dod-urlstringyesFull URL to the DoD wiki page — /dx-req-dod fetches checklist from here
Optional

tracker

Work item tracking provider override

FieldTypeRequiredDescription
providerstringnoado or jira. Preferred over scm.provider for work item tracking. Falls back to scm.provider if not set.
Jira

jira + confluence

Required when tracker.provider is jira

FieldTypeRequiredDescription
jira.urlstringyes (if jira)Jira Cloud instance URL
jira.project-keystringyes (if jira)Jira project key (e.g., MYPROJ)
confluence.urlstringnoConfluence Cloud URL
confluence.space-keystringnoDefault Confluence space key
Required

build

Build and test commands

FieldTypeRequiredDescription
commandstringyesFull build command
teststringyesTest execution command
servestringnoDev server command
lint-jsstringnoJavaScript lint command
lint-scssstringnoSCSS lint command
lint-cssstringnoCSS lint command
lint-fixstringnoAuto-fix lint issues command
Example
build:
command: "mvn clean install"
test: "mvn test"
serve: "npm run dev"
lint-js: "npm run lint:js"
lint-scss: "npm run lint:scss"
lint-fix: "npm run lint:fix"
Optional

toolchain

Build stack details -- auto-detected by /dx-adapt

FieldTypeDescription
nodestringNode.js runtime version (e.g., 18.0.0)
build-toolstringwebpack | gulp4 | vite | rollup
css-compilerstringdart-sass | node-sass
js-transpilerstringbabel | esbuild | tsc
template-enginestringhtl | jsx (consumer may add others)
component-base-classstringFramework base class name
module-systemstringesm | iife | cjs
Example
toolchain:
node: "18.0.0"
build-tool: webpack
css-compiler: dart-sass
js-transpiler: babel
template-engine: htl
component-base-class: "BaseComponent"
module-system: esm

Auto-Detection

/dx-adapt detects these values from package.json, .nvmrc, webpack.config.js, and other project files. All fields are optional — only set what /dx-adapt can discover.

Optional

markets + repos

Multi-market support and cross-repo awareness

markets

FieldTypeDescription
brandstringBrand name
countrieslistCountry codes for this brand

repos

FieldTypeDescription
namestringRepository name
pathstringRelative path to local checkout
rolestringbackend, frontend, fullstack, or config
platformstringLegacy or DXN (AEM only, added by /aem-init)
ado-projectstringADO project (if different from scm.project)
base-branchstringDefault branch (defaults to scm.base-branch)
capabilitieslistRule templates for sync (auto-detected if omitted)
Example
repos:
- name: My-Backend-Repo
  path: ../My-Backend-Repo
  role: backend
  platform: Legacy
  base-branch: develop
  capabilities: [fe, be, sling]
Optional

preferences + overrides

Behavior customization without replacing plugin files

preferences

FieldTypeDefaultDescription
auto_commitboolfalseCommit after each step without asking
auto_prboolfalseCreate PR after all steps complete

overrides

OverrideFieldsAffects
pr-reviewtone, severity-threshold, extra-rules/dx-pr-review, /dx-pr-review-all
pr-answerpersona/dx-pr-answer
Example
overrides:
pr-review:
  tone: "direct, no praise"
  severity-threshold: 80
  extra-rules: |
    - Check for CSS custom properties over hardcoded values
    - Flag console.log left in code
pr-answer:
  persona: "senior developer, brief responses"
AEM

aem

Added by /aem-init -- AEM project configuration

FieldTypeRequiredDescription
component-pathstringyesJCR path to component definitions
component-prefixstringyesComponent naming prefix
component-groupstringnoDefault componentGroup value
resource-type-patternstringyesResource type template (<name> is replaced)
java-packagestringnoJava package root
frontend-dirstringnoFrontend source directory
brandslistnoBrand names for multi-brand projects
content-pathslistnoAEM content paths to search
author-urlstringnoLocal AEM author URL (default: http://localhost:4502)
author-url-qastringnoRemote QA author URL — for clickable links in output
publish-urlstringnoLocal AEM publisher URL (default: http://localhost:4503)
publish-url-qastringnoRemote QA publisher URL
demo-parent-pathstringnoParent path for all AI-created demo pages
selectorstringnoExporter selector for JSON endpoints
current-repostringnoCurrent repo name (for cross-repo scope detection)
platformstringnolegacy (custom Web Components/Gulp) or dxn (@netcentric/Webpack)
active-brandslistnoActive brands (scopes component and page searches)
active-marketslistnoActive markets with brand + countries (scopes searches)
qa-basic-authobjectnoQA/Stage HTTP Basic Auth credentials (username, password). Used by aem-editorial-guide-capture and aem-doc-gen.
Optional

roles

Agent role configuration

RoleFieldsDescription
re-agentenabled, output-formatRequirements Engineering agent. Output format: json or markdown.
qa-agentenabled, canModifyCode, requiresAEM, bugPolicyQA agent. bugPolicy.onlyFor restricts bug types. requiresHumanConfirmation gates bug creation.
Example
roles:
re-agent:
  enabled: true
  output-format: json
qa-agent:
  enabled: true
  canModifyCode: false
  requiresAEM: true
  bugPolicy:
    onlyFor: "ui-functional"
    requiresHumanConfirmation: true
Automation

Pipeline Environment Variables

Set on ADO pipeline runs, NOT part of config.yaml

Not Config Fields

These environment variables are set on ADO pipeline runs and read by skills at runtime. They are separate from .ai/config.yaml.

All CLI Pipelines

VariableDescription
DX_PIPELINE_MODESet to “true” in all CLI pipelines. Enables cross-repo delegation and pipeline-only behaviors.
ANTHROPIC_API_KEYClaude API key for Claude Code CLI authentication.
ADO_ORG_URLADO org URL. Used for plugin marketplace auth and cross-repo delegation.
ADO_ORG_NAMEShort ADO org name. Read by pipeline-agent.js for org identification.
DX_MARKETPLACE_URLGit URL with ref for the plugin marketplace repo. Only used when dx-aem-flow/ is not available locally.

Code-Writing Pipelines (BugFix, DevAgent, DoD-Fix)

VariableDescription
SOURCE_REPO_NAMESet to $(Build.Repository.Name). Skills compare against cross-repo scope to decide delegation.
CROSS_REPO_PIPELINE_MAPJSON mapping repo names to pipeline IDs. Used by the delegation YAML step.
Auto

Learning Directory

Auto-generated by coordinator skills -- no config needed

.ai/learning/

Coordinator skills automatically create this directory to store run metrics and patterns. Promoted patterns are written to .claude/rules/learned-fix-*.md — auto-loaded on every future run. No config is needed — the directory is created on first coordinator run.

Directory structure
.ai/learning/
├── fixes.md                    # Aggregated fix patterns
├── review-issues.md            # Aggregated review findings
├── patterns.md                 # Build error catalog
├── conventions-discovered.md   # Discovered conventions
├── metrics.md                  # Execution metrics summary
├── retro/
│   └── YYYY-WNN-summary.md    # Weekly retrospective
└── raw/                        # .gitignored
  ├── runs.jsonl              # Run records from coordinators
  ├── fixes.jsonl             # Fix patterns from dx-step-all
  ├── bugs.jsonl              # Bug patterns from dx-bug-all
  └── review-issues.jsonl     # Review findings from dx-step-verify

Promotion Flow

Raw signals in .ai/learning/raw/*.jsonl accumulate over runs. When a fix pattern reaches 3+ successes with 0 failures, it is promoted to .claude/rules/learned-fix-*.md — auto-loaded on every future Claude run. Convention patterns require 5+ occurrences and developer confirmation before promotion. Security patterns are promoted immediately with no threshold.

Precedence

Precedence Rules

How prompt, rule, and config values are resolved when multiple sources exist.

Prompt / Rule Content

For prompt and rule content, the highest-priority source wins:

  1. .ai/rules/<topic>.md (project-level overrides)
  2. config.yaml overrides: section
  3. Plugin defaults (rules/*.md inside the plugin)

Project-Specific Fields

For project-specific configuration values:

  1. User-provided URL values (explicit override)
  2. config.yaml values
  3. Auto-detected defaults (from /dx-init or /aem-init)

aem.repos Removed

The aem.repos field has been removed. Cross-repo configuration is now in the top-level repos: section. /aem-init enriches the top-level repos: entries with platform and ado-project fields instead.

KAI by Dragan Filipovic