This repository hosts extensions for the Experience Workspace (EW). Each extension is a self-contained DA App SDK application deployed on its own AEM Edge Delivery Services site and loaded into the EW shell.
Extensions add capabilities to EW — editors, panels, tools, and integrations — without modifying the core platform.
| Extension | Path | Entry point | Description |
|---|---|---|---|
| Skills Editor | apps/skills/ |
tools/skills.html |
Manage skills, agents, MCP servers, prompts, and memory |
More extensions coming soon.
Every extension follows the same pattern:
- Block contract — each extension exports a
decorate(block)function, loaded by da-nx'sloadBlockviaproviders.ewrouting (triggered by theew-class prefix). - EW hosts the extension at
da.live/apps/{extension}#/{org}/{site}. The page contains a<div class="ew-{extension}">thatloadBlockresolves to this repo. - Extension component — a LitElement (or vanilla JS module) that owns its own UI, state, and data operations against the DA Admin API.
To develop locally, run three servers:
# 1. da-live (port 3000)
cd ~/Projects/DA/da-live && aem up
# 2. da-nx (port 6456)
cd ~/Projects/DA/da-nx && npm start
# 3. ew-extensions (port 3001)
cd ~/Projects/DA/da-skills && aem upThen navigate to:
http://localhost:3000/apps/skills?nx=local&nxver=2#/{org}/{site}
The ?nx=local&nxver=2 params tell da-live to load da-nx from localhost, which in turn resolves ew-* blocks to :3001.
For isolated extension development (no auth, no da-nx routing):
http://localhost:3001/apps/skills/skills.html
- Create a new directory under
apps/{your-extension}/. - Add an entry point at
tools/{your-extension}.htmlthat imports the DA App SDK. - Implement your extension component — see
apps/skills/for a reference implementation. - Update the extensions table above.
The DA App SDK handles authentication for all extensions. When EW loads an extension in an iframe, the SDK passes the user's IMS access token via PostMessage. Extensions call initAuth(token) to configure subsequent DA Admin API requests.
No separate login flow is needed — the user is already authenticated in EW.
Linting (ESLint + Stylelint) runs on every push that touches apps/. E2e tests (Playwright) are available locally — see test/e2e/README.md for the tiered test strategy.
