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
Read this fully before editing. Control plane: SKILL.md.
The recipe expects the following fields, per outdated-dependency finding, regardless of how they were obtained:
| Field | Example | Source |
|---|---|---|
file | core/pom.xml | Repo-relative path to the pom.xml |
groupId / artifactId | org.mockito / mockito-core | Maven coordinates of the dependency |
currentVersion | 4.4.0 | Value present in the developer's file |
targetVersion | 5.14.0 | Value to upgrade to — user-supplied |
shape | literal or property | Detected locally by reading the pom (see Pattern A vs B below) |
propertyName | mockito.version | Detected locally; only meaningful when shape=property |
These fields come from the user's request plus local inspection:
shape / propertyName.The targetVersion is always user-supplied — the skill never invents a version.
Finding has "shape": "literal".
Inside the file at findings[].file, find the <dependency> element matching:
<dependency>
<groupId>{groupId}</groupId>
<artifactId>{artifactId}</artifactId>
<version>{currentVersion}</version>
...
</dependency>Where {groupId}, {artifactId}, and {currentVersion} match the finding exactly. Any order of inner elements is acceptable — match by element names, not position.
Replace the text inside <version> from {currentVersion} to {targetVersion}. Do not touch whitespace or attributes.
If no <dependency> block matches all three of groupId, artifactId, currentVersion, the edit is unlocatable. Record skipped with reason literal-not-found: <groupId>:<artifactId>@<currentVersion> not present in <file>. Continue with remaining findings.
Before:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.4.0</version>
<scope>test</scope>
</dependency>After:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.14.0</version>
<scope>test</scope>
</dependency>Finding has "shape": "property" with "propertyName": "<key>".
Inside the file at findings[].file, find the <properties> block and the element named <{propertyName}>:
<properties>
...
<{propertyName}>{currentVersion}</{propertyName}>
...
</properties>Validate:
<properties>.currentVersion exactly.<dependency> in the same file whose <version> is ${propertyName} and whose groupId/artifactId match the finding. (Sanity check — prevents editing an unrelated property that happens to match the name.)Replace the text inside <{propertyName}> from {currentVersion} to {targetVersion}.
If any of the three validation conditions fails, the edit is unlocatable. Record skipped with reason:
property-missing: <propertyName> not in <file> if condition 1 failsproperty-value-mismatch: <propertyName> is <actual>, expected <currentVersion> if condition 2 failsproperty-not-referenced: no <dependency> using ${{propertyName}} for <groupId>:<artifactId> if condition 3 failsContinue with remaining findings.
Before:
<properties>
<mockito.version>4.4.0</mockito.version>
</properties>
...
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
</dependency>After:
<properties>
<mockito.version>5.14.0</mockito.version>
</properties>
...
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
</dependency>Some AEM projects reference the same property in multiple child poms via parent inheritance. This skill only handles properties defined in the same pom as the dependency. Parent-pom inheritance is not currently supported — leave those for a manual fix.
Use a text-level surgical replace, not a generic XML re-serializer, to preserve the developer's exact formatting (indentation, comments, attribute order). Anchor the replace on the full locator match so unrelated identical values (e.g. a comment containing 4.4.0) are not touched.
Concretely:
{currentVersion} text within that match.If the locator match is not unique (e.g. the same <groupId>/<artifactId>/<version> triple appears twice in one file), record skipped with reason ambiguous-locator: multiple matches for <groupId>:<artifactId>@<currentVersion> in <file>.
.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