migration
Migrates legacy AEM (6.x, AMS, on-prem) to AEM as a Cloud Service via BPA CSV/cache and CAM/MCP discovery, one pattern per session. Use to review/scan a project for AEMaaCS migration — generates a read-only migration-runbook.md — or to fix specific Cloud Service blockers: scheduler, ResourceChangeLi
By adobe · 744 installs
npx skills add adobe/skills --skill migration
Source repository · Upstream listing
AEM as a Cloud Service — Code Migration
Source → target: Legacy AEM 6.x / AMS / on prem → AEM as a Cloud Service . Scoped under skills/aem/cloud service/skills/migration/ so this is not confused with Edge Delivery or 6.5 LTS.
This skill drives the migration workflow : BPA data, CAM/MCP, one pattern per session , and target discovery. Transformation rules and steps live in the code assessment skill — once a finding's pattern is identified, hand off to {code assessment}/<pattern /SKILL.md (or the relevant shared reference under {code assessment}/references/ ).
Setup: Use the aem cloud service install (see repository root README ) so both migration and code assessment paths are available. If you already have the monorepo open with resolvable {code assessment} paths, no separate install step is required.
Quick start (for the person driving the agent)
One pattern per chat/session — if you ask to "fix everything," the skill will ask you to pick first (e.g. scheduler vs replication vs htlLint).
You have… Say something like… What happens
A whole project to assess "Review my code for AEMaaCS migration" Generates read only migration runbook.md — all migration patterns (Java cascade + htlLint + osgiConfig ), affected files, sample prompts. No edits.
A BPA CSV "Fix scheduler findings using ./path/to/bpa.csv " Fastest path: CSV → cached collection → files
CAM + MCP only "Get scheduler findings from CAM; I'll pick the project when you list them." Agent lists projects → you confirm → MCP fetch ([cam mcp.md](references/cam mcp.md))
Just a few files "Migrate scheduler in core/.../MyJob.java " Manual flow: no BPA required
OSGi → Cloud Manager " Scan my config files and create Cloud Manager environment secrets or variables. " Agent auto reads [references/osgi cfg json cloud manager.md](references/osgi cfg json cloud manager.md) (full Adobe aligned rules inlined there); no BPA pattern id
HTL lint warnings "Fix htlLint issues in ui.apps " Proactive discovery via rg → fix per the HTL lint reference
Vault package dependencies "Fix vault package dependencies findings" / "Package install fails on AEMaaCS." Agent reads [references/vault package dependencies.md](references/vault package dependencies.md) — heuristic pom.xml scan (no BPA subtype, no analyzer) for day/cq60/product: install time deps in content package maven plugin ; removes the whole <dependencies block. Not a code assessment pattern — this dependency shape never occurs in native AEMaaCS code.
Oak index findings (OID) [BETA] "Fix oakIndex findings using ./path/to/bpa.csv " — covers index.rule.violation and standard.index.modification Invokes Adobe's @adobe/aem cs source migration index converter per [references/oak index.md](references/oak index.md); computes the next available custom N instead of assuming custom 1 ; shows diff + type compatibility check in IDE; validates with mvn and aemanalyser . Branch F.
Template modernization " Migrate my static templates to editable templates and generate Modernize Tools rules. " / "Create editable templates from my static templates." / "Generate AEM Modernize Tools structure/component/policy rules." Agent auto reads [references/template modernization/template modernization context.md](references/template modernization/template modernization context.md) (shared discovery + structured context), produces a per template plan table , then executes the plan using [editable template creation.md](references/template modernization/editable template creation.md) and [aem modernization.md](references/template modernization/aem modernization.md), and validates via [template modernization validation.md](references/template modernization/template modernization validation.md). No BPA pattern id.
Dialog migration "Convert my Classic UI / ExtJS dialogs to Touch UI." / "Upgrade Coral 2 dialogs to Coral 3." / "Fix LUI dialog findings." Agent reads [references/legacy ui/dialog/context.md](references/legacy ui/dialog/context.md) — filters BPA LUI to dialog sub types, converts via [extjs to coral3.md](references/legacy ui/dialog/extjs to coral3.md) or [coral2 to coral3.md](references/legacy ui/dialog/coral2 to coral3.md), validates via [validation.md](references/legacy ui/dialog/validation.md). BPA pattern id: lui .
Custom widget migration "Fix my CDW findings." / "Migrate custom ExtJS widgets to Coral 3." Agent reads [references/legacy ui/cdw/context.md](references/legacy ui/cdw/context.md) — inventories xtypes, maps or scaffolds Granite UI components via [conversion.md](references/legacy ui/cdw/conversion.md), validates via [validation.md](references/legacy ui/cdw/validation.md). BPA pattern id: cdw . Run CDW before dialog migration when both are needed.
Guava cache warnings "Fix guavaCache findings using BPA CSV." / "Swap Guava cache for Caffeine." Agent reads [references/guava cache.md](references/guava cache.md) — BPA is the source of truth (subtype custom.guava.cache ); one finding per bundle , not per Guava internal class row. BPA pattern id: guavaCache . Not a code assessment pattern — Guava cache usage only occurs in pre migration code, never native AEMaaCS code.
InputStream advisories "Fix inputStream findings." / "Triage the java.io.InputStream warnings in my BPA report." Agent reads [references/input stream.md](references/input stream.md) and runs the deterministic scanner scripts/input stream runner.js (pure Node). Adobe documents the risk as binary data streamed through the JVM, fixed by direct binary upload and CDN delivery. The scanner produces one finding per file, ordered by risk, with every stream site pre classified (F deserialization / E binary streamed or processed in the JVM / D local filesystem / C unbounded read / B unclosed stream or undisposed Binary / A benign) and tagged with a fix kind ( decision / review / auto ). Same precedence as the other BPA patterns: BPA findings first (CAM, then a BPA CSV, subtype java.io.inputstream ), whose classes the scanner resolves to workspace files for line level sites, with classes outside the workspace collapsed to one informational row per bundle (customer code kept elsewhere, platform provided AEM Forms add on, or third party); the whole workspace is scanned only when BPA has no inputStream findings. The agent proposes tier aware fixes for D/E/F, fixes unclosed streams, and verifies each edit with a files re scan. BPA pattern id: inputStream . Not a code assessment pattern, since BPA only raises it for code carried over from legacy AEM.
Dispatcher conversion "Convert my AMS / on prem Dispatcher config to AEM as a Cloud Service." Agent reads [references/dispatcher/context.md](references/dispatcher/context.md) — detects the config mode , generates the tool config, runs Adobe's dispatcher converter , verifies output (filter/ACL hard gate), and validates. Branch E. Runbook pattern id: dispatcherConversion (heuristic).
Validate a migration [BETA] "Validate my migration on the local Cloud SDK." / "Verify the scheduler fix before I raise a PR." Agent reads [references/validation/validate migration.md](references/validation/validate migration.md) — builds, deploys to the running local SDK, checks bundle/component state via the AEM Quickstart MCP, and reports the outcome to CAM when a project is linked. Branch G.
Starter prompts (copy paste) — the Quick start table above covers each pattern individually; these add the whole project entry point, source specific invocations (CSV / CAM / manual), and multi step combinations:
"Review my code for AEMaaCS migration" — start here for a full runbook before changing anything.
"Use the migration skill: scheduler only, BPA CSV at ./reports/bpa.csv ."
" Replication only from CAM; list projects first, I'll pick one."
" Manual: event listener migration for .../Listener.java ."
"Fix oakIndex findings using BPA CSV at ./reports/bpa.csv ."
"Fix all Classic UI and custom widget findings — CDW first, then dialogs."
"Fix guavaCache findings using BPA CSV at ./reports/bpa.csv ."
"Fix inputStream findings using BPA CSV at ./reports/bpa.csv ."
Path convention (Adobe Skills monorepo)
From the repository root (parent of the skills/ directory):
Symbol Path
{code assessment} skills/aem/cloud service/skills/code assessment/
Examples: {code assessment}/SKILL.md , {code assessment}/scheduler/SKILL.md , {code assessment}/references/scr to osgi ds.md .
Workspace scope (IDE) — user code only
Applies to finding and editing the user's AEM project (Java, bundles, config, HTL), not to reading installed skill files under {code assessment} .
Treat the current IDE workspace root folder(s) (single or multi root) as the only boundary for searches, globs, grep , and file reads/writes for migration targets.
Do not search parent directories, sibling folders on disk, ~ , other clones, or arbitrary absolute paths to "discover" sources unless the user explicitly names those paths or asks you to include them.
BPA CSV / CAM targets: If a filePath or class to file mapping does not resolve under a workspace root, stop and tell the user which paths are missing — do not hunt elsewhere on the filesystem. Ask them to open the correct project in the IDE or adjust paths.
Manual flow: Only migrate files the user named that live under the workspace (or paths they explicitly provided). Do not expand scope by searching outside the workspace.
Required delegation (do this first)
Branch A — OSGi configs → Cloud Manager (no Java BPA pattern this session): If the user asks to scan config files , create / set up Cloud Manager environment secrets or variables , move passwords or secrets out of OSGi / .cfg.json / ui.config , or mentions $[secret:] / $[env:] for AEM CS, then read [references/osgi cfg json cloud manager.md](references/osgi cfg json cloud manager.md) immediately and follow the product rules and workflow defined in that file (Adobe AEM as a Cloud Service OSGi + Cloud Manager behavior is reproduced there—no external doc URL required). Sleek prompts are enough — no need to name the reference file. Skip branch B for that work.
Branch B — Java / HTL / BPA pattern migration:
1. Read {code assessment}/SKILL.md — critical rules, Java baseline links, Pattern Guides table, Manual Pattern Hints .
2. Read the pattern guide (or reference) for the single active pattern:
scheduler → {code assessment}/scheduler/SKILL.md (pattern guide)
resourceChangeListener → {code assessment}/resource change listener/SKILL.md (pattern guide)
replication → {code assessment}/replication/SKILL.md (pattern guide)
eventListener / eventHandler → {code assessment}/event migration/SKILL.md (pattern guide — both JCR and OSGi Event Admin paths)
assetApi → {code assessment}/asset manager/SKILL.md (pattern guide)
htlLint → {code assessment}/references/data sly test redundant constant.md (reference — HTL lint is a single shared reference, not a dedicated pattern guide)
vault package dependencies → [references/vault package dependencies.md](references/vault package dependencies.md) (reference — heuristic pom.xml scan; lives under migration only, not code assessment , since this dependency shape never occurs in native AEMaaCS code)
guavaCache → [references/guava cache.md](references/guava cache.md) (reference — Guava cache → Caffeine swap; lives under migration only, not code assessment , since Guava cache usage does not occur in native AEMaaCS code, only in code carried over from legacy AEM)
inputStream → [refe