All AEM as a Cloud Service skills: component development, Workflow model design, development, triggering, launchers, debugging, and triaging, Dispatcher config authoring, advisory, incident response, performance tuning, and security hardening, Rapid Development Environment (RDE) deployment, log inspection, snapshots, and troubleshooting via `aio aem rde`, Jackrabbit Oak query/index tuning (property, Lucene index definitions), and extracting/inventorying JCR queries (XPath, SQL2, QueryBuilder) across a codebase.
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Project configuration is loaded from .aem-skills-config.yaml in the project root (same level as pom.xml).
AI AGENT GATE CHECK - Read
.aem-skills-config.yamlFIRST:
- If file is missing or
configured: false→ STOP IMMEDIATELY. Do NOT read any other files. Do NOT explore the codebase. Display the configuration error message and WAIT.- If
configured: true→ Readproject,package, andgroupvalues from that file. Proceed with component creation.
⚠️ AI AGENTS - ABSOLUTE RULES:
- READ
.aem-skills-config.yamlFIRST - If missing orconfigured: false, STOP- DO NOT read any other files in the repository to find values
- DO NOT explore
/apps/,core/,pom.xml, or any existing components- DO NOT infer values from folder structures, package names, or existing code
- ONLY USE VALUES FROM
.aem-skills-config.yamlafterconfigured: true- VIOLATION = IMMEDIATE FAILURE - Any inference attempt is a rule violation
ui.apps/src/main/content/jcr_root/apps/[project]/components/{component-name}/
├── .content.xml # Component definition
├── {component-name}.html # HTL template
├── _cq_dialog/
│ └── .content.xml # Component dialog
└── _cq_editConfig.xml # Edit configuration (optional)core/src/main/java/[package-path]/
├── models/
│ ├── {ComponentName}Model.java # Main component model
│ └── {ItemName}.java # Child model (for multifield)
├── filters/
├── servlets/
├── services/
└── schedulers/Note:
[package-path]=[package]with dots replaced by slashes (e.g.,com/mysite/core)
core/src/test/java/[package-path]/
├── models/
│ └── {ComponentName}ModelTest.java
└── testcontext/ # (optional)
└── AppAemContext.java # Optional shared test context helperui.apps/src/main/content/jcr_root/apps/[project]/clientlibs/
├── clientlib-base/ # Base styles/scripts
├── clientlib-site/ # Site-wide
├── clientlib-dependencies/ # Third-party
└── clientlib-{component-name}-dialog/ # Component dialog clientlib<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="cq:Component"
jcr:title="{Component Display Title}"
jcr:description="{Component Description}"
componentGroup="[group]"
generatedBy="aem-dev-agent"/>| Element | Convention | Example |
|---|---|---|
| Component folder | kebab-case | hero-banner, tiles-list |
| HTL file | match folder name | hero-banner.html |
| Sling Model class | PascalCase + Model | HeroBannerModel.java |
| Multifield item class | PascalCase | TileItem.java, LinkItem.java |
| Test class | PascalCase + Test | HeroBannerModelTest.java |
| CSS class (BEM) | cmp-{name}__{element} | cmp-hero-banner__title |
| Dialog clientlib category | [project].{name}.dialog | [project].hero-banner.dialog |
| Site clientlib category | [project].{type} | [project].base, [project].site |
| Component Name | Model Class | Test Class | CSS Prefix |
|---|---|---|---|
hero-banner | HeroBannerModel | HeroBannerModelTest | cmp-hero-banner |
tiles-list | TilesListModel | TilesListModelTest | cmp-tiles-list |
contact-form | ContactFormModel | ContactFormModelTest | cmp-contact-form |
cmp-{component-name}__{element}--{modifier}htl-patterns.md)hasContent() or isEmpty() in modelsdata-cmp-is attribute for JavaScript hooksFor field type mappings (dialog field types → Granite resource types, Sling Model annotations), see assets/field-type-mappings.md or the Quick Reference table in SKILL.md.
For detailed dialog configuration, see
dialog-patterns.md
| Annotation | Purpose | Example |
|---|---|---|
@ValueMapValue | Simple property | @ValueMapValue private String title; |
@ChildResource | Nested resource | @ChildResource(name="image") private Resource img; |
@ChildResource | Multifield list | @ChildResource(name="items") private List<Resource> items; |
@SlingObject | Current resource | @SlingObject private Resource resource; |
@PostConstruct | Init logic | @PostConstruct protected void init() {} |
For detailed model patterns, see
model-patterns.md
This project uses modular rules files for specific aspects:
| Rules File | Purpose |
|---|---|
dialog-patterns.md | Dialog XML structure, field types, validation |
htl-patterns.md | HTL template patterns, expressions, accessibility |
model-patterns.md | Sling Model structure, annotations, patterns |
clientlib-patterns.md | Clientlib structure, JS/CSS patterns |
java-standards.md | Java code quality, Javadoc, error handling |
test-patterns.md | Unit test structure, scenarios, assertions |
When creating components, ensure consistency across all files:
Dialog field name="./title"
↓
Model: @ValueMapValue private String title;
↓
HTL: ${model.title}
↓
CSS: .cmp-component__title| Dialog Property | Model Field | HTL Expression | CSS Class |
|---|---|---|---|
./title | title | ${model.title} | __title |
./description | description | ${model.description @ context='html'} | __description |
./linkURL | linkURL | ${model.linkURL @ extension='html'} | __link |
./items (multifield) | List<ItemModel> items | ${model.items} via data-sly-list | __item |
All other rules files use these placeholders. The AI will substitute your configured values:
| Placeholder | Substituted With | Used In |
|---|---|---|
[project] | Your project name | Paths, resource types, clientlib categories |
[package] | Your Java package | Model imports, package declarations |
[group] | Your component group | Component definitions |
[package-path] | Package as path | Directory structures |
.tessl-plugin
skills
aem-rde
aem-workflow
code-assessment
content-distribution
create-component
assets
references
dispatcher
incident-response
references
dispatcher-foundation
performance-tuning
references
dispatcher-foundation
security-hardening
references
dispatcher-foundation
technical-advisory
references
dispatcher-foundation
workflow-orchestrator
references
dispatcher-foundation
ensure-agents-md
references
migration
references
dispatcher
legacy-ui
template-modernization
validation
scripts
dispatcher-tool
validate-migration