aem-eds-kit 0.4.0 → 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 CHANGED
@@ -6,6 +6,19 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
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
+
9
22
  ## [0.4.0] - 2026-10-06
10
23
 
11
24
  Design-agnostic generation, a full interactive configurator, and the first version
@@ -88,6 +101,7 @@ harness, gradient ANSI logo. Not published (superseded by 0.3.0).
88
101
  Initial CLI scaffold: `block create`, `block from-figma`, `block list`,
89
102
  `figma setup`, `doctor`, `preview`, `publish`. Not published.
90
103
 
91
- [Unreleased]: https://github.com/piotrgodycki/aem-eds-kit/compare/v0.4.0...HEAD
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
92
106
  [0.4.0]: https://github.com/piotrgodycki/aem-eds-kit/releases/tag/v0.4.0
93
107
  [0.3.0]: https://github.com/piotrgodycki/aem-eds-kit/releases/tag/v0.3.0
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- <p align="center"><img src=".github/assets/readme-banner.png" alt="aem-eds-kit - Figma frame in. EDS block out." width="100%"></p>
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
3
  # aem-eds-kit
4
4
 
package/dist/bin/eds.js CHANGED
@@ -18,70 +18,8 @@ var init_esm_shims = __esm({
18
18
  }
19
19
  });
20
20
 
21
- // src/lib/logger.ts
22
- import chalk from "chalk";
23
- function getLevel() {
24
- const env = process.env.EDS_LOG_LEVEL?.toLowerCase();
25
- if (env && env in LEVEL_ORDER) return env;
26
- return "info";
27
- }
28
- function shouldLog(level) {
29
- if (quiet) return level === "error";
30
- return LEVEL_ORDER[level] >= LEVEL_ORDER[currentLevel];
31
- }
32
- var LEVEL_ORDER, currentLevel, quiet, logoShown, logger;
33
- var init_logger = __esm({
34
- "src/lib/logger.ts"() {
35
- "use strict";
36
- init_esm_shims();
37
- LEVEL_ORDER = {
38
- debug: 0,
39
- info: 1,
40
- warn: 2,
41
- error: 3,
42
- silent: 4
43
- };
44
- currentLevel = getLevel();
45
- quiet = false;
46
- logoShown = false;
47
- logger = {
48
- setLevel(level) {
49
- currentLevel = level;
50
- },
51
- setQuiet(q) {
52
- quiet = q;
53
- },
54
- debug(...args) {
55
- if (shouldLog("debug")) console.error(chalk.gray("[debug]"), ...args);
56
- },
57
- info(...args) {
58
- if (shouldLog("info")) console.error(...args);
59
- },
60
- /**
61
- * Print the brand logo at most once per process. The interactive menu and
62
- * every command call this, so running a command directly shows the logo,
63
- * while picking it from the menu (which already showed it) doesn't repeat it.
64
- */
65
- logoOnce(art) {
66
- if (logoShown) return;
67
- logoShown = true;
68
- if (shouldLog("info")) console.error(art);
69
- },
70
- success(...args) {
71
- if (shouldLog("info")) console.error(chalk.green("\u2713"), ...args);
72
- },
73
- warn(...args) {
74
- if (shouldLog("warn")) console.error(chalk.yellow("\u26A0"), ...args);
75
- },
76
- error(...args) {
77
- if (shouldLog("error")) console.error(chalk.red("\u2717"), ...args);
78
- }
79
- };
80
- }
81
- });
82
-
83
21
  // src/lib/ui.ts
84
- import chalk2 from "chalk";
22
+ import chalk from "chalk";
85
23
  function statusIcon(status) {
86
24
  return icon[status];
87
25
  }
@@ -93,10 +31,27 @@ function padEndVisible(s, width) {
93
31
  return pad > 0 ? s + " ".repeat(pad) : s;
94
32
  }
95
33
  function mark() {
96
- return chalk2.bgHex("#ff5a36").hex("#0d0d0c").bold(" >_ ");
34
+ return chalk.bgHex("#ff5a36").hex("#0d0d0c").bold(" >_ ");
97
35
  }
98
36
  function lockup() {
99
- return `${mark()} ${chalk2.bold("aem-eds-kit")} ${chalk2.dim("by Piotr Godycki")}`;
37
+ return `${mark()} ${chalk.bold("aem-eds-kit")}`;
38
+ }
39
+ function dotsStatic() {
40
+ return Array.from({ length: DOTS_N }, () => brand.accent("\u25CF")).join(" ");
41
+ }
42
+ function dotsFrame(step) {
43
+ const period = DOTS_N * 2 - 2;
44
+ const phase = step % period;
45
+ const lit = phase < DOTS_N ? phase : period - phase;
46
+ return Array.from({ length: DOTS_N }, (_, i) => {
47
+ const d = Math.abs(i - lit);
48
+ if (d === 0) return chalk.hex("#ff8a66").bold("\u25CF");
49
+ if (d === 1) return brand.accent("\u25CF");
50
+ return chalk.hex("#7a3a2a")("\u25CF");
51
+ }).join(" ");
52
+ }
53
+ function brandLine(dots, tagline) {
54
+ return `${lockup()} ${dots} ${chalk.dim(tagline)}`;
100
55
  }
101
56
  function hexToRgb(hex) {
102
57
  const h = hex.replace("#", "");
@@ -121,34 +76,35 @@ function gradientLine(line, stops, width) {
121
76
  if (ch === " ") return ch;
122
77
  const seg = i / span * (stops.length - 1);
123
78
  const idx = Math.min(Math.floor(seg), stops.length - 2);
124
- return chalk2.hex(mix(stops[idx], stops[idx + 1], seg - idx))(ch);
79
+ return chalk.hex(mix(stops[idx], stops[idx + 1], seg - idx))(ch);
125
80
  }).join("");
126
81
  }
127
- function logo(tagline = "AEM Edge Delivery \xD7 Figma") {
82
+ function logoArt() {
128
83
  const width = columnWidth(LOGO_ART);
129
- const art = LOGO_ART.map((row) => ` ${gradientLine(row, LOGO_STOPS, width)}`).join("\n");
130
- const dots = Array.from({ length: 5 }, () => brand.accent("\u25CF")).join(" ");
84
+ return LOGO_ART.map((row) => ` ${gradientLine(row, LOGO_STOPS, width)}`).join("\n");
85
+ }
86
+ function logo(tagline = "AEM Edge Delivery Services") {
131
87
  return `
132
- ${art}
88
+ ${logoArt()}
133
89
 
134
- ${lockup()} ${dots} ${chalk2.dim(tagline)}
90
+ ${brandLine(dotsStatic(), tagline)}
135
91
  `;
136
92
  }
137
93
  function heading(title, subtitle) {
138
94
  const bar = brand.red("\u258A");
139
- const sub = subtitle ? ` ${chalk2.dim(subtitle)}` : "";
95
+ const sub = subtitle ? ` ${chalk.dim(subtitle)}` : "";
140
96
  return `
141
- ${bar} ${chalk2.bold(title)}${sub}
97
+ ${bar} ${chalk.bold(title)}${sub}
142
98
  `;
143
99
  }
144
100
  function statusLine(status, name, message, nameWidth = 0) {
145
101
  const padded = nameWidth ? padEndVisible(name, nameWidth) : name;
146
- const msg = message ? ` ${chalk2.dim(message)}` : "";
102
+ const msg = message ? ` ${chalk.dim(message)}` : "";
147
103
  return ` ${icon[status]} ${padded}${msg}`;
148
104
  }
149
105
  function accentLine(name, message, nameWidth = 0) {
150
106
  const padded = nameWidth ? padEndVisible(name, nameWidth) : name;
151
- const msg = message ? ` ${chalk2.dim(message)}` : "";
107
+ const msg = message ? ` ${chalk.dim(message)}` : "";
152
108
  return ` ${brand.accent("\u2714")} ${padded}${msg}`;
153
109
  }
154
110
  function columnWidth(items) {
@@ -169,47 +125,48 @@ function summary(counts) {
169
125
  if (counts.warn) parts.push(`${icon.warn} ${counts.warn} ${plural(counts.warn, "warning")}`);
170
126
  if (counts.fail) parts.push(`${icon.fail} ${counts.fail} failed`);
171
127
  if (counts.info) parts.push(`${icon.info} ${counts.info} info`);
172
- return parts.join(chalk2.dim(" "));
128
+ return parts.join(chalk.dim(" "));
173
129
  }
174
130
  function plural(n, word) {
175
131
  return n === 1 ? word : `${word}s`;
176
132
  }
177
- var brand, icon, ANSI, LOGO_ART, LOGO_STOPS;
133
+ var brand, icon, ANSI, DOTS_N, LOGO_ART, LOGO_STOPS;
178
134
  var init_ui = __esm({
179
135
  "src/lib/ui.ts"() {
180
136
  "use strict";
181
137
  init_esm_shims();
182
138
  brand = {
183
139
  // Warm sweep for the logo wordmark (red → ember → orange)
184
- red: chalk2.hex("#FA0F00"),
185
- ember: chalk2.hex("#FF4B1F"),
186
- orange: chalk2.hex("#FF7B00"),
140
+ red: chalk.hex("#FA0F00"),
141
+ ember: chalk.hex("#FF4B1F"),
142
+ orange: chalk.hex("#FF7B00"),
187
143
  // Accent
188
- blue: chalk2.hex("#2680EB"),
144
+ blue: chalk.hex("#2680EB"),
189
145
  // Signature accent (matches the landing's `#FF5A36`)
190
- accent: chalk2.hex("#ff5a36"),
146
+ accent: chalk.hex("#ff5a36"),
191
147
  // Five-colour dot mark (the CLI signature)
192
- dotOrange: chalk2.hex("#F24E1E"),
193
- dotPurple: chalk2.hex("#A259FF"),
194
- dotBlue: chalk2.hex("#1ABCFE"),
195
- dotGreen: chalk2.hex("#0ACF83"),
196
- dotPink: chalk2.hex("#FF7262"),
148
+ dotOrange: chalk.hex("#F24E1E"),
149
+ dotPurple: chalk.hex("#A259FF"),
150
+ dotBlue: chalk.hex("#1ABCFE"),
151
+ dotGreen: chalk.hex("#0ACF83"),
152
+ dotPink: chalk.hex("#FF7262"),
197
153
  // Semantic roles
198
- ok: chalk2.hex("#2D9D78"),
199
- warn: chalk2.hex("#E68619"),
200
- err: chalk2.hex("#D7373F"),
201
- info: chalk2.hex("#2680EB")
154
+ ok: chalk.hex("#2D9D78"),
155
+ warn: chalk.hex("#E68619"),
156
+ err: chalk.hex("#D7373F"),
157
+ info: chalk.hex("#2680EB")
202
158
  };
203
159
  icon = {
204
160
  pass: brand.ok("\u2713"),
205
161
  warn: brand.warn("\u26A0"),
206
162
  fail: brand.err("\u2717"),
207
163
  info: brand.info("\u2139"),
208
- bullet: chalk2.dim("\u2022"),
209
- arrow: chalk2.dim("\u21B3"),
164
+ bullet: chalk.dim("\u2022"),
165
+ arrow: chalk.dim("\u21B3"),
210
166
  figma: brand.dotPurple("\u25C6")
211
167
  };
212
168
  ANSI = /\[[0-9;]*m/g;
169
+ DOTS_N = 5;
213
170
  LOGO_ART = [
214
171
  "\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588",
215
172
  "\u2588 \u2588 \u2588 \u2588 ",
@@ -221,6 +178,96 @@ var init_ui = __esm({
221
178
  }
222
179
  });
223
180
 
181
+ // src/lib/logger.ts
182
+ import chalk2 from "chalk";
183
+ function getLevel() {
184
+ const env = process.env.EDS_LOG_LEVEL?.toLowerCase();
185
+ if (env && env in LEVEL_ORDER) return env;
186
+ return "info";
187
+ }
188
+ function shouldLog(level) {
189
+ if (quiet) return level === "error";
190
+ return LEVEL_ORDER[level] >= LEVEL_ORDER[currentLevel];
191
+ }
192
+ var LEVEL_ORDER, currentLevel, quiet, logoShown, logger;
193
+ var init_logger = __esm({
194
+ "src/lib/logger.ts"() {
195
+ "use strict";
196
+ init_esm_shims();
197
+ init_ui();
198
+ LEVEL_ORDER = {
199
+ debug: 0,
200
+ info: 1,
201
+ warn: 2,
202
+ error: 3,
203
+ silent: 4
204
+ };
205
+ currentLevel = getLevel();
206
+ quiet = false;
207
+ logoShown = false;
208
+ logger = {
209
+ setLevel(level) {
210
+ currentLevel = level;
211
+ },
212
+ setQuiet(q) {
213
+ quiet = q;
214
+ },
215
+ debug(...args) {
216
+ if (shouldLog("debug")) console.error(chalk2.gray("[debug]"), ...args);
217
+ },
218
+ info(...args) {
219
+ if (shouldLog("info")) console.error(...args);
220
+ },
221
+ /**
222
+ * Print the brand logo at most once per process. The interactive menu and
223
+ * every command call this, so running a command directly shows the logo,
224
+ * while picking it from the menu (which already showed it) doesn't repeat it.
225
+ */
226
+ logoOnce(art) {
227
+ if (logoShown) return;
228
+ logoShown = true;
229
+ if (shouldLog("info")) console.error(art);
230
+ },
231
+ /**
232
+ * Like {@link logoOnce}, but animates the five accent dots on an interactive
233
+ * TTY: a highlight bounces across them before settling. Falls back to the
234
+ * static logo when piped, when `--no-color` is set, or when logging is quiet.
235
+ * Used at the interactive entry points (menu, `block from-design`).
236
+ */
237
+ async logoOnceAnimated(tagline) {
238
+ if (logoShown) return;
239
+ logoShown = true;
240
+ if (!shouldLog("info")) return;
241
+ const out = process.stderr;
242
+ if (!out.isTTY || chalk2.level === 0) {
243
+ console.error(logo(tagline));
244
+ return;
245
+ }
246
+ out.write(`
247
+ ${logoArt()}
248
+
249
+ `);
250
+ const frames = 16;
251
+ for (let step = 0; step < frames; step++) {
252
+ out.write(`\r\x1B[K ${brandLine(dotsFrame(step), tagline)}`);
253
+ await new Promise((r) => setTimeout(r, 70));
254
+ }
255
+ out.write(`\r\x1B[K ${brandLine(dotsStatic(), tagline)}
256
+ `);
257
+ },
258
+ success(...args) {
259
+ if (shouldLog("info")) console.error(chalk2.green("\u2713"), ...args);
260
+ },
261
+ warn(...args) {
262
+ if (shouldLog("warn")) console.error(chalk2.yellow("\u26A0"), ...args);
263
+ },
264
+ error(...args) {
265
+ if (shouldLog("error")) console.error(chalk2.red("\u2717"), ...args);
266
+ }
267
+ };
268
+ }
269
+ });
270
+
224
271
  // src/lib/schemas.ts
225
272
  import { z } from "zod";
226
273
  var figmaUrlSchema, edsConfigSchema, edsProjectSchema, edsMetaSchema, kebabCaseRegex;
@@ -1575,7 +1622,7 @@ async function blockFromDesign(figmaUrlArg, optionsArg) {
1575
1622
  process.exitCode = 1;
1576
1623
  return;
1577
1624
  }
1578
- logger.logoOnce(logo("Design \u2192 EDS block"));
1625
+ await logger.logoOnceAnimated("Design \u2192 EDS block");
1579
1626
  let designUrl = figmaUrlArg;
1580
1627
  let options = optionsArg;
1581
1628
  if (!designUrl) {
@@ -4005,7 +4052,7 @@ async function listBlockNames(projectRoot) {
4005
4052
  }
4006
4053
  async function mainMenu() {
4007
4054
  const { select, input } = await import("@inquirer/prompts");
4008
- logger.logoOnce(logo("What do you want to do?"));
4055
+ await logger.logoOnceAnimated("What do you want to do?");
4009
4056
  const action = await select({
4010
4057
  message: "Choose an action",
4011
4058
  choices: [
@@ -4103,18 +4150,89 @@ var init_menu = __esm({
4103
4150
  init_logger();
4104
4151
  init_project();
4105
4152
  init_schemas();
4106
- init_ui();
4107
4153
  }
4108
4154
  });
4109
4155
 
4110
4156
  // src/bin/eds.ts
4111
4157
  init_esm_shims();
4112
- init_logger();
4113
- init_ui();
4114
4158
  import chalk14 from "chalk";
4115
4159
  import { Command } from "commander";
4160
+
4161
+ // package.json
4162
+ var package_default = {
4163
+ name: "aem-eds-kit",
4164
+ version: "0.4.1",
4165
+ description: "CLI for AEM Edge Delivery Services with Figma MCP integration",
4166
+ type: "module",
4167
+ engines: {
4168
+ node: ">=20"
4169
+ },
4170
+ bin: {
4171
+ eds: "dist/bin/eds.js"
4172
+ },
4173
+ main: "./dist/index.js",
4174
+ types: "./dist/index.d.ts",
4175
+ files: [
4176
+ "dist",
4177
+ "CHANGELOG.md"
4178
+ ],
4179
+ scripts: {
4180
+ dev: "tsx src/bin/eds.ts",
4181
+ build: "tsup",
4182
+ test: "vitest run",
4183
+ "test:watch": "vitest",
4184
+ lint: "biome check src/ tests/",
4185
+ "lint:fix": "biome check --write src/ tests/",
4186
+ typecheck: "tsc --noEmit",
4187
+ prepare: "git config core.hooksPath .githooks || true",
4188
+ prepublishOnly: "npm run build"
4189
+ },
4190
+ keywords: [
4191
+ "aem",
4192
+ "edge-delivery-services",
4193
+ "helix",
4194
+ "figma",
4195
+ "mcp",
4196
+ "cli",
4197
+ "adobe"
4198
+ ],
4199
+ author: "Piotr Godycki <piotrgodycki@yahoo.com>",
4200
+ license: "MIT",
4201
+ repository: {
4202
+ type: "git",
4203
+ url: "git+https://github.com/piotrgodycki/aem-eds-kit.git"
4204
+ },
4205
+ homepage: "https://piotrgodycki.github.io/aem-eds-kit/",
4206
+ bugs: {
4207
+ url: "https://github.com/piotrgodycki/aem-eds-kit/issues"
4208
+ },
4209
+ dependencies: {
4210
+ "@inquirer/prompts": "^7.0.0",
4211
+ chalk: "^5.4.0",
4212
+ commander: "^13.0.0",
4213
+ execa: "^9.5.0",
4214
+ ora: "^8.1.0",
4215
+ yaml: "^2.6.0",
4216
+ zod: "^3.24.0"
4217
+ },
4218
+ devDependencies: {
4219
+ "@biomejs/biome": "^1.9.0",
4220
+ "@types/node": "^22.0.0",
4221
+ tsup: "^8.3.0",
4222
+ tsx: "^4.19.0",
4223
+ typescript: "^5.7.0",
4224
+ vitest: "^2.1.0"
4225
+ },
4226
+ optionalDependencies: {
4227
+ "@modelcontextprotocol/sdk": "^1.29.0"
4228
+ }
4229
+ };
4230
+
4231
+ // src/bin/eds.ts
4232
+ init_logger();
4233
+ init_ui();
4116
4234
  var program = new Command();
4117
- program.name("eds").description("CLI for AEM Edge Delivery Services with Figma integration").version("0.4.0").option("--verbose", "Enable verbose output").option("--quiet", "Suppress non-error output").option("--json", "Output in JSON format").option("--no-color", "Disable color output").showHelpAfterError("(add --help for usage)").hook("preAction", (thisCommand) => {
4235
+ program.name("eds").description("CLI for AEM Edge Delivery Services with Figma integration").version(package_default.version).option("--verbose", "Enable verbose output").option("--quiet", "Suppress non-error output").option("--json", "Output in JSON format").option("--no-color", "Disable color output").showHelpAfterError("(add --help for usage)").hook("preAction", (thisCommand) => {
4118
4236
  const opts = thisCommand.opts();
4119
4237
  if (opts.verbose) logger.setLevel("debug");
4120
4238
  if (opts.quiet) logger.setQuiet(true);