Hybrid Cloud Outboxes
getsentry/sentry
Guide for creating and maintaining outbox-based eventually consistent operations in Sentry.
Publish, deactivate, and delete AEM content programmatically via the Cloud Service Replication API (com.day.cq.replication).
$ npx skills add adobe/skills --skill replication -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install adobe/skills replication --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/adobe/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/aem/cloud-service/skills/content-distribution/replication .claude/skills/replication && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "replication" agent skill from https://github.com/adobe/skills/tree/main/plugins/aem/cloud-service/skills/content-distribution/replication into .claude/skills/replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "replication", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/adobe/skills/tree/main/plugins/aem/cloud-service/skills/content-distribution/replicationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add adobe/skills --skill replication -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install adobe/skills replication --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adobe/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/aem/cloud-service/skills/content-distribution/replication .agents/skills/replication && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "replication" agent skill from https://github.com/adobe/skills/tree/main/plugins/aem/cloud-service/skills/content-distribution/replication into .agents/skills/replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "replication", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add adobe/skills --skill replication -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install adobe/skills replication --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adobe/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/aem/cloud-service/skills/content-distribution/replication .cursor/skills/replication && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "replication" agent skill from https://github.com/adobe/skills/tree/main/plugins/aem/cloud-service/skills/content-distribution/replication into .cursor/skills/replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "replication", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/adobe/skills.git --path plugins/aem/cloud-service/skills/content-distribution/replication--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add adobe/skills --skill replication -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install adobe/skills replication --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adobe/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/aem/cloud-service/skills/content-distribution/replication .gemini/skills/replication && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "replication" agent skill from https://github.com/adobe/skills/tree/main/plugins/aem/cloud-service/skills/content-distribution/replication into .gemini/skills/replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "replication", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install adobe/skills replicationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add adobe/skills --skill replication -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/adobe/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/aem/cloud-service/skills/content-distribution/replication .github/skills/replication && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "replication" agent skill from https://github.com/adobe/skills/tree/main/plugins/aem/cloud-service/skills/content-distribution/replication into .github/skills/replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "replication", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add adobe/skills --skill replication -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install adobe/skills replication --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adobe/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/aem/cloud-service/skills/content-distribution/replication .opencode/skills/replication && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "replication" agent skill from https://github.com/adobe/skills/tree/main/plugins/aem/cloud-service/skills/content-distribution/replication into .opencode/skills/replication/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "replication", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
replicationPublish, deactivate, and delete AEM content programmatically via the Cloud Service Replication API (com.day.cq.replication).
Replication is an agent skill from adobe/skills. Publish, deactivate, and delete AEM content programmatically via the Cloud Service Replication API (com.day.cq.replication). Covers single-path and bulk activation, preview-tier targeting with AgentFilter, synchronous/async options, ReplicationStatus checks, permission validation, workflow process steps, and replication event handling. Use when the user needs to publish pages, activate or deactivate content, check replication status, build workflow steps that replicate content, listen to replication events, query…
Its SKILL.md is about 4.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/patterns.md`).
It sits in Databases, covering Database administration and Content marketing. It works with Adobe Experience Manager. The repository describes itself as: Adobe Skills for Agents. The licence is Apache-2.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit cbc9952. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are java).
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
developer.adobe.comexperienceleague.adobe.comsling.apache.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Replication loads about 4.7k tokens when it runs, and up to ~5.5k if it reads all its reference files. Until then it costs about 163 tokens; SKILL.md has 549 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from adobe/skills at commit cbc9952, republished under its Apache-2.0 licence (© adobe). 549 words, ~4,727 tokens.
.claude/skills/replication/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Programmatic content publishing and unpublishing using the official AEM Replication API.
Use the Replication API for programmatic content distribution:
For UI-based publishing, use Manage Publication or Quick Publish instead.
Key Classes:
com.day.cq.replication.Replicator - Main replication servicecom.day.cq.replication.ReplicationOptions - Configuration optionscom.day.cq.replication.ReplicationStatus - Publication statuscom.day.cq.replication.ReplicationActionType - Action types (ACTIVATE, DEACTIVATE, DELETE, TEST)import com.day.cq.replication.Replicator;
import com.day.cq.replication.ReplicationActionType;
import com.day.cq.replication.ReplicationException;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import javax.jcr.Session;
@Component(service = ContentPublisher.class)
public class ContentPublisher {
@Reference
private Replicator replicator;
/**
* Activate a single page to Publish tier
*/
public void publishPage(Session session, String pagePath)
throws ReplicationException {
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
pagePath
);
}
/**
* Deactivate a page from Publish tier
*/
public void unpublishPage(Session session, String pagePath)
throws ReplicationException {
replicator.replicate(
session,
ReplicationActionType.DEACTIVATE,
pagePath
);
}
/**
* Delete content from Publish tier
*/
public void deleteFromPublish(Session session, String path)
throws ReplicationException {
replicator.replicate(
session,
ReplicationActionType.DELETE,
path
);
}
}CONSTRAINTS (per official Javadoc):
Note:
ReplicationOptions.setUseAtomicCalls()is@Deprecatedand marked "no longer required" in the Cloud Service Javadoc. Do not call it; the system handles auto-bucketing automatically.
public class BulkPublisher {
@Reference
private Replicator replicator;
/**
* Publish multiple pages.
* ≤100 paths → replicated atomically (transactional guarantee).
* >100 paths → system automatically splits into non-transactional chunks.
*/
public void publishMultiplePages(Session session, String[] pagePaths)
throws ReplicationException {
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
pagePaths,
null // No options needed; system handles auto-bucketing above 100 paths
);
}
}Best Practice: For large hierarchical content trees, use the Tree Activation workflow step instead of custom code.
The Preview tier requires explicit agent filtering.
import com.day.cq.replication.Agent;
import com.day.cq.replication.AgentFilter;
public class PreviewPublisher {
@Reference
private Replicator replicator;
/**
* Publish to Preview tier only
*/
public void publishToPreview(Session session, String pagePath)
throws ReplicationException {
ReplicationOptions options = new ReplicationOptions();
// Filter to target Preview agent only
options.setFilter(new AgentFilter() {
@Override
public boolean isIncluded(Agent agent) {
return "preview".equals(agent.getId());
}
});
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
pagePath,
options
);
}
/**
* Publish to BOTH Preview and Publish tiers
*/
public void publishToBothTiers(Session session, String pagePath)
throws ReplicationException {
ReplicationOptions options = new ReplicationOptions();
// Include both preview and publish agents
options.setFilter(new AgentFilter() {
@Override
public boolean isIncluded(Agent agent) {
String agentId = agent.getId();
return "preview".equals(agentId) || "publish".equals(agentId);
}
});
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
pagePath,
options
);
}
}Note: Preview agent is disabled by default and must be configured in Cloud Manager.
public class SynchronousPublisher {
@Reference
private Replicator replicator;
/**
* Synchronous replication (wait for completion)
*/
public void publishSynchronously(Session session, String pagePath)
throws ReplicationException {
ReplicationOptions options = new ReplicationOptions();
options.setSynchronous(true); // Block until complete
// Optional: Add listener for synchronous feedback
options.setListener(new ReplicationListener() {
@Override
public void onStart(ReplicationAction action) {
// Called when replication starts
}
@Override
public void onMessage(ReplicationLog.Level level, String message) {
// Called for progress updates
}
@Override
public void onEnd(ReplicationAction action, ReplicationResult result) {
// Called when replication completes
}
@Override
public void onError(ReplicationAction action, Exception error) {
// Called if replication fails
}
});
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
pagePath,
options
);
}
}Important: ReplicationListener only works with synchronous replication.
/**
* Replicate without updating replication metadata properties
*/
public void replicateWithoutStatusUpdate(Session session, String path)
throws ReplicationException {
ReplicationOptions options = new ReplicationOptions();
options.setSuppressStatusUpdate(true); // Don't update cq:lastReplicated, etc.
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
path,
options
);
}/**
* Replicate without creating implicit versions
*/
public void replicateWithoutVersioning(Session session, String path)
throws ReplicationException {
ReplicationOptions options = new ReplicationOptions();
options.setSuppressVersions(true); // Don't auto-version on replication
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
path,
options
);
}import com.day.cq.replication.ReplicationStatus;
import org.apache.sling.api.resource.Resource;
public class StatusChecker {
@Reference
private Replicator replicator;
/**
* Check if content is currently published
*/
public boolean isPublished(Session session, String path)
throws ReplicationException {
ReplicationStatus status = replicator.getReplicationStatus(session, path);
if (status == null) {
return false; // No replication metadata
}
return status.isActivated();
}
/**
* Get detailed replication information
*/
public void printReplicationInfo(Session session, String path)
throws ReplicationException {
ReplicationStatus status = replicator.getReplicationStatus(session, path);
if (status != null) {
System.out.println("Activated: " + status.isActivated());
System.out.println("Deactivated: " + status.isDeactivated());
System.out.println("Last Published: " + status.getLastPublished());
System.out.println("Published By: " + status.getLastPublishedBy());
System.out.println("Last Action: " + status.getLastReplicationAction());
System.out.println("Pending: " + status.isPending());
}
}
/**
* Alternative: Adapt resource to ReplicationStatus
*/
public boolean isPublished(Resource resource) {
ReplicationStatus status = resource.adaptTo(ReplicationStatus.class);
return status != null && status.isActivated();
}
}Use ReplicationStatusProvider.getBatchReplicationStatus() when you need to check the publication state of multiple resources in a single call. It is more efficient than calling Replicator.getReplicationStatus() in a loop.
Javadoc: com.day.cq.replication.ReplicationStatusProvider
import com.day.cq.replication.ReplicationStatus;
import com.day.cq.replication.ReplicationStatusProvider;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(service = BatchStatusChecker.class)
public class BatchStatusChecker {
@Reference
private ReplicationStatusProvider replicationStatusProvider;
/**
* Returns a map of path → ReplicationStatus for all given paths.
* Uses ReplicationStatusProvider.getBatchReplicationStatus(Resource...)
* which is more efficient than per-path Replicator.getReplicationStatus() calls.
*/
public Map<String, Boolean> checkPublishedState(ResourceResolver resolver, String[] paths) {
// Resolve all paths to Resource objects
Resource[] resources = Arrays.stream(paths)
.map(resolver::getResource)
.filter(Objects::nonNull)
.toArray(Resource[]::new);
// Single batch call — returns Map<path, ReplicationStatus>
Map<String, ReplicationStatus> statusMap =
replicationStatusProvider.getBatchReplicationStatus(resources);
Map<String, Boolean> result = new LinkedHashMap<>();
for (String path : paths) {
ReplicationStatus status = statusMap.get(path);
result.put(path, status != null && status.isActivated());
}
return result;
}
}Required imports:
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;public class PermissionValidator {
@Reference
private Replicator replicator;
/**
* Check if user has permission to replicate
*/
public boolean canUserReplicate(Session session, String path) {
try {
replicator.checkPermission(
session,
ReplicationActionType.ACTIVATE,
path
);
return true;
} catch (ReplicationException e) {
// User lacks permission
return false;
}
}
/**
* Validate before replicating
*/
public void safeReplicate(Session session, String path)
throws ReplicationException {
// Check permission first
replicator.checkPermission(session, ReplicationActionType.ACTIVATE, path);
// Proceed with replication
replicator.replicate(session, ReplicationActionType.ACTIVATE, path);
}
}import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import org.osgi.service.component.annotations.Component;
@Component(
service = WorkflowProcess.class,
property = {
"process.label=Publish Content to Publish Tier"
}
)
public class PublishWorkflowProcess implements WorkflowProcess {
@Reference
private Replicator replicator;
@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession,
MetaDataMap args) throws WorkflowException {
String payloadPath = workItem.getWorkflowData().getPayload().toString();
try {
Session session = workflowSession.adaptTo(Session.class);
replicator.replicate(
session,
ReplicationActionType.ACTIVATE,
payloadPath
);
} catch (ReplicationException e) {
throw new WorkflowException("Failed to publish content", e);
}
}
}Process Arguments (configured in workflow model):
MetaDataMap args to pass custom parameters like target tierUse OSGi Event Handlers to react to replication events:
import org.osgi.service.component.annotations.Component;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(
service = EventHandler.class,
property = {
org.osgi.service.event.EventConstants.EVENT_TOPIC + "=" + "com/day/cq/replication"
}
)
public class ReplicationEventLogger implements EventHandler {
private static final Logger LOG = LoggerFactory.getLogger(ReplicationEventLogger.class);
@Override
public void handleEvent(Event event) {
String[] paths = (String[]) event.getProperty("paths");
String action = (String) event.getProperty("action");
String userId = (String) event.getProperty("userId");
if (paths != null) {
for (String path : paths) {
LOG.info("Replication: action={}, path={}, user={}", action, path, userId);
}
}
}
}Event Properties:
paths - Array of replicated pathsaction - Replication action (Activate, Deactivate, etc.)userId - User who triggered replicationDon't build custom bulk publishing code. Use Tree Activation workflow step.
Always check permissions before replication to avoid exceptions.
Never replicate with admin credentials. Map a sub-service name to the principal that holds crx:replicate via ServiceUserMapperImpl.amended config. Provision the principal with jcr:read + crx:replicate on /content via Repo Init scripts — see AEM Project Structure — Repo Init. See references/patterns.md for the full service user setup example.
Minimize replication volume to reduce queue pressure and pipeline load.
See references/patterns.md for complete implementations:
SlingConstants.TOPIC_RESOURCE_CHANGEDCheck: Verify replication queues in Felix console (Sling Jobs console):
https://author-p<programId>-e<envId>.adobeaemcloud.com/system/console/slingjobsLook for failed jobs with topic: com/day/cq/replication
Error: javax.jcr.AccessDeniedException
Solution: Verify service user has replication permissions:
/content/mysite -> jcr:read, crx:replicateCheck:
replicator.getReplicationStatus()© adobe, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in plugins/aem/cloud-service/skills/content-distribution/replication of adobe/skills.
Open the folder on GitHubat commit cbc9952
Replication next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Replication this skilladobe/skills | 195 | — | ~4.7k | Automated safety check: Pass | Apache-2.0 | |
| Hybrid Cloud Outboxesgetsentry/sentry | 45k | — | ~4.8k | Automated safety check: Pass | Custom licence | |
| Replicate Video AdJingyi-Wu-Richael/replicate-video-ad | 106 | 1 repos | ~1.6k | Automated safety check: Pass | None | |
| Sea Orm 2FlyinPancake/yoink | 112 | — | ~2.9k | Automated safety check: Pass | Apache-2.0 | |
| Pixel Perfect ReplicationYu-369/VibeCurb | 980 | — | ~8.7k | Automated safety check: Pass | MIT | |
| Horse Database PoolingHashLoad/horse | 1.4k | — | ~1.4k | Automated safety check: Pass | MIT |
getsentry/sentry
Guide for creating and maintaining outbox-based eventually consistent operations in Sentry.
Jingyi-Wu-Richael/replicate-video-ad
Analyze a reference video frame by frame and turn its visual grammar, story beats, dialogue, product reveal, proof sequence, and conversion structure into a production-ready ecommerce story-ad…
FlyinPancake/yoink
Expert guidance for SeaORM 2.0, Rust's async ORM with strongly-typed columns, nested ActiveModels, Entity Loader API, and entity-first workflow.
Yu-369/VibeCurb
Image-to-code replication pipeline. An agent skill from Yu-369/VibeCurb.
HashLoad/horse
Guide for setting up thread-safe database connection pooling (FireDAC / UniDAC) in multithreaded Horse applications.
redis/agent-skills
Redis Cluster and replication guidance covering hash tags for multi-key operations, avoiding CROSSSLOT errors, and reading from replicas to scale read-heavy workloads.
adobe/skills
Scaffolds, implements, deploys and debugs Adobe Runtime actions in App Builder projects, with templates for webhooks, events, database CRUD, sequences and Asset Compute workers.
adobe/skills
Launches Chrome with an unpacked extension over CDP, opens its sidepanel, popup or options page, and hands over to cdp-connect for clicks, typing and screenshots.
adobe/skills
Extracts icons, metadata, text, forms, videos and social links from any web page with playwright-cli, with SVG icon classification and cleanup.
adobe/skills
Detect all languages used on a webpage — both declared (html@lang, hreflang alternate links, nested lang= attributes, meta content-language) and actually present in the body text (Google CLD3 via…
adobe/skills
Prepare any webpage for clean interaction by detecting and removing disruptive overlays (cookie banners, GDPR consent, modals, popups, newsletter signups, paywalls, login walls).
adobe/skills
Reduce a webpage to a structural skeleton with semantic tokens.
Works with
Categories
Publish, deactivate, and delete AEM content programmatically via the Cloud Service Replication API (com.day.cq.replication). Replication is an agent skill from adobe/skills.replication).
Replication fits situations like: the user needs to publish pages; deactivate content; check replication status; build workflow steps that replicate content.
Run `npx skills add adobe/skills --skill replication -a claude-code`. Or copy the skill folder (plugins/aem/cloud-service/skills/content-distribution/replication in adobe/skills) into .claude/skills/replication in your project. Claude Code loads it when a task matches its description.
Run `npx skills add adobe/skills --skill replication -a codex`. Or copy the skill folder (plugins/aem/cloud-service/skills/content-distribution/replication in adobe/skills) into .agents/skills/replication in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add adobe/skills --skill replication -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/replication, .gemini/skills/replication, .github/skills/replication and .opencode/skills/replication in your project.
SKILL.md names no scripts, command-line tools or credentials: Replication is instructions for the agent only.
SKILL.md names 3 domains. As links in the text: developer.adobe.com, experienceleague.adobe.com and sling.apache.org. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Replication is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.7k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 747 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Replication: Hybrid Cloud Outboxes (getsentry/sentry, 45k stars), Replicate Video Ad (Jingyi-Wu-Richael/replicate-video-ad, 106 stars), Sea Orm 2 (FlyinPancake/yoink, 112 stars) and Pixel Perfect Replication (Yu-369/VibeCurb, 980 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
adobe (a GitHub organization) maintains it in adobe/skills, which has 195 GitHub stars. The repository holds 105 skills in this directory. The repository was last updated on October 6, 2026.
Source: adobe/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.