aem-eds-kit 0.0.0-stage → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +93 -0
- package/LICENSE +21 -0
- package/README.md +377 -2
- package/dist/bin/eds.js +4214 -0
- package/dist/bin/eds.js.map +1 -0
- package/package.json +65 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format is based on
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
|
|
5
|
+
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.4.0] - 2026-10-06
|
|
10
|
+
|
|
11
|
+
Design-agnostic generation, a full interactive configurator, and the first version
|
|
12
|
+
actually installable from npm (0.3.0 was unpublished before it shipped).
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- **`eds block from-design [url]`** - generate a block from **Figma, Google Stitch,
|
|
16
|
+
Canva or Sketch**. The wizard's first step picks the design source; Figma keeps its
|
|
17
|
+
pixel-perfect MCP path (`get_design_context` / `get_variable_defs` /
|
|
18
|
+
`get_screenshot`), other providers pass a design reference read through their own MCP.
|
|
19
|
+
- **Interactive configurator everywhere** - `eds` with no command opens a menu, and
|
|
20
|
+
`from-design`, `scaffold`, `integrate` and the Admin API are step-by-step wizards
|
|
21
|
+
when run without arguments.
|
|
22
|
+
- **`eds scaffold ue` / `eds scaffold blocks`** - deterministic (no agent) Universal
|
|
23
|
+
Editor components + a `field-reference` block covering all 17 field types and a
|
|
24
|
+
multifield, plus standard Block Collection blocks.
|
|
25
|
+
- **`eds integrate`** - add GTM / GA4 / chat / consent to `scripts/delayed.js`
|
|
26
|
+
(delayed phase, facade pattern for chat widgets).
|
|
27
|
+
- Live, colour-coded agent log with per-phase timings and a spinner; the live preview
|
|
28
|
+
**auto-starts** after generating (and live-reloads if one is already running).
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
- Renamed **`block from-figma` → `block from-design`** (the figma-named command is
|
|
32
|
+
gone). Not-yet-authored content uses lightweight **placeholders** instead of
|
|
33
|
+
bundling design assets, so the block is visible before Universal Editor takes over.
|
|
34
|
+
- The brand logo prints **once per run** (no repeat when entering a command from the
|
|
35
|
+
menu); CLI logo + dots use the landing accent `#ff5a36`.
|
|
36
|
+
|
|
37
|
+
## [0.3.0] - 2026-10-05
|
|
38
|
+
|
|
39
|
+
First public release, published to npm as **`aem-eds-kit`** (the command stays `eds`).
|
|
40
|
+
Delivers the full pipeline in one shot: **Figma → pixel-perfect block → Universal
|
|
41
|
+
Editor authoring interface**.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
- **`eds block from-figma <url>`** - translate a Figma frame/component into an EDS
|
|
45
|
+
block. Builds a prompt (project tokens + EDS conventions), runs it through your AI
|
|
46
|
+
agent (Claude Code / Cursor / Codex) which reads the design via Figma MCP
|
|
47
|
+
(`get_design_context`, `get_variable_defs`, `get_screenshot`), generates
|
|
48
|
+
pixel-perfect JS + CSS, and self-verifies against the screenshot. Post-generation
|
|
49
|
+
verification of the produced files.
|
|
50
|
+
- **Universal Editor model by default** - `block create` and `block from-figma`
|
|
51
|
+
generate the UE model (`_<name>.json`, xwalk `definitions`/`models`/`filters`)
|
|
52
|
+
so blocks are authorable in UE immediately. Figma text/image/link layers and
|
|
53
|
+
component variants are mapped to UE fields (variants → `select` → CSS modifier).
|
|
54
|
+
Opt out with `--no-ue-model`.
|
|
55
|
+
- **`eds block preview <name>`** - live, breakpoint-switchable preview served in the
|
|
56
|
+
browser (dependency-free in-memory server). Width-honest `<iframe>` switcher
|
|
57
|
+
(375 / 768 / 1280 / Full) reads breakpoints and the Figma link from the block's
|
|
58
|
+
`.eds-meta.json`. `--port`, `--widths`, `--no-open`.
|
|
59
|
+
- **`eds block create <name>`** - scaffold a block (JS + CSS + UE model).
|
|
60
|
+
- **`eds block list`** - list blocks with file/UE/Figma status (`--json`).
|
|
61
|
+
- **`eds figma setup`** - configure Figma MCP for your AI agent.
|
|
62
|
+
- **`eds doctor`** - project audit (fstab, head.html, per-block JS, UE model,
|
|
63
|
+
`console.log`, Figma-sync freshness, config). `--json`.
|
|
64
|
+
- **`eds audit loading`** - three-phase loading / LCP-budget audit. `--json`.
|
|
65
|
+
- **`eds audit security`** - `npm audit` (dependency vulnerabilities) + static
|
|
66
|
+
exploit scan (XSS, `eval`, dynamic `innerHTML`, secrets, AWS/private keys, bearer
|
|
67
|
+
tokens, mixed content, `target="_blank"` tabnabbing, `postMessage('*')`, inline
|
|
68
|
+
handlers). Severity-grouped, `--json`, non-zero exit on critical/high.
|
|
69
|
+
- **`eds preview` / `eds publish <paths...>`** - preview/publish pages via the AEM
|
|
70
|
+
Admin API.
|
|
71
|
+
- Branded CLI UX: gradient ANSI "EDS" wordmark (shown on help and command entry
|
|
72
|
+
points), Adobe Spectrum palette, aligned status tables and summary boxes.
|
|
73
|
+
Global flags `--verbose`, `--quiet`, `--json`, `--no-color`.
|
|
74
|
+
- Conventions baked into generation: blocks are full-width (full-bleed) and
|
|
75
|
+
mobile-first by default; content capped for readability.
|
|
76
|
+
|
|
77
|
+
### Notes
|
|
78
|
+
- The CLI is a dev tool - it ships nothing to your site bundle (0 bytes, no LCP
|
|
79
|
+
impact). Published tarball ~74 kB.
|
|
80
|
+
|
|
81
|
+
## [0.2.0] - internal
|
|
82
|
+
|
|
83
|
+
Branded UX layer, shared presentation module, security audit, responsive preview
|
|
84
|
+
harness, gradient ANSI logo. Not published (superseded by 0.3.0).
|
|
85
|
+
|
|
86
|
+
## [0.1.0] - internal
|
|
87
|
+
|
|
88
|
+
Initial CLI scaffold: `block create`, `block from-figma`, `block list`,
|
|
89
|
+
`figma setup`, `doctor`, `preview`, `publish`. Not published.
|
|
90
|
+
|
|
91
|
+
[Unreleased]: https://github.com/piotrgodycki/aem-eds-kit/compare/v0.4.0...HEAD
|
|
92
|
+
[0.4.0]: https://github.com/piotrgodycki/aem-eds-kit/releases/tag/v0.4.0
|
|
93
|
+
[0.3.0]: https://github.com/piotrgodycki/aem-eds-kit/releases/tag/v0.3.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Piotr Godycki
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,378 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center"><img src=".github/assets/readme-banner.png" alt="aem-eds-kit - Figma frame in. EDS block out." width="100%"></p>
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# aem-eds-kit
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/aem-eds-kit)
|
|
6
|
+
[](https://www.npmjs.com/package/aem-eds-kit)
|
|
7
|
+
[](https://github.com/piotrgodycki/aem-eds-kit/actions/workflows/ci.yml)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](https://nodejs.org)
|
|
10
|
+
|
|
11
|
+
**Turn a design into an EDS block** - JS, CSS and a Universal Editor model - without leaving your terminal.
|
|
12
|
+
|
|
13
|
+
`aem-eds-kit` gives you the `eds` command. Paste a design link - Figma, Google Stitch, Canva or Sketch - and it hands the design to the AI agent you already use (Claude Code, Cursor or Codex); the agent reads it through MCP and writes production-ready code straight into your repo. It also scaffolds blocks, previews them in your browser, and keeps your project healthy with a few quick audits.
|
|
14
|
+
|
|
15
|
+
It lives next to `@adobe/aem-cli` (your local dev server) and handles everything around it.
|
|
16
|
+
|
|
17
|
+
## Install
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g aem-eds-kit
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Node.js 20 or newer. That's all the setup there is - `eds` now works in **any folder**. Step into your EDS project (anywhere with a `fstab.yaml`) and the CLI finds the project root for you:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
cd ~/my-eds-site
|
|
27
|
+
eds figma setup # one-time: connect your AI agent to Figma
|
|
28
|
+
eds block from-design "<figma-url>" --name hero
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`eds` runs on your machine, not on your site - it never adds a single byte to what your visitors download.
|
|
32
|
+
|
|
33
|
+
## Interactive mode
|
|
34
|
+
|
|
35
|
+
Run `eds` with no command and it opens an **interactive menu** that walks you through every feature (generate a block from a design, scaffold, create a block, add an integration, preview, Admin API, audits, Figma setup). Most commands are also interactive on their own when you omit arguments - e.g. `eds block from-design` (wizard), `eds scaffold`, `eds integrate`, `eds preview`. Flags and subcommands still work for CI / power users.
|
|
36
|
+
|
|
37
|
+
A full A-Z reference of every command lives on the docs page: **https://piotrgodycki.github.io/aem-eds-kit/docs.html**
|
|
38
|
+
|
|
39
|
+
## Quick start
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
eds # interactive menu
|
|
43
|
+
|
|
44
|
+
# One-time: configure Figma MCP for your AI agent
|
|
45
|
+
eds figma setup
|
|
46
|
+
|
|
47
|
+
# Generate a block from a Figma design (wizard, or pass a URL)
|
|
48
|
+
eds block from-design
|
|
49
|
+
|
|
50
|
+
# Scaffold the standard UE components + blocks
|
|
51
|
+
eds scaffold ue
|
|
52
|
+
eds scaffold blocks
|
|
53
|
+
|
|
54
|
+
# Add a third-party service (GTM, GA4, chat…)
|
|
55
|
+
eds integrate
|
|
56
|
+
|
|
57
|
+
# Audit your project
|
|
58
|
+
eds doctor
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Commands
|
|
62
|
+
|
|
63
|
+
### `eds block create <name>`
|
|
64
|
+
|
|
65
|
+
Scaffolds `blocks/<name>/` with `<name>.js`, `<name>.css`, **and a Universal Editor model `_<name>.json` by default** - so the block is authorable in UE the moment it's created. Validates kebab-case naming and checks for collisions.
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
eds block create hero-banner # js + css + _hero-banner.json (UE model)
|
|
69
|
+
eds block create hero-banner --no-ue-model # skip the UE model
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The generated `_<name>.json` uses the EDS block-plugin (xwalk) format (`definitions` / `models` / `filters`) with starter fields (title + heading-level select + rich text). Extend it from the **full catalog of all 17 Universal Editor field types** - see [`docs/universal-editor-fields.md`](docs/universal-editor-fields.md). `eds block from-design` picks the right field type per Figma layer automatically.
|
|
73
|
+
|
|
74
|
+
### `eds block from-design [design-url]`
|
|
75
|
+
|
|
76
|
+
Translates a design - **Figma, Google Stitch, Canva or Sketch** - into an EDS block. Run with **no URL** for a step-by-step wizard (design source, name, link, content source, UE model, screenshot, run mode). It builds a prompt with EDS conventions + your project's design tokens and hands it to your AI agent (Claude Code, Cursor, or Codex). *(This was `from-figma` before it went design-agnostic; Figma is the most battle-tested source and stays pixel-perfect.)*
|
|
77
|
+
|
|
78
|
+
The agent reads the design through its MCP connection (for Figma: `get_design_context`, `get_variable_defs`, `get_screenshot`), generates pixel-perfect code (JS + CSS) **and its Universal Editor model** by default, uses lightweight **placeholders** for not-yet-authored content (so the block is visible before Universal Editor takes over), then self-verifies. You see a **live, colour-coded log** with per-phase timings, and on success the **live preview starts automatically**.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
eds block from-design # interactive wizard
|
|
82
|
+
eds block from-design "<figma-url>" --name hero # non-interactive
|
|
83
|
+
eds block from-design "<figma-url>" --dry-run # just build the prompt
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
| Flag | Description |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `--name <name>` | Override the inferred block name |
|
|
89
|
+
| `--source <type>` | Content source: `document` \| `ue` \| `cf` \| `mixed` |
|
|
90
|
+
| `--agent <type>` | Force `claude` \| `cursor` \| `codex` \| `none` |
|
|
91
|
+
| `--dry-run` | Build the prompt only |
|
|
92
|
+
| `--no-ue-model` | Skip the Universal Editor model |
|
|
93
|
+
| `--no-screenshot` | Skip the screenshot (fewer tokens; structural verification) |
|
|
94
|
+
| `--no-serve` | Don't auto-start the live preview |
|
|
95
|
+
| `--yes` | Skip confirmation prompts |
|
|
96
|
+
|
|
97
|
+
**Supported Figma URL formats:**
|
|
98
|
+
- `figma.com/design/:fileKey/:name?node-id=...`
|
|
99
|
+
- `figma.com/file/:fileKey/:name?node-id=...` (legacy)
|
|
100
|
+
- `figma.com/design/:fileKey/branch/:branchKey/:name` (branches)
|
|
101
|
+
- `figma.com/board/...`, `figma.com/make/...`, `figma.com/slides/...`
|
|
102
|
+
|
|
103
|
+
### `eds figma setup`
|
|
104
|
+
|
|
105
|
+
Interactive wizard that:
|
|
106
|
+
1. Detects installed AI agents (Claude Code, Cursor, Codex)
|
|
107
|
+
2. Checks if Figma MCP is configured for your agent
|
|
108
|
+
3. Shows install commands if not
|
|
109
|
+
4. Saves preferences to `~/.eds/config.json`
|
|
110
|
+
|
|
111
|
+
### `eds block list`
|
|
112
|
+
|
|
113
|
+
Lists all blocks in the project with their file status and Figma source info.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
eds block list
|
|
117
|
+
eds block list --json # machine-readable output
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### `eds block preview <name>`
|
|
121
|
+
|
|
122
|
+
Serves a **live, breakpoint-switchable preview** of a block in your browser - no build, no files written to your project (the harness is served from memory). A dropdown switches widths inside an iframe, and **edits live-reload** the browser (the server watches the block folder).
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
eds block preview hero
|
|
126
|
+
eds block preview hero --widths 375,768,1280 # custom breakpoints
|
|
127
|
+
eds block preview hero --port 9000 --no-open
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### `eds scaffold ue` · `eds scaffold blocks`
|
|
131
|
+
|
|
132
|
+
Scaffold Universal Editor components deterministically (no agent). `eds scaffold ue` writes/merges the three UE config files with the default-content components and a **`field-reference` block showing all 17 field types** + a multifield. `eds scaffold blocks` scaffolds standard Block Collection blocks (hero, cards, columns, accordion, embed) with UE models. Run `eds scaffold` for an interactive picker.
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
eds scaffold ue
|
|
136
|
+
eds scaffold blocks # all, or: eds scaffold blocks hero cards
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### `eds integrate [type]`
|
|
140
|
+
|
|
141
|
+
Add a third-party service to `scripts/delayed.js` (the EDS-correct place - delayed phase, after LCP, zero CWV impact). Chat widgets use the facade pattern.
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
eds integrate # interactive
|
|
145
|
+
eds integrate gtm # gtm · ga4 · chat · cookiebot · custom
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
- A dropdown switches the block between breakpoints inside an `<iframe>`, so the block's media queries fire against the chosen width - a **width-honest** comparison that isn't distorted by your monitor size.
|
|
149
|
+
- Breakpoints come from the block's `.eds-meta.json` (`breakpoints`, marking which widths have a real Figma frame → pixel-perfect) and fall back to `375 / 768 / 1280` or `--widths`.
|
|
150
|
+
- If the block has a `.eds-meta.json` with a Figma source, an **Open in Figma** link is shown.
|
|
151
|
+
- Authored sample content is read from `blocks/<name>/_<name>.preview.html` if present; otherwise a placeholder is used (and the chrome tells you to add one).
|
|
152
|
+
|
|
153
|
+
> Not to be confused with `eds preview <paths...>` (lower down), which previews **pages** via the AEM Admin API.
|
|
154
|
+
|
|
155
|
+
### `eds preview <path...>`
|
|
156
|
+
|
|
157
|
+
Preview pages via the AEM Admin API (`admin.hlx.page`).
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
eds preview /index
|
|
161
|
+
eds preview /blog/my-post /about
|
|
162
|
+
eds preview /index --org my-org --site my-repo --ref main
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### `eds publish <path...>`
|
|
166
|
+
|
|
167
|
+
Publish pages to live via the AEM Admin API.
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
eds publish /index
|
|
171
|
+
eds publish /blog/my-post /about
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Both `preview` and `publish` read `org`, `site`, and `ref` from `.edsrc.json` so you don't need to pass flags every time:
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"admin": {
|
|
179
|
+
"org": "my-github-org",
|
|
180
|
+
"site": "my-repo",
|
|
181
|
+
"ref": "main"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### `eds doctor`
|
|
187
|
+
|
|
188
|
+
Audits your EDS project for common issues:
|
|
189
|
+
- `fstab.yaml` exists and is valid YAML
|
|
190
|
+
- `head.html` present
|
|
191
|
+
- Every block folder has a matching `.js` file
|
|
192
|
+
- Every block has a Universal Editor model (`_<name>.json` or an entry in `component-models.json`)
|
|
193
|
+
- No `console.log` in block code
|
|
194
|
+
- `helix-query.yaml` valid if present
|
|
195
|
+
- Figma-generated blocks: warns if last sync > 30 days
|
|
196
|
+
- CLI config present
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
eds doctor
|
|
200
|
+
eds doctor --json
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### `eds audit loading`
|
|
204
|
+
|
|
205
|
+
Audits the EDS three-phase loading strategy and LCP budget:
|
|
206
|
+
- No render-blocking scripts / extra stylesheets / preload-preconnect / font preloads in `head.html`
|
|
207
|
+
- `scripts.js` has `loadEager` / `loadLazy` / `loadDelayed`; eager phase loads only the first section
|
|
208
|
+
- `styles.css` within the LCP budget; no `@import` chains
|
|
209
|
+
- No heavy libraries (`jquery`, `gsap`, `swiper`, …) or `document.write` in blocks
|
|
210
|
+
- Block CSS is scoped to `.<block-name>` (prevents style leakage / CLS)
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
eds audit loading
|
|
214
|
+
eds audit loading --json
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### `eds audit security`
|
|
218
|
+
|
|
219
|
+
Scans the project for **vulnerabilities** and **exploit patterns** - a defensive check you can run before every PR or in CI.
|
|
220
|
+
|
|
221
|
+
- **Dependency vulnerabilities** - runs `npm audit` and summarizes critical/high/moderate/low (skipped gracefully if there's no `package.json`/lockfile).
|
|
222
|
+
- **Exploit scan** - static analysis of `blocks/`, `scripts/`, and HTML for:
|
|
223
|
+
- `eval()`, `new Function()`, `document.write()` - code-execution vectors
|
|
224
|
+
- dynamic `innerHTML` / `insertAdjacentHTML` / `javascript:` URLs - XSS
|
|
225
|
+
- hardcoded secrets, AWS keys, private keys, bearer tokens
|
|
226
|
+
- `http://` resources (mixed content), `target="_blank"` without `rel="noopener"` (reverse tabnabbing)
|
|
227
|
+
- `postMessage('*')`, inline event handlers, leftover `console.log`
|
|
228
|
+
|
|
229
|
+
Findings are grouped by severity (CRIT / HIGH / MOD / LOW). Exits non-zero if any **critical or high** issue is found - wire it straight into CI.
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
eds audit security
|
|
233
|
+
eds audit security --json # for CI / tooling
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
The vendored framework (`scripts/aem.js` / `lib-franklin.js`) is never flagged.
|
|
237
|
+
|
|
238
|
+
## How Figma integration works
|
|
239
|
+
|
|
240
|
+
You don't need a Figma API token. `aem-eds-kit` never talks to Figma directly - it writes a focused prompt and hands it to the AI agent you already use, which has its own Figma MCP connection. The agent reads the design and writes the files; `eds` orchestrates the handoff and checks the result.
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
┌──────────┐ prompt ┌─────────────┐ MCP calls ┌───────────┐
|
|
244
|
+
│ eds-cli │ ──────────────→ │ Claude Code │ ──────────────→ │ Figma MCP │
|
|
245
|
+
│ │ │ / Cursor │ ←────────────── │ Server │
|
|
246
|
+
│ │ ←────────────── │ / Codex │ design data └───────────┘
|
|
247
|
+
│ │ block files └─────────────┘
|
|
248
|
+
└──────────┘
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
The prompt includes:
|
|
252
|
+
- Figma file key and node ID to fetch
|
|
253
|
+
- EDS block conventions (`decorate(block)`, vanilla JS, semantic HTML, full-width/mobile-first)
|
|
254
|
+
- CSS custom properties from your `styles/styles.css`
|
|
255
|
+
- Universal Editor model generation (fields mapped from Figma layers/variants) - on by default
|
|
256
|
+
- Lighthouse performance requirements + pixel-perfect self-verification
|
|
257
|
+
- Output file structure
|
|
258
|
+
|
|
259
|
+
## Configuration
|
|
260
|
+
|
|
261
|
+
Priority: CLI flags → env vars → `.edsrc.json` (project) → `~/.eds/config.json` (global)
|
|
262
|
+
|
|
263
|
+
**`~/.eds/config.json`** (created by `eds figma setup`):
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"agent": "claude"
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**`.edsrc.json`** (project root, optional):
|
|
271
|
+
```json
|
|
272
|
+
{
|
|
273
|
+
"admin": {
|
|
274
|
+
"org": "my-org",
|
|
275
|
+
"site": "my-site",
|
|
276
|
+
"ref": "main"
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Global flags
|
|
282
|
+
|
|
283
|
+
| Flag | Description |
|
|
284
|
+
|---|---|
|
|
285
|
+
| `--verbose` | Debug-level output |
|
|
286
|
+
| `--quiet` | Errors only |
|
|
287
|
+
| `--json` | Machine-readable JSON output |
|
|
288
|
+
| `--no-color` | Disable colors (also respects `NO_COLOR` env) |
|
|
289
|
+
|
|
290
|
+
## Development
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
git clone <repo-url> && cd eds-cli
|
|
294
|
+
npm install
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Scripts
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
npm run dev -- --help # run via tsx, no build needed
|
|
301
|
+
npm run build # build to dist/
|
|
302
|
+
npm test # vitest
|
|
303
|
+
npm run typecheck # tsc --noEmit
|
|
304
|
+
npm run lint # biome check
|
|
305
|
+
npm run lint:fix # biome auto-fix
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Testing locally
|
|
309
|
+
|
|
310
|
+
**Option A - global link (recommended):**
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
npm run build && npm link
|
|
314
|
+
eds --help # available everywhere
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
After code changes, re-run `npm run build` to update.
|
|
318
|
+
|
|
319
|
+
**Option B - dev mode (no build):**
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
npm run dev -- doctor
|
|
323
|
+
npm run dev -- block create my-block
|
|
324
|
+
npm run dev -- block from-design "https://www.figma.com/design/abc/File?node-id=1-2" --dry-run
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Option C - run from a test EDS project:**
|
|
328
|
+
|
|
329
|
+
The repo includes a fixture project you can use:
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
cd tests/fixtures/sample-eds-project
|
|
333
|
+
|
|
334
|
+
# with global link
|
|
335
|
+
eds doctor
|
|
336
|
+
eds block create my-block
|
|
337
|
+
eds block from-design "https://www.figma.com/design/abc/File?node-id=1-2" --dry-run --name hero
|
|
338
|
+
|
|
339
|
+
# without link
|
|
340
|
+
npx tsx ../../../src/bin/eds.ts doctor
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Testing Figma integration (dry-run)
|
|
344
|
+
|
|
345
|
+
You don't need a real Figma file to test prompt generation:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
eds block from-design "https://www.figma.com/design/abc123/Test?node-id=42-100" \
|
|
349
|
+
--dry-run --name hero-banner
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
This parses the URL, builds the full agent prompt (with project tokens, EDS conventions), saves it to a temp file, and prints it. No agent or Figma access needed.
|
|
353
|
+
|
|
354
|
+
### Running tests
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
npm test # run all tests once
|
|
358
|
+
npm run test:watch # watch mode
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Tests use fixtures in `tests/fixtures/` - a sample EDS project and recorded Figma MCP responses.
|
|
362
|
+
|
|
363
|
+
## Roadmap
|
|
364
|
+
|
|
365
|
+
- **Design sources** - deepen Google Stitch, Canva and Sketch support alongside Figma (the wizard's first step already picks the source), and a generic `eds setup` in place of `eds figma setup`.
|
|
366
|
+
- **Screenshot-to-block** - build a block from a plain image (harder: no structured layout/measurements, so pixel-perfect is tougher).
|
|
367
|
+
- **Tokens & sync** - design variables → CSS custom properties, and incremental re-sync of an existing block (`--update`).
|
|
368
|
+
- **Headless & CI** - a direct MCP client (no agent needed) for CI/CD, plus `eds lighthouse`, `eds rum` and `eds migrate page`.
|
|
369
|
+
|
|
370
|
+
## Trademarks & affiliation
|
|
371
|
+
|
|
372
|
+
`aem-eds-kit` is an independent, community project. It is **not affiliated with, endorsed by, or sponsored by Adobe or Figma.** It ships none of their code - it only generates code that follows the public, open-source AEM Edge Delivery Services conventions and interoperates with tools you install yourself.
|
|
373
|
+
|
|
374
|
+
Adobe, AEM, Edge Delivery Services and Universal Editor are trademarks of Adobe Inc. Figma is a trademark of Figma, Inc. These names are used only to describe compatibility.
|
|
375
|
+
|
|
376
|
+
## License
|
|
377
|
+
|
|
378
|
+
MIT - see [LICENSE](LICENSE).
|