aem-eds-kit 0.0.0-stage → 0.4.1

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 ADDED
@@ -0,0 +1,107 @@
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.1] - 2026-10-06
10
+
11
+ ### Changed
12
+ - Animated the five accent dots at interactive entry points (`eds` menu and
13
+ `block from-design`): a highlight bounces across them, then settles. Static
14
+ fallback when piped or with `--no-color`.
15
+ - Removed the maker credit from the brand lockup and dropped "× Figma" from the
16
+ default logo tagline (it reads as design-agnostic now).
17
+
18
+ ### Fixed
19
+ - Docs page links (logo / Home / nav) pointed at `/` and 404'd on the project
20
+ Pages path - now relative to `index.html`.
21
+
22
+ ## [0.4.0] - 2026-10-06
23
+
24
+ Design-agnostic generation, a full interactive configurator, and the first version
25
+ actually installable from npm (0.3.0 was unpublished before it shipped).
26
+
27
+ ### Added
28
+ - **`eds block from-design [url]`** - generate a block from **Figma, Google Stitch,
29
+ Canva or Sketch**. The wizard's first step picks the design source; Figma keeps its
30
+ pixel-perfect MCP path (`get_design_context` / `get_variable_defs` /
31
+ `get_screenshot`), other providers pass a design reference read through their own MCP.
32
+ - **Interactive configurator everywhere** - `eds` with no command opens a menu, and
33
+ `from-design`, `scaffold`, `integrate` and the Admin API are step-by-step wizards
34
+ when run without arguments.
35
+ - **`eds scaffold ue` / `eds scaffold blocks`** - deterministic (no agent) Universal
36
+ Editor components + a `field-reference` block covering all 17 field types and a
37
+ multifield, plus standard Block Collection blocks.
38
+ - **`eds integrate`** - add GTM / GA4 / chat / consent to `scripts/delayed.js`
39
+ (delayed phase, facade pattern for chat widgets).
40
+ - Live, colour-coded agent log with per-phase timings and a spinner; the live preview
41
+ **auto-starts** after generating (and live-reloads if one is already running).
42
+
43
+ ### Changed
44
+ - Renamed **`block from-figma` → `block from-design`** (the figma-named command is
45
+ gone). Not-yet-authored content uses lightweight **placeholders** instead of
46
+ bundling design assets, so the block is visible before Universal Editor takes over.
47
+ - The brand logo prints **once per run** (no repeat when entering a command from the
48
+ menu); CLI logo + dots use the landing accent `#ff5a36`.
49
+
50
+ ## [0.3.0] - 2026-10-05
51
+
52
+ First public release, published to npm as **`aem-eds-kit`** (the command stays `eds`).
53
+ Delivers the full pipeline in one shot: **Figma → pixel-perfect block → Universal
54
+ Editor authoring interface**.
55
+
56
+ ### Added
57
+ - **`eds block from-figma <url>`** - translate a Figma frame/component into an EDS
58
+ block. Builds a prompt (project tokens + EDS conventions), runs it through your AI
59
+ agent (Claude Code / Cursor / Codex) which reads the design via Figma MCP
60
+ (`get_design_context`, `get_variable_defs`, `get_screenshot`), generates
61
+ pixel-perfect JS + CSS, and self-verifies against the screenshot. Post-generation
62
+ verification of the produced files.
63
+ - **Universal Editor model by default** - `block create` and `block from-figma`
64
+ generate the UE model (`_<name>.json`, xwalk `definitions`/`models`/`filters`)
65
+ so blocks are authorable in UE immediately. Figma text/image/link layers and
66
+ component variants are mapped to UE fields (variants → `select` → CSS modifier).
67
+ Opt out with `--no-ue-model`.
68
+ - **`eds block preview <name>`** - live, breakpoint-switchable preview served in the
69
+ browser (dependency-free in-memory server). Width-honest `<iframe>` switcher
70
+ (375 / 768 / 1280 / Full) reads breakpoints and the Figma link from the block's
71
+ `.eds-meta.json`. `--port`, `--widths`, `--no-open`.
72
+ - **`eds block create <name>`** - scaffold a block (JS + CSS + UE model).
73
+ - **`eds block list`** - list blocks with file/UE/Figma status (`--json`).
74
+ - **`eds figma setup`** - configure Figma MCP for your AI agent.
75
+ - **`eds doctor`** - project audit (fstab, head.html, per-block JS, UE model,
76
+ `console.log`, Figma-sync freshness, config). `--json`.
77
+ - **`eds audit loading`** - three-phase loading / LCP-budget audit. `--json`.
78
+ - **`eds audit security`** - `npm audit` (dependency vulnerabilities) + static
79
+ exploit scan (XSS, `eval`, dynamic `innerHTML`, secrets, AWS/private keys, bearer
80
+ tokens, mixed content, `target="_blank"` tabnabbing, `postMessage('*')`, inline
81
+ handlers). Severity-grouped, `--json`, non-zero exit on critical/high.
82
+ - **`eds preview` / `eds publish <paths...>`** - preview/publish pages via the AEM
83
+ Admin API.
84
+ - Branded CLI UX: gradient ANSI "EDS" wordmark (shown on help and command entry
85
+ points), Adobe Spectrum palette, aligned status tables and summary boxes.
86
+ Global flags `--verbose`, `--quiet`, `--json`, `--no-color`.
87
+ - Conventions baked into generation: blocks are full-width (full-bleed) and
88
+ mobile-first by default; content capped for readability.
89
+
90
+ ### Notes
91
+ - The CLI is a dev tool - it ships nothing to your site bundle (0 bytes, no LCP
92
+ impact). Published tarball ~74 kB.
93
+
94
+ ## [0.2.0] - internal
95
+
96
+ Branded UX layer, shared presentation module, security audit, responsive preview
97
+ harness, gradient ANSI logo. Not published (superseded by 0.3.0).
98
+
99
+ ## [0.1.0] - internal
100
+
101
+ Initial CLI scaffold: `block create`, `block from-figma`, `block list`,
102
+ `figma setup`, `doctor`, `preview`, `publish`. Not published.
103
+
104
+ [Unreleased]: https://github.com/piotrgodycki/aem-eds-kit/compare/v0.4.1...HEAD
105
+ [0.4.1]: https://github.com/piotrgodycki/aem-eds-kit/releases/tag/v0.4.1
106
+ [0.4.0]: https://github.com/piotrgodycki/aem-eds-kit/releases/tag/v0.4.0
107
+ [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
- # Temporary Holding Version
1
+ <p align="center"><img src="https://raw.githubusercontent.com/piotrgodycki/aem-eds-kit/main/.github/assets/readme-banner.png" alt="aem-eds-kit - Design frame in. EDS block out." width="100%"></p>
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ # aem-eds-kit
4
+
5
+ [![npm version](https://img.shields.io/npm/v/aem-eds-kit.svg)](https://www.npmjs.com/package/aem-eds-kit)
6
+ [![npm downloads](https://img.shields.io/npm/dm/aem-eds-kit.svg)](https://www.npmjs.com/package/aem-eds-kit)
7
+ [![CI](https://github.com/piotrgodycki/aem-eds-kit/actions/workflows/ci.yml/badge.svg)](https://github.com/piotrgodycki/aem-eds-kit/actions/workflows/ci.yml)
8
+ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
9
+ [![node](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](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).