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
Runs once per CDW session. Reads BPA CDW findings (pattern id cdw), inventories all unique custom xtypes, determines whether a Coral 3 equivalent exists for each, and emits .migration/cdw-context.yml. The converter (conversion.md) uses this YAML to process each xtype. Add .migration/ to .gitignore.
Why per-xtype, not per-component: Many components share the same custom widget. Resolving the xtype once fixes all its usages. Process unique xtypes first, then apply the resolution across all affected dialog occurrences.
session:
cdwFindingsTotal: <N>
uniqueXtypes: <N>
xtypes:
- xtype: <xtype-name> # e.g. "my-colorpicker"
registrationPattern: CQ.Ext.reg | xtype-property | unknown
jsSourcePath: <workspace-relative path to JS file defining the widget> | not-found
widgetPurpose: <one-line description inferred from JS source> | needs-user-confirm
coral3Equivalent:
type: known-mapping | custom-component-needed | needs-user-confirm
resourceType: <Coral 3 sling:resourceType> | null # when type=known-mapping
notes: <why this mapping applies> | null
affectedComponents:
- componentPath: <workspace-relative>
dialogPath: <workspace-relative path to dialog node containing this xtype>
nodeNames: [ <widget node names using this xtype> ]
action: apply-mapping | scaffold-custom-component | needs-user-confirmEvery field required. Unknown values use needs-user-confirm.
CDW findings (cdw BPA pattern) are separate from LUI dialog findings. Do NOT mix:
getBpaFindings('cdw', ...) → custom xtypes in Classic UI dialogsgetBpaFindings('lui', ...) → dialog-level classic/coral2 (handled by legacy-ui/dialog/)CDW findings are frequently found inside the same Classic UI dialogs that legacy-ui/dialog/ also processes. If both sessions are run: run CDW first to resolve custom xtypes, then run dialog conversion — the dialog converter will be able to map all xtypes without stopping.
/apps/<rest> → ui.apps/src/main/content/jcr_root/apps/<rest>Get CDW findings. getBpaFindings('cdw', { bpaFilePath, collectionsDir, limit: 5, offset: 0 }). Each finding filePath is the path to a cq:Widget node.
Resolve and group by xtype. For each finding, read the xtype property of the flagged node. Group all findings by unique xtype value.
Find JS source per xtype. For each unique xtype:
ui.apps/**/clientlibs/**/*.js for CQ.Ext.reg('<xtype>' or xtype: '<xtype>'.jsSourcePath; read the file to infer widgetPurpose.jsSourcePath: not-found — widget may be from a shared library; note for user.Determine Coral 3 equivalent. For each unique xtype, check the known mappings table below. If matched: type: known-mapping, set resourceType. If not matched: type: custom-component-needed.
Known additional Coral 3 equivalents (beyond the dialog converter's known-safe list):
| Custom xtype pattern | Often maps to |
|---|---|
| Colour/color picker | granite/ui/components/coral/foundation/form/colorfield |
| Tag selector | cq/gui/components/coral/common/form/tagfield |
| User/group picker | cq/gui/components/coral/common/form/userpicker |
| Path/asset browser | granite/ui/components/coral/foundation/form/pathfield |
| Date/time selector | granite/ui/components/coral/foundation/form/datepicker |
| Multi-value text | granite/ui/components/coral/foundation/form/multifield (simple) |
| Slider/range | granite/ui/components/coral/foundation/form/slider |
| Switch/toggle | granite/ui/components/coral/foundation/form/switch |
For ambiguous cases: type: needs-user-confirm — show JS source excerpt to user and ask.
Emit + confirm. Write YAML → show xtype summary table → ask user to confirm purposes and equivalents before converting.
| Custom xtype | JS source found? | Purpose | Coral 3 equivalent | Action |
|---|---|---|---|---|
my-xtype | yes/no | inferred purpose | resourceType or "custom needed" | apply-mapping / scaffold / confirm |
Show table, get confirmed, then execute per-xtype via conversion.md.
Post-execute: run validation.md.
.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