aem-eds-kit 0.4.7 → 0.4.9

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../src/lib/ui.ts","../../src/lib/logger.ts","../../src/lib/schemas.ts","../../src/lib/project.ts","../../src/lib/scaffold/ci.ts","../../src/lib/scaffold/fstab.ts","../../src/lib/scaffold/blocks.ts","../../src/lib/scaffold/ue.ts","../../src/commands/scaffold.ts","../../src/commands/init.ts","../../src/commands/block/create.ts","../../src/lib/agents/detect.ts","../../src/lib/agents/invoke.ts","../../src/lib/config.ts","../../src/lib/figma/node-id.ts","../../src/lib/figma/prompt-builder.ts","../../src/lib/preview/harness.ts","../../src/lib/preview/server.ts","../../src/commands/block/preview.ts","../../src/commands/block/from-design.ts","../../src/commands/block/list.ts","../../src/lib/integrations.ts","../../src/commands/integrate.ts","../../src/commands/figma/setup.ts","../../src/commands/doctor.ts","../../src/commands/audit-loading.ts","../../src/commands/audit-security.ts","../../src/lib/admin-api.ts","../../src/commands/preview.ts","../../src/commands/publish.ts","../../src/commands/admin.ts","../../src/commands/menu.ts","../../src/bin/eds.ts","../../package.json"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import chalk from \"chalk\";\n\n/**\n * Shared presentation layer for the eds CLI.\n *\n * The CLI's own visual identity: a warm red→orange wordmark, a blue accent,\n * and a five-colour dot mark. Everything funnels through `chalk`, so\n * `--no-color` (which sets `chalk.level = 0`) transparently strips every\n * style defined here.\n */\n\n// ── Brand palette ──────────────────────────────────────────────\n//\n// The CLI's own palette: a warm red→orange sweep for the wordmark, a blue\n// accent, and a five-colour dot mark for the signature. Names are neutral -\n// the product's identity is its own.\n\nexport const brand = {\n\t// Warm sweep for the logo wordmark (red → ember → orange)\n\tred: chalk.hex(\"#FA0F00\"),\n\tember: chalk.hex(\"#FF4B1F\"),\n\torange: chalk.hex(\"#FF7B00\"),\n\t// Accent\n\tblue: chalk.hex(\"#2680EB\"),\n\t// Signature accent (matches the landing's `#FF5A36`)\n\taccent: chalk.hex(\"#ff5a36\"),\n\t// Five-colour dot mark (the CLI signature)\n\tdotOrange: chalk.hex(\"#F24E1E\"),\n\tdotPurple: chalk.hex(\"#A259FF\"),\n\tdotBlue: chalk.hex(\"#1ABCFE\"),\n\tdotGreen: chalk.hex(\"#0ACF83\"),\n\tdotPink: chalk.hex(\"#FF7262\"),\n\t// Semantic roles\n\tok: chalk.hex(\"#2D9D78\"),\n\twarn: chalk.hex(\"#E68619\"),\n\terr: chalk.hex(\"#D7373F\"),\n\tinfo: chalk.hex(\"#2680EB\"),\n};\n\n// ── Status icons ───────────────────────────────────────────────\n\nexport type Status = \"pass\" | \"warn\" | \"fail\" | \"info\";\n\nexport const icon = {\n\tpass: brand.ok(\"✓\"),\n\twarn: brand.warn(\"⚠\"),\n\tfail: brand.err(\"✗\"),\n\tinfo: brand.info(\"ℹ\"),\n\tbullet: chalk.dim(\"•\"),\n\tarrow: chalk.dim(\"↳\"),\n\tfigma: brand.dotPurple(\"◆\"),\n};\n\nexport function statusIcon(status: Status): string {\n\treturn icon[status];\n}\n\n// ── ANSI-aware width helpers ───────────────────────────────────\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: matching ANSI escapes\nconst ANSI = /\u001b\\[[0-9;]*m/g;\n\n/** Visible length of a string, ignoring ANSI colour codes. */\nexport function visibleLength(s: string): number {\n\treturn s.replace(ANSI, \"\").length;\n}\n\n/** Pad a (possibly coloured) string to a visible width. */\nexport function padEndVisible(s: string, width: number): string {\n\tconst pad = width - visibleLength(s);\n\treturn pad > 0 ? s + \" \".repeat(pad) : s;\n}\n\n// ── Building blocks ────────────────────────────────────────────\n\n/**\n * The CLI signature: five Figma-coloured dots, the wordmark, and a tagline.\n * Printed once at the top of long-running / interactive commands.\n */\n/**\n * The `>_` brand mark - a dark glyph on a warm tile. Matches the landing's\n * logo lockup so the CLI and the site read as the same product. With\n * `--no-color` chalk strips the tile and it degrades to plain ` >_ `.\n */\nexport function mark(): string {\n\treturn chalk.bgHex(\"#ff5a36\").hex(\"#0d0d0c\").bold(\" >_ \");\n}\n\n/** Compact brand lockup: the `>_` tile and the wordmark. */\nexport function lockup(): string {\n\treturn `${mark()} ${chalk.bold(\"aem-eds-kit\")}`;\n}\n\n// ── Five-dot signature ─────────────────────────────────────────\n\nconst DOTS_N = 5;\n\n/** The static five accent dots. */\nexport function dotsStatic(): string {\n\treturn Array.from({ length: DOTS_N }, () => brand.accent(\"●\")).join(\" \");\n}\n\n/**\n * One frame of the dot animation: a highlight bounces left↔right across the\n * five dots, trailing a dimmer glow. Driven by `logger.logoOnceAnimated`.\n */\nexport function dotsFrame(step: number): string {\n\tconst period = DOTS_N * 2 - 2; // bounce without repeating the endpoints\n\tconst phase = step % period;\n\tconst lit = phase < DOTS_N ? phase : period - phase;\n\treturn Array.from({ length: DOTS_N }, (_, i) => {\n\t\tconst d = Math.abs(i - lit);\n\t\tif (d === 0) return chalk.hex(\"#ff8a66\").bold(\"●\");\n\t\tif (d === 1) return brand.accent(\"●\");\n\t\treturn chalk.hex(\"#7a3a2a\")(\"●\");\n\t}).join(\" \");\n}\n\n/** The brand line (lockup + dots + tagline) with a given dots string. */\nexport function brandLine(dots: string, tagline: string): string {\n\treturn `${lockup()} ${dots} ${chalk.dim(tagline)}`;\n}\n\nexport function banner(tagline = \"AEM Edge Delivery Services\"): string {\n\treturn `\\n ${brandLine(dotsStatic(), tagline)}\\n`;\n}\n\n// ── Truecolor gradient helpers (for the ANSI art logo) ─────────\n\nfunction hexToRgb(hex: string): [number, number, number] {\n\tconst h = hex.replace(\"#\", \"\");\n\treturn [\n\t\tNumber.parseInt(h.slice(0, 2), 16),\n\t\tNumber.parseInt(h.slice(2, 4), 16),\n\t\tNumber.parseInt(h.slice(4, 6), 16),\n\t];\n}\n\nfunction mix(a: string, b: string, t: number): string {\n\tconst [ar, ag, ab] = hexToRgb(a);\n\tconst [br, bg, bb] = hexToRgb(b);\n\tconst r = Math.round(ar + (br - ar) * t);\n\tconst g = Math.round(ag + (bg - ag) * t);\n\tconst bl = Math.round(ab + (bb - ab) * t);\n\treturn `#${[r, g, bl].map((n) => n.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/** Colour each visible column of a line along a multi-stop gradient. */\nfunction gradientLine(line: string, stops: string[], width: number): string {\n\tconst chars = [...line];\n\tconst span = Math.max(width - 1, 1);\n\treturn chars\n\t\t.map((ch, i) => {\n\t\t\tif (ch === \" \") return ch;\n\t\t\tconst seg = (i / span) * (stops.length - 1);\n\t\t\tconst idx = Math.min(Math.floor(seg), stops.length - 2);\n\t\t\treturn chalk.hex(mix(stops[idx], stops[idx + 1], seg - idx))(ch);\n\t\t})\n\t\t.join(\"\");\n}\n\n// Bold 5-row block wordmark \"EDS\".\nconst LOGO_ART = [\n\t\"█████ ████ █████\",\n\t\"█ █ █ █ \",\n\t\"████ █ █ █████\",\n\t\"█ █ █ █\",\n\t\"█████ ████ █████\",\n];\n// Warm sweep, applied column-by-column for a smooth truecolor gradient.\nconst LOGO_STOPS = [\"#ff3b1e\", \"#ff5a36\", \"#ff7d52\"];\n\n/**\n * The full EDS wordmark — bold block-letter ANSI art with a smooth truecolor\n * warm sweep, the five-dot mark, and a tagline. Use at the top of entry\n * points (help, setup wizard, the Figma / security flows) where a strong\n * signature earns its vertical space; prefer the compact {@link banner} inside\n * routine commands. Degrades gracefully: with `--no-color` the art prints as\n * plain blocks.\n */\n/** The gradient \"EDS\" ANSI art block (indented, no trailing newline). */\nexport function logoArt(): string {\n\tconst width = columnWidth(LOGO_ART);\n\treturn LOGO_ART.map((row) => ` ${gradientLine(row, LOGO_STOPS, width)}`).join(\"\\n\");\n}\n\nexport function logo(tagline = \"AEM Edge Delivery Services\"): string {\n\treturn `\\n${logoArt()}\\n\\n ${brandLine(dotsStatic(), tagline)}\\n`;\n}\n\n/** A section heading with a red accent bar. */\nexport function heading(title: string, subtitle?: string): string {\n\tconst bar = brand.red(\"▊\");\n\tconst sub = subtitle ? ` ${chalk.dim(subtitle)}` : \"\";\n\treturn `\\n${bar} ${chalk.bold(title)}${sub}\\n`;\n}\n\n/** A dimmed horizontal rule. */\nexport function divider(width = 56): string {\n\treturn chalk.dim(\"─\".repeat(width));\n}\n\n/** A `label: value` row with the label dimmed. */\nexport function kv(label: string, value: string, labelWidth = 0): string {\n\tconst l = chalk.dim(`${label}`);\n\tconst padded = labelWidth ? padEndVisible(l, labelWidth) : l;\n\treturn ` ${padded} ${value}`;\n}\n\n/**\n * A single status line: icon, name (padded to a shared column), then a\n * dimmed message. Pass `nameWidth` from `columnWidth(names)` to align a list.\n */\nexport function statusLine(status: Status, name: string, message?: string, nameWidth = 0): string {\n\tconst padded = nameWidth ? padEndVisible(name, nameWidth) : name;\n\tconst msg = message ? ` ${chalk.dim(message)}` : \"\";\n\treturn ` ${icon[status]} ${padded}${msg}`;\n}\n\n/**\n * A summary line with the brand-accent `✔` (matches the landing page), rather\n * than the semantic green pass tick. Use for wizard summaries / brand moments.\n */\nexport function accentLine(name: string, message?: string, nameWidth = 0): string {\n\tconst padded = nameWidth ? padEndVisible(name, nameWidth) : name;\n\tconst msg = message ? ` ${chalk.dim(message)}` : \"\";\n\treturn ` ${brand.accent(\"✔\")} ${padded}${msg}`;\n}\n\n/** Widest visible length in a list of strings — use for column alignment. */\nexport function columnWidth(items: string[]): number {\n\treturn items.reduce((max, s) => Math.max(max, visibleLength(s)), 0);\n}\n\n/**\n * A rounded box around pre-formatted lines. Used for end-of-command summaries.\n * `accent` colours the border (defaults to red).\n */\nexport function box(lines: string[], accent = brand.red): string {\n\tconst inner = columnWidth(lines);\n\tconst top = accent(`╭${\"─\".repeat(inner + 2)}╮`);\n\tconst bot = accent(`╰${\"─\".repeat(inner + 2)}╯`);\n\tconst body = lines\n\t\t.map((l) => `${accent(\"│\")} ${padEndVisible(l, inner)} ${accent(\"│\")}`)\n\t\t.join(\"\\n\");\n\treturn `${top}\\n${body}\\n${bot}`;\n}\n\n/**\n * A tallied summary line like `✓ 12 passed ⚠ 3 warnings ✗ 1 failed`.\n * Zero-count segments are omitted.\n */\nexport function summary(counts: {\n\tpass?: number;\n\twarn?: number;\n\tfail?: number;\n\tinfo?: number;\n}): string {\n\tconst parts: string[] = [];\n\tif (counts.pass) parts.push(`${icon.pass} ${counts.pass} passed`);\n\tif (counts.warn) parts.push(`${icon.warn} ${counts.warn} ${plural(counts.warn, \"warning\")}`);\n\tif (counts.fail) parts.push(`${icon.fail} ${counts.fail} failed`);\n\tif (counts.info) parts.push(`${icon.info} ${counts.info} info`);\n\treturn parts.join(chalk.dim(\" \"));\n}\n\nfunction plural(n: number, word: string): string {\n\treturn n === 1 ? word : `${word}s`;\n}\n","import chalk from \"chalk\";\nimport * as ui from \"./ui.js\";\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n\tdebug: 0,\n\tinfo: 1,\n\twarn: 2,\n\terror: 3,\n\tsilent: 4,\n};\n\nfunction getLevel(): LogLevel {\n\tconst env = process.env.EDS_LOG_LEVEL?.toLowerCase();\n\tif (env && env in LEVEL_ORDER) return env as LogLevel;\n\treturn \"info\";\n}\n\nlet currentLevel: LogLevel = getLevel();\nlet quiet = false;\nlet logoShown = false;\n\nfunction shouldLog(level: LogLevel): boolean {\n\tif (quiet) return level === \"error\";\n\treturn LEVEL_ORDER[level] >= LEVEL_ORDER[currentLevel];\n}\n\nexport const logger = {\n\tsetLevel(level: LogLevel) {\n\t\tcurrentLevel = level;\n\t},\n\tsetQuiet(q: boolean) {\n\t\tquiet = q;\n\t},\n\n\tdebug(...args: unknown[]) {\n\t\tif (shouldLog(\"debug\")) console.error(chalk.gray(\"[debug]\"), ...args);\n\t},\n\tinfo(...args: unknown[]) {\n\t\tif (shouldLog(\"info\")) console.error(...args);\n\t},\n\t/**\n\t * Print the brand logo at most once per process. The interactive menu and\n\t * every command call this, so running a command directly shows the logo,\n\t * while picking it from the menu (which already showed it) doesn't repeat it.\n\t */\n\tlogoOnce(art: string) {\n\t\tif (logoShown) return;\n\t\tlogoShown = true;\n\t\tif (shouldLog(\"info\")) console.error(art);\n\t},\n\n\t/**\n\t * Like {@link logoOnce}, but animates the five accent dots on an interactive\n\t * TTY: a highlight bounces across them before settling. Falls back to the\n\t * static logo when piped, when `--no-color` is set, or when logging is quiet.\n\t * Used at the interactive entry points (menu, `block from-design`).\n\t */\n\tasync logoOnceAnimated(tagline: string) {\n\t\tif (logoShown) return;\n\t\tlogoShown = true;\n\t\tif (!shouldLog(\"info\")) return;\n\t\tconst out = process.stderr;\n\t\tif (!out.isTTY || chalk.level === 0) {\n\t\t\tconsole.error(ui.logo(tagline));\n\t\t\treturn;\n\t\t}\n\t\tout.write(`\\n${ui.logoArt()}\\n\\n`);\n\t\tconst caret = (on: boolean) => (on ? ui.brand.accent(\"▌\") : \" \");\n\t\t// Sweep: the dot highlight bounces while an accent caret blinks at the\n\t\t// end of the line.\n\t\tconst sweep = 14;\n\t\tfor (let step = 0; step < sweep; step++) {\n\t\t\tout.write(`\\r\\x1b[K ${ui.brandLine(ui.dotsFrame(step), tagline)} ${caret(step % 2 === 0)}`);\n\t\t\tawait new Promise((r) => setTimeout(r, 70));\n\t\t}\n\t\t// Settle the dots, then a few idle blinks of the caret.\n\t\tfor (let b = 0; b < 4; b++) {\n\t\t\tout.write(`\\r\\x1b[K ${ui.brandLine(ui.dotsStatic(), tagline)} ${caret(b % 2 === 0)}`);\n\t\t\tawait new Promise((r) => setTimeout(r, 200));\n\t\t}\n\t\tout.write(`\\r\\x1b[K ${ui.brandLine(ui.dotsStatic(), tagline)}\\n`);\n\t},\n\tsuccess(...args: unknown[]) {\n\t\tif (shouldLog(\"info\")) console.error(chalk.green(\"✓\"), ...args);\n\t},\n\twarn(...args: unknown[]) {\n\t\tif (shouldLog(\"warn\")) console.error(chalk.yellow(\"⚠\"), ...args);\n\t},\n\terror(...args: unknown[]) {\n\t\tif (shouldLog(\"error\")) console.error(chalk.red(\"✗\"), ...args);\n\t},\n};\n","import { z } from \"zod\";\n\nexport const figmaUrlSchema = z.object({\n\tfileKey: z.string().min(1),\n\tnodeId: z.string().optional(),\n\tfileName: z.string().optional(),\n});\n\nexport const edsConfigSchema = z.object({\n\tagent: z.enum([\"claude\", \"cursor\", \"codex\"]).optional(),\n\tfigma: z\n\t\t.object({\n\t\t\tmcpEndpoint: z.string().url().optional(),\n\t\t\ttoken: z.string().optional(),\n\t\t})\n\t\t.optional(),\n\tadmin: z\n\t\t.object({\n\t\t\torg: z.string().optional(),\n\t\t\tsite: z.string().optional(),\n\t\t\tref: z.string().default(\"main\"),\n\t\t})\n\t\t.optional(),\n});\n\nexport const edsProjectSchema = z.object({\n\troot: z.string(),\n\thasFstab: z.boolean(),\n\thasBlocks: z.boolean(),\n\thasHeadHtml: z.boolean(),\n});\n\nexport const edsMetaSchema = z.object({\n\tfigmaFileKey: z.string(),\n\tfigmaNodeId: z.string().optional(),\n\tlastSyncedAt: z.string().datetime(),\n\tpromptVersion: z.string(),\n\tagentUsed: z.string().optional(),\n});\n\nexport const kebabCaseRegex = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\n\nexport type FigmaUrlParts = z.infer<typeof figmaUrlSchema>;\nexport type EdsConfig = z.infer<typeof edsConfigSchema>;\nexport type EdsProject = z.infer<typeof edsProjectSchema>;\nexport type EdsMeta = z.infer<typeof edsMetaSchema>;\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { EdsProject } from \"./schemas.js\";\nimport { edsProjectSchema } from \"./schemas.js\";\n\n/**\n * Files that mark an EDS/AEM project root. `fstab.yaml` is the classic\n * Franklin/Helix mountpoint, but Universal Editor / crosswalk and Document\n * Authoring projects often don't have one - so we also accept the EDS runtime\n * (`scripts/`), the document `head.html`, the UE config, and the crosswalk /\n * query maps. A directory counts as a root if it has ANY of these.\n */\nconst ROOT_MARKERS = [\n\t\"fstab.yaml\",\n\t\"head.html\",\n\t\"helix-query.yaml\",\n\t\"component-definition.json\",\n\t\"paths.json\",\n\t\"scripts/scripts.js\",\n\t\"scripts/aem.js\",\n];\n\n/**\n * Walk up from `startDir` looking for an EDS project root - the first ancestor\n * directory that contains any of {@link ROOT_MARKERS}.\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | undefined {\n\tlet dir = path.resolve(startDir);\n\tconst { root } = path.parse(dir);\n\n\twhile (dir !== root) {\n\t\tif (ROOT_MARKERS.some((m) => existsSync(path.join(dir, m)))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = path.dirname(dir);\n\t}\n\t// Also check the filesystem root itself (the loop stops before testing it).\n\tif (ROOT_MARKERS.some((m) => existsSync(path.join(root, m)))) return root;\n\treturn undefined;\n}\n\nexport function detectProject(rootDir: string): EdsProject {\n\treturn edsProjectSchema.parse({\n\t\troot: rootDir,\n\t\thasFstab: existsSync(path.join(rootDir, \"fstab.yaml\")),\n\t\thasBlocks: existsSync(path.join(rootDir, \"blocks\")),\n\t\thasHeadHtml: existsSync(path.join(rootDir, \"head.html\")),\n\t});\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/** Repo-relative path of the generated workflow. */\nexport const CI_WORKFLOW_PATH = \".github/workflows/eds.yml\";\n\n/**\n * GitHub Actions boilerplate for an EDS project: runs the project's own\n * lint/build (if defined) plus the eds audits as a PR gatekeeper. The audits\n * exit non-zero on problems, so a bad change fails the check.\n *\n * `if:` conditions are intentionally written without a `${{ }}` wrapper so this\n * template literal has no `${` sequences to escape.\n */\nexport const CI_WORKFLOW = `name: EDS checks\n\n# Generated by aem-eds-kit (\\`eds scaffold ci\\`). Runs the project's own\n# lint/build plus the eds audits as a gatekeeper on every PR and push to main.\non:\n pull_request:\n push:\n branches: [main]\n\njobs:\n checks:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-node@v4\n with:\n node-version: 20\n\n # Install project dependencies when the repo has them.\n - name: Install dependencies\n run: |\n if [ -f package-lock.json ]; then\n npm ci\n elif [ -f package.json ]; then\n npm install\n fi\n\n # The project's own scripts, if defined (skipped otherwise).\n - name: Lint\n if: hashFiles('package.json') != ''\n run: npm run lint --if-present\n - name: Build\n if: hashFiles('package.json') != ''\n run: npm run build --if-present\n\n # aem-eds-kit audits - run via npx, no install needed. Each exits\n # non-zero on failures, so a bad PR fails the check.\n - name: Project health (doctor)\n run: npx --yes aem-eds-kit@latest doctor\n - name: Loading & LCP budget\n run: npx --yes aem-eds-kit@latest audit loading\n - name: Security & exploit scan\n run: npx --yes aem-eds-kit@latest audit security\n`;\n\nexport interface CiScaffoldResult {\n\tpath: string;\n\tcreated: boolean;\n}\n\n/**\n * Write `.github/workflows/eds.yml` into the project. Never overwrites an\n * existing workflow - returns `created: false` so the caller can report it.\n */\nexport async function writeCiWorkflow(projectRoot: string): Promise<CiScaffoldResult> {\n\tconst file = path.join(projectRoot, \".github\", \"workflows\", \"eds.yml\");\n\tif (existsSync(file)) return { path: CI_WORKFLOW_PATH, created: false };\n\tawait mkdir(path.dirname(file), { recursive: true });\n\tawait writeFile(file, CI_WORKFLOW);\n\treturn { path: CI_WORKFLOW_PATH, created: true };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/** Authoring models `eds init` can set a project up for. */\nexport type Authoring = \"ue\" | \"da\" | \"gdrive\" | \"sharepoint\";\n\nexport const AUTHORING_NAMES: Record<Authoring, string> = {\n\tue: \"Universal Editor (crosswalk)\",\n\tda: \"Document Authoring (da.live)\",\n\tgdrive: \"Document Authoring (Google Drive)\",\n\tsharepoint: \"Document Authoring (SharePoint)\",\n};\n\n/**\n * Document-based models mount a content source via `fstab.yaml`; Universal\n * Editor / crosswalk authors in AEM and doesn't need one. So we only generate\n * fstab when it's actually required.\n */\nexport function needsFstab(a: Authoring): boolean {\n\treturn a !== \"ue\";\n}\n\n/** The DA (da.live) content mountpoint for an org/site. */\nexport function daMountpoint(org: string, site: string): string {\n\treturn `https://content.da.live/${org}/${site}/`;\n}\n\n/** Render an `fstab.yaml` that mounts `/` to a content source. */\nexport function fstabYaml(mountpoint: string): string {\n\treturn `mountpoints:\\n /: ${mountpoint}\\n`;\n}\n\n/**\n * Write `fstab.yaml`. `eds init` owns this file, so it overwrites the\n * boilerplate's placeholder mountpoint with the real one.\n */\nexport async function writeFstab(projectRoot: string, mountpoint: string): Promise<string> {\n\tawait writeFile(path.join(projectRoot, \"fstab.yaml\"), fstabYaml(mountpoint));\n\treturn \"fstab.yaml\";\n}\n\n/**\n * A minimal crosswalk `paths.json` mapping AEM content under\n * `/content/<site>/` to the site root. A sensible starting point - adjust the\n * mapping if your AEM content path differs.\n */\nexport function pathsJson(site: string): string {\n\treturn `${JSON.stringify(\n\t\t{\n\t\t\tmappings: [`/content/${site}/:/`],\n\t\t\tincludes: [`/content/${site}/`],\n\t\t},\n\t\tnull,\n\t\t2,\n\t)}\\n`;\n}\n\nexport async function writePaths(projectRoot: string, site: string): Promise<string> {\n\tawait writeFile(path.join(projectRoot, \"paths.json\"), pathsJson(site));\n\treturn \"paths.json\";\n}\n","/**\n * Standard block library, modelled on the AEM Block Collection. Each block is\n * self-contained: `<name>.js`, `<name>.css`, and a distributed `_<name>.json`\n * (definitions / models / filters) so it's authorable in the Universal Editor.\n * Container blocks (cards, columns, accordion) use the child-item multifield\n * pattern. Scaffolding registers each block id in the central `section` filter.\n */\n\nexport interface BlockTemplate {\n\tid: string;\n\ttitle: string;\n\tjs: string;\n\tcss: string;\n\t/** Contents of `_<name>.json`. */\n\tmodel: string;\n}\n\nfunction json(value: unknown): string {\n\treturn `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nconst blockDef = (title: string, id: string, model: string) => ({\n\ttitle,\n\tid,\n\tplugins: {\n\t\txwalk: {\n\t\t\tpage: {\n\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\ttemplate: { name: title, model },\n\t\t\t},\n\t\t},\n\t},\n});\n\nconst containerDef = (title: string, id: string, filter: string) => ({\n\ttitle,\n\tid,\n\tplugins: {\n\t\txwalk: {\n\t\t\tpage: {\n\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\ttemplate: { name: title, filter },\n\t\t\t},\n\t\t},\n\t},\n});\n\nconst itemDef = (title: string, id: string, model: string) => ({\n\ttitle,\n\tid,\n\tplugins: {\n\t\txwalk: {\n\t\t\tpage: {\n\t\t\t\tresourceType: \"core/franklin/components/block/v1/block/item\",\n\t\t\t\ttemplate: { name: title, model },\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport const STANDARD_BLOCKS: BlockTemplate[] = [\n\t// ── hero ──────────────────────────────────────────────\n\t{\n\t\tid: \"hero\",\n\t\ttitle: \"Hero\",\n\t\tjs: `// Block: hero\nexport default function decorate(block) {\n block.classList.add('hero');\n const picture = block.querySelector('picture');\n if (picture) picture.closest('div')?.classList.add('hero-image');\n}\n`,\n\t\tcss: `/* Block: hero */\n.hero {\n position: relative;\n display: grid;\n min-height: 60vh;\n align-content: center;\n}\n\n.hero .hero-image img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n}\n\n.hero h1,\n.hero p {\n max-width: 720px;\n margin: 0 auto;\n padding: 0 var(--spacing-m, 16px);\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [blockDef(\"Hero\", \"hero\", \"hero\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hero\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Alt\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"title\", label: \"Title\" },\n\t\t\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"text\", value: \"\", label: \"Text\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [],\n\t\t}),\n\t},\n\n\t// ── cards (container / multifield) ────────────────────\n\t{\n\t\tid: \"cards\",\n\t\ttitle: \"Cards\",\n\t\tjs: `// Block: cards\nexport default function decorate(block) {\n const ul = document.createElement('ul');\n [...block.children].forEach((row) => {\n const li = document.createElement('li');\n while (row.firstElementChild) li.append(row.firstElementChild);\n [...li.children].forEach((cell) => {\n cell.className = cell.querySelector('picture') ? 'cards-card-image' : 'cards-card-body';\n });\n ul.append(li);\n });\n block.textContent = '';\n block.append(ul);\n}\n`,\n\t\tcss: `/* Block: cards */\n.cards ul {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));\n gap: var(--spacing-m, 16px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.cards li {\n border: 1px solid var(--color-line, #e5e5e5);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.cards .cards-card-image img {\n width: 100%;\n aspect-ratio: 16 / 9;\n object-fit: cover;\n}\n\n.cards .cards-card-body {\n padding: var(--spacing-m, 16px);\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [containerDef(\"Cards\", \"cards\", \"cards\"), itemDef(\"Card\", \"card\", \"card\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"card\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Alt\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"title\", label: \"Title\" },\n\t\t\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"text\", value: \"\", label: \"Text\" },\n\t\t\t\t\t\t{ component: \"aem-content\", name: \"link\", label: \"Link\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [{ id: \"cards\", components: [\"card\"] }],\n\t\t}),\n\t},\n\n\t// ── columns ───────────────────────────────────────────\n\t{\n\t\tid: \"columns\",\n\t\ttitle: \"Columns\",\n\t\tjs: `// Block: columns\nexport default function decorate(block) {\n const cols = [...block.firstElementChild.children];\n block.classList.add(\\`columns-\\${cols.length}-cols\\`);\n [...block.children].forEach((row) => {\n [...row.children].forEach((col) => {\n const pic = col.querySelector('picture');\n if (pic && pic.closest('div') === col) col.classList.add('columns-img-col');\n });\n });\n}\n`,\n\t\tcss: `/* Block: columns */\n.columns > div {\n display: grid;\n gap: var(--spacing-l, 32px);\n}\n\n@media (width >= 900px) {\n .columns > div {\n grid-template-columns: repeat(var(--columns, 2), 1fr);\n }\n .columns-2-cols > div { --columns: 2; }\n .columns-3-cols > div { --columns: 3; }\n .columns-4-cols > div { --columns: 4; }\n}\n\n.columns img { width: 100%; height: auto; }\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [blockDef(\"Columns\", \"columns\", \"columns\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"columns\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcomponent: \"richtext\",\n\t\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t\t\tname: \"content\",\n\t\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\t\tlabel: \"Content\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [],\n\t\t}),\n\t},\n\n\t// ── accordion (container / <details>) ─────────────────\n\t{\n\t\tid: \"accordion\",\n\t\ttitle: \"Accordion\",\n\t\tjs: `// Block: accordion\nexport default function decorate(block) {\n [...block.children].forEach((row) => {\n const [label, body] = row.children;\n const details = document.createElement('details');\n const summary = document.createElement('summary');\n summary.className = 'accordion-item-label';\n if (label) summary.append(...label.childNodes);\n const content = document.createElement('div');\n content.className = 'accordion-item-body';\n if (body) content.append(...body.childNodes);\n details.append(summary, content);\n row.replaceWith(details);\n });\n}\n`,\n\t\tcss: `/* Block: accordion */\n.accordion details {\n border-bottom: 1px solid var(--color-line, #e5e5e5);\n}\n\n.accordion summary {\n cursor: pointer;\n padding: var(--spacing-m, 16px) 0;\n font-weight: 600;\n list-style: none;\n}\n\n.accordion summary::after { content: '+'; float: right; }\n.accordion details[open] summary::after { content: '−'; }\n\n.accordion .accordion-item-body {\n padding-bottom: var(--spacing-m, 16px);\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [\n\t\t\t\tcontainerDef(\"Accordion\", \"accordion\", \"accordion\"),\n\t\t\t\titemDef(\"Accordion Item\", \"accordion-item\", \"accordion-item\"),\n\t\t\t],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"accordion-item\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"label\", label: \"Label\" },\n\t\t\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"body\", value: \"\", label: \"Body\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [{ id: \"accordion\", components: [\"accordion-item\"] }],\n\t\t}),\n\t},\n\n\t// ── embed ─────────────────────────────────────────────\n\t{\n\t\tid: \"embed\",\n\t\ttitle: \"Embed\",\n\t\tjs: `// Block: embed\nexport default function decorate(block) {\n const link = block.querySelector('a');\n const url = link?.href;\n block.textContent = '';\n if (!url) return;\n const wrapper = document.createElement('div');\n wrapper.className = 'embed-wrapper';\n const iframe = document.createElement('iframe');\n iframe.src = url;\n iframe.loading = 'lazy';\n iframe.title = 'Embedded content';\n iframe.setAttribute('allow', 'encrypted-media; fullscreen');\n wrapper.append(iframe);\n block.append(wrapper);\n}\n`,\n\t\tcss: `/* Block: embed */\n.embed .embed-wrapper {\n position: relative;\n aspect-ratio: 16 / 9;\n}\n\n.embed iframe {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [blockDef(\"Embed\", \"embed\", \"embed\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"embed\",\n\t\t\t\t\tfields: [{ component: \"aem-content\", name: \"link\", label: \"Embed URL\" }],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [],\n\t\t}),\n\t},\n];\n\nexport function blockById(id: string): BlockTemplate | undefined {\n\treturn STANDARD_BLOCKS.find((b) => b.id === id);\n}\n","/**\n * Deterministic Universal Editor scaffolding: the default-content components\n * every UE/EDS project ships with, plus a `field-reference` block whose model\n * demonstrates all 17 UE field types and a multifield. No agent involved.\n *\n * Config is merged by id, so running this on an existing project adds what's\n * missing without clobbering your entries.\n */\n\n// ── Default-content components (core/franklin) ─────────────────\n\nexport const DEFAULT_CONTENT_DEFINITIONS = [\n\t{\n\t\ttitle: \"Text\",\n\t\tid: \"text\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/text/v1/text\",\n\t\t\t\t\ttemplate: { text: \"<p>Text</p>\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttitle: \"Image\",\n\t\tid: \"image\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/image/v1/image\",\n\t\t\t\t\ttemplate: { image: \"\", imageAlt: \"\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttitle: \"Button\",\n\t\tid: \"button\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/button/v1/button\",\n\t\t\t\t\ttemplate: { text: \"Button\", href: \"\", type: \"\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttitle: \"Title\",\n\t\tid: \"title\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/title/v1/title\",\n\t\t\t\t\ttemplate: { title: \"Title\", type: \"h2\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n];\n\nexport const DEFAULT_CONTENT_MODELS = [\n\t{\n\t\tid: \"title\",\n\t\tfields: [\n\t\t\t{ component: \"text\", valueType: \"string\", name: \"title\", label: \"Title\" },\n\t\t\t{\n\t\t\t\tcomponent: \"select\",\n\t\t\t\tvalueType: \"string\",\n\t\t\t\tname: \"type\",\n\t\t\t\tlabel: \"Type\",\n\t\t\t\tvalue: \"h2\",\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"H1\", value: \"h1\" },\n\t\t\t\t\t{ name: \"H2\", value: \"h2\" },\n\t\t\t\t\t{ name: \"H3\", value: \"h3\" },\n\t\t\t\t\t{ name: \"H4\", value: \"h4\" },\n\t\t\t\t\t{ name: \"H5\", value: \"h5\" },\n\t\t\t\t\t{ name: \"H6\", value: \"h6\" },\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: \"image\",\n\t\tfields: [\n\t\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image\", multi: false },\n\t\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Alt Text\" },\n\t\t],\n\t},\n\t{\n\t\tid: \"button\",\n\t\tfields: [\n\t\t\t{ component: \"text\", valueType: \"string\", name: \"text\", label: \"Text\" },\n\t\t\t{ component: \"aem-content\", name: \"href\", label: \"Link\" },\n\t\t\t{\n\t\t\t\tcomponent: \"select\",\n\t\t\t\tvalueType: \"string\",\n\t\t\t\tname: \"type\",\n\t\t\t\tlabel: \"Type\",\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"Default\", value: \"\" },\n\t\t\t\t\t{ name: \"Primary\", value: \"primary\" },\n\t\t\t\t\t{ name: \"Secondary\", value: \"secondary\" },\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n];\n\n// ── field-reference block: one of every UE field type + a multifield ──\n\n/** All 17 UE field component types, each shown once, plus a repeatable container. */\nexport function fieldReferenceFields(): Array<Record<string, unknown>> {\n\treturn [\n\t\t{ component: \"tab\", name: \"basics\", label: \"Basics\" },\n\t\t{ component: \"text\", valueType: \"string\", name: \"text\", label: \"Text (single line)\" },\n\t\t{\n\t\t\tcomponent: \"textarea\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"textarea\",\n\t\t\tlabel: \"Textarea (multi-line)\",\n\t\t},\n\t\t{ component: \"richtext\", valueType: \"string\", name: \"richtext\", value: \"\", label: \"Rich text\" },\n\t\t{ component: \"number\", valueType: \"number\", name: \"number\", label: \"Number\" },\n\t\t{ component: \"boolean\", valueType: \"boolean\", name: \"boolean\", value: false, label: \"Boolean\" },\n\t\t{ component: \"date-time\", valueType: \"date\", name: \"date\", label: \"Date / time\" },\n\t\t{ component: \"tab\", name: \"selection\", label: \"Selection\" },\n\t\t{\n\t\t\tcomponent: \"select\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"select\",\n\t\t\tlabel: \"Select\",\n\t\t\tvalue: \"a\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"Option A\", value: \"a\" },\n\t\t\t\t{ name: \"Option B\", value: \"b\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tcomponent: \"radio-group\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"radio\",\n\t\t\tlabel: \"Radio group\",\n\t\t\tvalue: \"x\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"X\", value: \"x\" },\n\t\t\t\t{ name: \"Y\", value: \"y\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tcomponent: \"multiselect\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"classes\",\n\t\t\tlabel: \"Multiselect (CSS classes)\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"Highlight\", value: \"highlight\" },\n\t\t\t\t{ name: \"Dark\", value: \"dark\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tcomponent: \"checkbox-group\",\n\t\t\tvalueType: \"string[]\",\n\t\t\tname: \"toggles\",\n\t\t\tlabel: \"Checkbox group\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"Show title\", value: \"show-title\" },\n\t\t\t\t{ name: \"Show image\", value: \"show-image\" },\n\t\t\t],\n\t\t},\n\t\t{ component: \"tab\", name: \"media\", label: \"Media & content\" },\n\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image (DAM asset)\" },\n\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Image alt\" },\n\t\t{ component: \"aem-content\", name: \"link\", label: \"Link (page / URL)\" },\n\t\t{ component: \"aem-content-fragment\", name: \"contentFragment\", label: \"Content Fragment\" },\n\t\t{\n\t\t\tcomponent: \"aem-experience-fragment\",\n\t\t\tname: \"experienceFragment\",\n\t\t\tlabel: \"Experience Fragment\",\n\t\t},\n\t\t{ component: \"aem-tag\", valueType: \"string\", name: \"tags\", label: \"Tags\" },\n\t\t{ component: \"tab\", name: \"repeatable\", label: \"Multifield\" },\n\t\t{\n\t\t\tcomponent: \"container\",\n\t\t\tname: \"items\",\n\t\t\tlabel: \"Items (repeatable)\",\n\t\t\tmulti: true,\n\t\t\tcollapsible: true,\n\t\t\tfields: [\n\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"itemTitle\", label: \"Title\" },\n\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"itemText\", value: \"\", label: \"Text\" },\n\t\t\t\t{ component: \"aem-content\", name: \"itemLink\", label: \"Link\" },\n\t\t\t],\n\t\t},\n\t];\n}\n\nexport const FIELD_REFERENCE_JS = `// Block: field-reference\n// A living reference of every Universal Editor field type (see _field-reference.json).\n// Authors use it to see what's available; delete it before launch.\nexport default function decorate(block) {\n // Default/document authoring hands the field values in as rows - nothing to\n // enhance here beyond a scoping class. In Universal Editor the fields above\n // are what you drop and edit.\n block.classList.add('field-reference');\n}\n`;\n\nexport const FIELD_REFERENCE_CSS = `/* Block: field-reference */\n.field-reference {\n display: grid;\n gap: var(--spacing-m, 16px);\n padding: var(--spacing-l, 32px) 0;\n}\n`;\n\nexport function fieldReferenceModelFile(): string {\n\tconst model = {\n\t\tdefinitions: [\n\t\t\t{\n\t\t\t\ttitle: \"Field Reference\",\n\t\t\t\tid: \"field-reference\",\n\t\t\t\tplugins: {\n\t\t\t\t\txwalk: {\n\t\t\t\t\t\tpage: {\n\t\t\t\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\t\t\t\ttemplate: { name: \"Field Reference\", model: \"field-reference\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmodels: [{ id: \"field-reference\", fields: fieldReferenceFields() }],\n\t\tfilters: [],\n\t};\n\treturn `${JSON.stringify(model, null, 2)}\\n`;\n}\n\n// ── Merge helpers (add-by-id, never clobber) ───────────────────\n\ninterface Identified {\n\tid: string;\n}\n\nexport function mergeById<T extends Identified>(existing: T[], additions: T[]): T[] {\n\tconst seen = new Set(existing.map((e) => e.id));\n\treturn [...existing, ...additions.filter((a) => !seen.has(a.id))];\n}\n\ninterface DefinitionGroup {\n\ttitle: string;\n\tid: string;\n\tcomponents: Identified[];\n}\ninterface Definitions {\n\tgroups: DefinitionGroup[];\n}\n\n/** Merge component definitions into groups (Default Content + Blocks). */\nexport function mergeDefinitions(\n\texisting: Definitions | null,\n\tdefaultContent: Identified[],\n\tblockDefs: Identified[],\n): Definitions {\n\tconst groups = existing?.groups ? [...existing.groups] : [];\n\tconst ensure = (id: string, title: string, comps: Identified[]) => {\n\t\tlet g = groups.find((x) => x.id === id);\n\t\tif (!g) {\n\t\t\tg = { id, title, components: [] };\n\t\t\tgroups.push(g);\n\t\t}\n\t\tg.components = mergeById(g.components, comps);\n\t};\n\tensure(\"default\", \"Default Content\", defaultContent);\n\tensure(\"blocks\", \"Blocks\", blockDefs);\n\treturn { groups };\n}\n\ninterface Filter {\n\tid: string;\n\tcomponents: string[];\n}\n\n/** Add component ids to the `section` filter (union). */\nexport function mergeSectionFilter(existing: Filter[] | null, ids: string[]): Filter[] {\n\tconst filters = existing ? [...existing] : [];\n\tlet section = filters.find((f) => f.id === \"section\");\n\tif (!section) {\n\t\tsection = { id: \"section\", components: [\"text\", \"image\", \"button\", \"title\"] };\n\t\tfilters.push(section);\n\t}\n\tsection.components = [...new Set([...section.components, ...ids])];\n\treturn filters;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { type BlockTemplate, STANDARD_BLOCKS, blockById } from \"../lib/scaffold/blocks.js\";\nimport { writeCiWorkflow } from \"../lib/scaffold/ci.js\";\nimport {\n\tDEFAULT_CONTENT_DEFINITIONS,\n\tDEFAULT_CONTENT_MODELS,\n\tFIELD_REFERENCE_CSS,\n\tFIELD_REFERENCE_JS,\n\tfieldReferenceModelFile,\n\tmergeById,\n\tmergeDefinitions,\n\tmergeSectionFilter,\n} from \"../lib/scaffold/ue.js\";\nimport * as ui from \"../lib/ui.js\";\n\n// biome-ignore lint/suspicious/noExplicitAny: config JSON is free-form\ntype Json = any;\n\nasync function readJson(file: string): Promise<Json | null> {\n\tif (!existsSync(file)) return null;\n\ttry {\n\t\treturn JSON.parse(await readFile(file, \"utf-8\"));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeJson(file: string, data: Json): Promise<void> {\n\tawait writeFile(file, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\n/**\n * `eds scaffold ue` - write the default-content UE components and a\n * field-reference block (every field type + a multifield), merging into any\n * existing component-definition/models/filters.\n */\nexport async function scaffoldUe(): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Scaffold - Universal Editor\"));\n\n\tconst created: string[] = [];\n\n\t// 1. field-reference block\n\tconst blockDir = path.join(projectRoot, \"blocks\", \"field-reference\");\n\tawait mkdir(blockDir, { recursive: true });\n\tawait writeFile(path.join(blockDir, \"field-reference.js\"), FIELD_REFERENCE_JS);\n\tawait writeFile(path.join(blockDir, \"field-reference.css\"), FIELD_REFERENCE_CSS);\n\tawait writeFile(path.join(blockDir, \"_field-reference.json\"), fieldReferenceModelFile());\n\tcreated.push(\"blocks/field-reference/ (all 17 fields + multifield)\");\n\n\t// 2. merge the three UE config files\n\tconst defFile = path.join(projectRoot, \"component-definition.json\");\n\tconst modelsFile = path.join(projectRoot, \"component-models.json\");\n\tconst filtersFile = path.join(projectRoot, \"component-filters.json\");\n\n\tconst blockDefs = [\n\t\t{\n\t\t\ttitle: \"Field Reference\",\n\t\t\tid: \"field-reference\",\n\t\t\tplugins: {\n\t\t\t\txwalk: {\n\t\t\t\t\tpage: {\n\t\t\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\t\t\ttemplate: { name: \"Field Reference\", model: \"field-reference\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t];\n\n\tconst definitions = mergeDefinitions(\n\t\tawait readJson(defFile),\n\t\tDEFAULT_CONTENT_DEFINITIONS,\n\t\tblockDefs,\n\t);\n\tawait writeJson(defFile, definitions);\n\tcreated.push(\"component-definition.json (default content + field-reference)\");\n\n\tconst existingModels: Json[] = (await readJson(modelsFile)) ?? [];\n\tconst fieldRefModel = JSON.parse(fieldReferenceModelFile()).models[0];\n\tconst models = mergeById(existingModels, [...DEFAULT_CONTENT_MODELS, fieldRefModel]);\n\tawait writeJson(modelsFile, models);\n\tcreated.push(\"component-models.json (title / image / button / field-reference)\");\n\n\tconst filters = mergeSectionFilter(await readJson(filtersFile), [\"field-reference\"]);\n\tawait writeJson(filtersFile, filters);\n\tcreated.push(\"component-filters.json (section filter)\");\n\n\tlogger.info(ui.heading(\"Created / merged\"));\n\tconst names = created.map((c) => c.split(\" \")[0]);\n\tconst w = ui.columnWidth(names);\n\tfor (const c of created) {\n\t\tconst [name, ...rest] = c.split(\" \");\n\t\tlogger.info(ui.accentLine(name, rest.join(\" \").replace(/^\\((.*)\\)$/, \"$1\"), w));\n\t}\n\tlogger.info(\"\");\n\tlogger.info(ui.box([\"Universal Editor scaffold ready\"]));\n}\n\n/**\n * `eds scaffold blocks [names...]` - scaffold standard Block Collection blocks\n * (hero, cards, columns, accordion, embed), each with JS/CSS + a distributed\n * `_<name>.json` UE model, and register them in the central `section` filter.\n */\nexport async function scaffoldBlocks(names?: string[]): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Scaffold — standard blocks\"));\n\n\tlet selected: BlockTemplate[];\n\tif (names?.length) {\n\t\tselected = names.map((n) => blockById(n.trim())).filter((b): b is BlockTemplate => !!b);\n\t\tconst unknown = names.filter((n) => !blockById(n.trim()));\n\t\tif (unknown.length) {\n\t\t\tlogger.warn(\n\t\t\t\t`Unknown block(s): ${unknown.join(\", \")}. Available: ${STANDARD_BLOCKS.map((b) => b.id).join(\", \")}`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\tselected = STANDARD_BLOCKS;\n\t}\n\n\tconst createdIds: string[] = [];\n\tconst skipped: string[] = [];\n\tfor (const b of selected) {\n\t\tconst dir = path.join(projectRoot, \"blocks\", b.id);\n\t\tif (existsSync(dir)) {\n\t\t\tskipped.push(b.id);\n\t\t\tcontinue;\n\t\t}\n\t\tawait mkdir(dir, { recursive: true });\n\t\tawait writeFile(path.join(dir, `${b.id}.js`), b.js);\n\t\tawait writeFile(path.join(dir, `${b.id}.css`), b.css);\n\t\tawait writeFile(path.join(dir, `_${b.id}.json`), b.model);\n\t\tcreatedIds.push(b.id);\n\t}\n\n\tconst filtersFile = path.join(projectRoot, \"component-filters.json\");\n\tconst filters = mergeSectionFilter(\n\t\tawait readJson(filtersFile),\n\t\tselected.map((b) => b.id),\n\t);\n\tawait writeJson(filtersFile, filters);\n\n\tlogger.info(ui.heading(\"Blocks\"));\n\tconst w = ui.columnWidth([...createdIds, ...skipped, \"component-filters\"]);\n\tfor (const id of createdIds) logger.info(ui.accentLine(id, \"created\", w));\n\tfor (const id of skipped) logger.info(ui.statusLine(\"warn\", id, \"already exists — skipped\", w));\n\tlogger.info(\"\");\n\tlogger.info(ui.box([`${createdIds.length} block(s) scaffolded + registered`]));\n}\n\n/**\n * `eds scaffold ci` - drop a GitHub Actions workflow that runs the project's\n * own lint/build plus the eds audits (doctor, loading, security) as a PR\n * gatekeeper. Deterministic, no agent.\n */\nexport async function scaffoldCi(): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Scaffold - CI workflow\"));\n\n\tconst res = await writeCiWorkflow(projectRoot);\n\tlogger.info(ui.heading(\"GitHub Actions\"));\n\tif (res.created) {\n\t\tlogger.info(ui.accentLine(res.path, \"doctor + audit loading + audit security + lint/build\"));\n\t} else {\n\t\tlogger.info(ui.statusLine(\"warn\", res.path, \"already exists - skipped\"));\n\t}\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tui.box([\n\t\t\tres.created\n\t\t\t\t? \"CI workflow scaffolded - commit it and it runs on every PR\"\n\t\t\t\t: \"CI workflow left untouched\",\n\t\t]),\n\t);\n}\n\n/** Interactive scaffold picker (`eds scaffold` with no subcommand). */\nexport async function scaffoldInteractive(): Promise<void> {\n\tconst { select, checkbox } = await import(\"@inquirer/prompts\");\n\tlogger.logoOnce(ui.logo(\"Scaffold\"));\n\tconst what = await select({\n\t\tmessage: \"What do you want to scaffold?\",\n\t\tchoices: [\n\t\t\t{ name: \"Universal Editor config + field-reference (all 17 field types)\", value: \"ue\" },\n\t\t\t{ name: \"Standard blocks (hero, cards, columns, accordion, embed)\", value: \"blocks\" },\n\t\t\t{ name: \"GitHub Actions CI (doctor + audits + lint/build)\", value: \"ci\" },\n\t\t\t{ name: \"UE config + standard blocks\", value: \"both\" },\n\t\t],\n\t});\n\tif (what === \"ue\" || what === \"both\") await scaffoldUe();\n\tif (what === \"blocks\" || what === \"both\") {\n\t\tconst picked = await checkbox({\n\t\t\tmessage: \"Which blocks?\",\n\t\t\tchoices: STANDARD_BLOCKS.map((b) => ({ name: b.title, value: b.id, checked: true })),\n\t\t});\n\t\tawait scaffoldBlocks(picked);\n\t}\n\tif (what === \"ci\") await scaffoldCi();\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { writeCiWorkflow } from \"../lib/scaffold/ci.js\";\nimport {\n\tAUTHORING_NAMES,\n\ttype Authoring,\n\tdaMountpoint,\n\tneedsFstab,\n\twriteFstab,\n\twritePaths,\n} from \"../lib/scaffold/fstab.js\";\nimport * as ui from \"../lib/ui.js\";\nimport { scaffoldUe } from \"./scaffold.js\";\n\nexport interface InitOptions {\n\tname?: string;\n\tauthoring?: Authoring;\n\tmountpoint?: string;\n\torg?: string;\n\tsite?: string;\n\t/** Scaffold the CI workflow. Defaults to true. */\n\tci?: boolean;\n\t/** Skip prompts; apply with provided flags/defaults. */\n\tyes?: boolean;\n}\n\nconst slug = (s: string): string =>\n\ts\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9-]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\nasync function setPackageName(root: string, name: string): Promise<boolean> {\n\tconst file = path.join(root, \"package.json\");\n\tif (!existsSync(file)) return false;\n\ttry {\n\t\tconst pkg = JSON.parse(await readFile(file, \"utf-8\"));\n\t\tpkg.name = name;\n\t\tawait writeFile(file, `${JSON.stringify(pkg, null, 2)}\\n`);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Swap the boilerplate's name token in a few human-facing files. */\nasync function replacePlaceholders(root: string, name: string): Promise<string[]> {\n\tconst touched: string[] = [];\n\tfor (const rel of [\"README.md\", \"index.html\", \"head.html\"]) {\n\t\tconst file = path.join(root, rel);\n\t\tif (!existsSync(file)) continue;\n\t\ttry {\n\t\t\tconst before = await readFile(file, \"utf-8\");\n\t\t\tconst after = before.replace(/aem-boilerplate/gi, name);\n\t\t\tif (after !== before) {\n\t\t\t\tawait writeFile(file, after);\n\t\t\t\ttouched.push(rel);\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore unreadable files\n\t\t}\n\t}\n\treturn touched;\n}\n\n/** Interactive checklist of the steps only the developer can do (outside the repo). */\nasync function externalSteps(authoring: Authoring): Promise<void> {\n\tconst { confirm } = await import(\"@inquirer/prompts\");\n\tconst steps: { title: string; url?: string; note: string }[] = [\n\t\t{\n\t\t\ttitle: \"Install the AEM Code Sync GitHub app\",\n\t\t\turl: \"https://github.com/apps/aem-code-sync/installations/new\",\n\t\t\tnote: \"Connects your repo to the Edge Delivery pipeline (preview/publish).\",\n\t\t},\n\t];\n\tif (authoring === \"gdrive\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Share your content folder\",\n\t\t\tnote: \"Share the Google Drive folder with the AEM service and set it as the mountpoint.\",\n\t\t});\n\t}\n\tif (authoring === \"sharepoint\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Share your content folder\",\n\t\t\tnote: \"Grant the SharePoint/OneDrive folder to the AEM service account.\",\n\t\t});\n\t}\n\tif (authoring === \"da\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Author in DA\",\n\t\t\turl: \"https://da.live\",\n\t\t\tnote: \"Create documents at da.live.\",\n\t\t});\n\t}\n\tif (authoring === \"ue\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Open the Universal Editor\",\n\t\t\turl: \"https://experience.adobe.com\",\n\t\t\tnote: \"Author in-context once the repo is connected to AEM.\",\n\t\t});\n\t}\n\tsteps.push({\n\t\ttitle: \"Install the AEM Sidekick extension\",\n\t\turl: \"https://chromewebstore.google.com/detail/aem-sidekick/igkmdomcgoebiipaifhmpfjhbjccggml\",\n\t\tnote: \"Preview and publish from the browser.\",\n\t});\n\tsteps.push({\n\t\ttitle: \"Run the local dev server\",\n\t\tnote: \"npm install, then `aem up` (from @adobe/aem-cli).\",\n\t});\n\n\tlogger.info(ui.heading(\"Next steps (outside the repo)\"));\n\tfor (let i = 0; i < steps.length; i++) {\n\t\tconst s = steps[i];\n\t\tlogger.info(` ${ui.brand.accent(String(i + 1))} ${chalk.bold(s.title)}`);\n\t\tif (s.url) logger.info(` ${chalk.cyan(s.url)}`);\n\t\tlogger.info(` ${chalk.dim(s.note)}`);\n\t\tawait confirm({ message: \" Done / skip?\", default: true });\n\t}\n}\n\n/**\n * `eds init` - adapt a freshly cloned EDS boilerplate to a chosen authoring\n * model (Universal Editor / DA / Google Drive / SharePoint). Interactive\n * wizard when flags are omitted. Writes fstab only when the model needs it.\n */\nexport async function initProject(options: InitOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\n\t\t\t\"Not inside an EDS project (no EDS project markers found). Clone an EDS boilerplate first, then run this from its root.\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tawait logger.logoOnceAnimated(\"Project setup\");\n\n\tconst { input, select, confirm } = await import(\"@inquirer/prompts\");\n\tconst interactive = !options.yes;\n\n\t// 1/4 - project name (default from package.json or the folder).\n\tlet defaultName = path.basename(projectRoot);\n\tconst pkgFile = path.join(projectRoot, \"package.json\");\n\tif (existsSync(pkgFile)) {\n\t\ttry {\n\t\t\tdefaultName = JSON.parse(await readFile(pkgFile, \"utf-8\")).name || defaultName;\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\tconst name =\n\t\t(options.name && slug(options.name)) ||\n\t\tslug(\n\t\t\tawait input({\n\t\t\t\tmessage: \"1/4 Project name\",\n\t\t\t\tdefault: slug(defaultName),\n\t\t\t\tvalidate: (v) => !!slug(v) || \"Use letters, numbers and dashes\",\n\t\t\t}),\n\t\t);\n\n\t// 2/4 - authoring model.\n\tconst authoring =\n\t\toptions.authoring ??\n\t\t((await select({\n\t\t\tmessage: \"2/4 Authoring model\",\n\t\t\tchoices: [\n\t\t\t\t{ name: AUTHORING_NAMES.ue, value: \"ue\" },\n\t\t\t\t{ name: AUTHORING_NAMES.da, value: \"da\" },\n\t\t\t\t{ name: AUTHORING_NAMES.gdrive, value: \"gdrive\" },\n\t\t\t\t{ name: AUTHORING_NAMES.sharepoint, value: \"sharepoint\" },\n\t\t\t],\n\t\t})) as Authoring);\n\n\t// 3/4 - content mountpoint, only when the model needs an fstab. Build it from\n\t// flags when given (so --yes works), otherwise prompt.\n\tlet mountpoint = options.mountpoint;\n\tif (needsFstab(authoring) && !mountpoint) {\n\t\tif (authoring === \"da\" && (options.org || interactive)) {\n\t\t\tconst org =\n\t\t\t\toptions.org ??\n\t\t\t\t(await input({ message: \" DA org\", validate: (v) => !!v.trim() || \"Required\" }));\n\t\t\tconst site =\n\t\t\t\toptions.site ??\n\t\t\t\t(interactive ? await input({ message: \" DA site\", default: name }) : name);\n\t\t\tmountpoint = daMountpoint(org.trim(), slug(site));\n\t\t} else if (authoring !== \"da\" && interactive) {\n\t\t\tconst label = authoring === \"gdrive\" ? \"Google Drive folder URL\" : \"SharePoint folder URL\";\n\t\t\tmountpoint = (\n\t\t\t\tawait input({\n\t\t\t\t\tmessage: ` ${label}`,\n\t\t\t\t\tvalidate: (v) => /^https?:\\/\\//.test(v.trim()) || \"Paste the folder URL\",\n\t\t\t\t})\n\t\t\t).trim();\n\t\t}\n\t}\n\n\t// 4/4 - CI gatekeeper.\n\tconst withCi =\n\t\toptions.ci ??\n\t\t(interactive\n\t\t\t? await confirm({ message: \"4/4 Add GitHub Actions CI (audits gatekeeper)?\", default: true })\n\t\t\t: true);\n\n\t// Summary + confirm.\n\tlogger.info(ui.heading(\"Summary\"));\n\tconst w = ui.columnWidth([\"name\", \"authoring\", \"mountpoint\", \"ci\"]);\n\tlogger.info(ui.accentLine(\"name\", name, w));\n\tlogger.info(ui.accentLine(\"authoring\", AUTHORING_NAMES[authoring], w));\n\tif (mountpoint) logger.info(ui.accentLine(\"mountpoint\", mountpoint, w));\n\telse if (needsFstab(authoring))\n\t\tlogger.info(ui.accentLine(\"mountpoint\", \"(skipped - set it in fstab.yaml later)\", w));\n\tlogger.info(ui.accentLine(\"ci\", withCi ? \"yes\" : \"no\", w));\n\tlogger.info(\"\");\n\tif (interactive) {\n\t\tconst go = await confirm({ message: \"Apply this setup?\", default: true });\n\t\tif (!go) {\n\t\t\tlogger.info(\"Cancelled.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Apply.\n\tconst done: string[] = [];\n\tif (await setPackageName(projectRoot, name)) done.push(\"package.json (name)\");\n\tfor (const t of await replacePlaceholders(projectRoot, name)) done.push(`${t} (renamed)`);\n\tif (needsFstab(authoring) && mountpoint) done.push(await writeFstab(projectRoot, mountpoint));\n\tif (authoring === \"ue\") {\n\t\tawait scaffoldUe();\n\t\tdone.push(await writePaths(projectRoot, name));\n\t}\n\tif (withCi) {\n\t\tconst ci = await writeCiWorkflow(projectRoot);\n\t\tdone.push(ci.created ? ci.path : `${ci.path} (exists, skipped)`);\n\t}\n\n\tlogger.info(ui.heading(\"Configured\"));\n\tconst dw = ui.columnWidth(done.map((d) => d.split(\" \")[0]));\n\tfor (const d of done) {\n\t\tconst [n, ...rest] = d.split(\" \");\n\t\tlogger.info(ui.accentLine(n, rest.join(\" \").replace(/^\\((.*)\\)$/, \"$1\"), dw));\n\t}\n\tlogger.info(\"\");\n\n\tif (interactive) await externalSteps(authoring);\n\n\tlogger.info(ui.box([`\"${name}\" set up for ${AUTHORING_NAMES[authoring]}`]));\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../../lib/logger.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport { kebabCaseRegex } from \"../../lib/schemas.js\";\n\ninterface CreateBlockOptions {\n\t/** Generate the Universal Editor model. Defaults to true. */\n\tueModel?: boolean;\n}\n\n/** `hero-banner` → `Hero Banner` */\nfunction titleCase(name: string): string {\n\treturn name\n\t\t.split(\"-\")\n\t\t.map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n\t\t.join(\" \");\n}\n\n/**\n * The Universal Editor block config (`_<name>.json`): the `definitions`,\n * `models` and `filters` that let an author drop and edit this block in UE.\n * A single rich-text field is a safe starting point authors can extend.\n */\nexport function ueModelFor(name: string): string {\n\tconst title = titleCase(name);\n\tconst model = {\n\t\tdefinitions: [\n\t\t\t{\n\t\t\t\ttitle,\n\t\t\t\tid: name,\n\t\t\t\tplugins: {\n\t\t\t\t\txwalk: {\n\t\t\t\t\t\tpage: {\n\t\t\t\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\t\t\t\ttemplate: { name: title, model: name },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: name,\n\t\t\t\t// Starter fields showcasing good patterns (title+titleType collapse\n\t\t\t\t// into a heading; richtext for body). Extend from the full catalog —\n\t\t\t\t// see docs/universal-editor-fields.md.\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponent: \"text\",\n\t\t\t\t\t\tname: \"title\",\n\t\t\t\t\t\tlabel: \"Title\",\n\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponent: \"select\",\n\t\t\t\t\t\tname: \"titleType\",\n\t\t\t\t\t\tlabel: \"Title Type\",\n\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t\tvalue: \"h2\",\n\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t{ name: \"H1\", value: \"h1\" },\n\t\t\t\t\t\t\t{ name: \"H2\", value: \"h2\" },\n\t\t\t\t\t\t\t{ name: \"H3\", value: \"h3\" },\n\t\t\t\t\t\t\t{ name: \"H4\", value: \"h4\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponent: \"richtext\",\n\t\t\t\t\t\tname: \"text\",\n\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\tlabel: \"Text\",\n\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\tfilters: [],\n\t};\n\treturn `${JSON.stringify(model, null, 2)}\\n`;\n}\n\nexport async function createBlock(name: string, options: CreateBlockOptions = {}): Promise<void> {\n\tif (!kebabCaseRegex.test(name)) {\n\t\tlogger.error(\n\t\t\t`Invalid block name \"${name}\". Use kebab-case (e.g., \"hero-banner\", \"card-list\").`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\n\t\t\t\"Not inside an EDS project (no EDS project markers found). Run this from your project root.\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst blocksDir = path.join(projectRoot, \"blocks\", name);\n\tif (existsSync(blocksDir)) {\n\t\tlogger.error(`Block \"${name}\" already exists at ${blocksDir}`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tawait mkdir(blocksDir, { recursive: true });\n\n\tconst jsContent = `export default function decorate(block) {\n // TODO: implement ${name} block\n}\n`;\n\n\tconst cssContent = `.${name} {\n /* TODO: style ${name} block */\n}\n`;\n\n\tawait writeFile(path.join(blocksDir, `${name}.js`), jsContent);\n\tawait writeFile(path.join(blocksDir, `${name}.css`), cssContent);\n\n\t// Universal Editor authoring is a first-class output — generated by default.\n\tconst withUe = options.ueModel !== false;\n\tif (withUe) {\n\t\tawait writeFile(path.join(blocksDir, `_${name}.json`), ueModelFor(name));\n\t}\n\n\tlogger.success(\n\t\t`Block \"${name}\" created at ${chalk.cyan(path.relative(projectRoot, blocksDir))}${\n\t\t\twithUe ? chalk.dim(\" (+ Universal Editor model)\") : \"\"\n\t\t}`,\n\t);\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentInfo, AgentType } from \"../../types/index.js\";\nimport { logger } from \"../logger.js\";\n\ninterface AgentDef {\n\ttype: AgentType;\n\tbinary: string;\n\tconfigDir: string;\n\tmcpConfigPaths: string[];\n}\n\nconst AGENT_DEFS: AgentDef[] = [\n\t{\n\t\ttype: \"claude\",\n\t\tbinary: \"claude\",\n\t\tconfigDir: path.join(homedir(), \".claude\"),\n\t\tmcpConfigPaths: [\n\t\t\tpath.join(homedir(), \".claude\", \"plugins.json\"),\n\t\t\tpath.join(homedir(), \".claude.json\"),\n\t\t],\n\t},\n\t{\n\t\ttype: \"cursor\",\n\t\tbinary: \"cursor\",\n\t\tconfigDir: path.join(homedir(), \".cursor\"),\n\t\tmcpConfigPaths: [path.join(homedir(), \".cursor\", \"mcp.json\")],\n\t},\n\t{\n\t\ttype: \"codex\",\n\t\tbinary: \"codex\",\n\t\tconfigDir: path.join(homedir(), \".codex\"),\n\t\tmcpConfigPaths: [],\n\t},\n];\n\nasync function whichBinary(name: string): Promise<string | undefined> {\n\tconst { execaCommand } = await import(\"execa\");\n\ttry {\n\t\tconst result = await execaCommand(`which ${name}`);\n\t\treturn result.stdout.trim() || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Walk a config object looking for `mcpServers` maps (at any depth — Claude\n * stores them both at the root and per-project) and return the first server\n * key that mentions Figma. That key is the exact name we must grant tools for.\n */\nfunction findFigmaServerKey(node: unknown): string | undefined {\n\tif (!node || typeof node !== \"object\") return undefined;\n\tconst obj = node as Record<string, unknown>;\n\n\tconst servers = obj.mcpServers;\n\tif (servers && typeof servers === \"object\") {\n\t\tfor (const key of Object.keys(servers as Record<string, unknown>)) {\n\t\t\tif (key.toLowerCase().includes(\"figma\")) return key;\n\t\t}\n\t}\n\n\tfor (const value of Object.values(obj)) {\n\t\tconst found = findFigmaServerKey(value);\n\t\tif (found) return found;\n\t}\n\treturn undefined;\n}\n\n/**\n * Find the configured Figma MCP server name across an agent's config files.\n * Falls back to a loose text match (returns \"figma\" as a sentinel) so older\n * configs still report as \"configured\" even if we can't parse the exact key.\n */\nasync function findFigmaMcpServer(configPaths: string[]): Promise<string | undefined> {\n\tfor (const configPath of configPaths) {\n\t\ttry {\n\t\t\tif (!existsSync(configPath)) continue;\n\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\ttry {\n\t\t\t\tconst key = findFigmaServerKey(JSON.parse(content));\n\t\t\t\tif (key) return key;\n\t\t\t} catch {\n\t\t\t\t// Not JSON (or malformed) — fall back to a text match below.\n\t\t\t}\n\t\t\tif (content.toLowerCase().includes(\"figma\")) return \"figma\";\n\t\t} catch {\n\t\t\t// Unreadable config — skip to the next path.\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport async function detectAgent(preferred?: AgentType): Promise<AgentInfo | undefined> {\n\t// If user specified a preferred agent, try that first\n\tif (preferred) {\n\t\tconst def = AGENT_DEFS.find((d) => d.type === preferred);\n\t\tif (def) {\n\t\t\tconst binPath = await whichBinary(def.binary);\n\t\t\tif (binPath) {\n\t\t\t\tconst figmaMcpServerName = await findFigmaMcpServer(def.mcpConfigPaths);\n\t\t\t\treturn {\n\t\t\t\t\ttype: def.type,\n\t\t\t\t\tpath: binPath,\n\t\t\t\t\tconfigDir: existsSync(def.configDir) ? def.configDir : undefined,\n\t\t\t\t\thasFigmaMcp: !!figmaMcpServerName,\n\t\t\t\t\tfigmaMcpServerName,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlogger.warn(`Preferred agent \"${preferred}\" not found in PATH`);\n\t\t}\n\t}\n\n\t// Auto-detect: try each agent in order\n\tfor (const def of AGENT_DEFS) {\n\t\tconst binPath = await whichBinary(def.binary);\n\t\tif (binPath) {\n\t\t\tconst figmaMcpServerName = await findFigmaMcpServer(def.mcpConfigPaths);\n\t\t\treturn {\n\t\t\t\ttype: def.type,\n\t\t\t\tpath: binPath,\n\t\t\t\tconfigDir: existsSync(def.configDir) ? def.configDir : undefined,\n\t\t\t\thasFigmaMcp: !!figmaMcpServerName,\n\t\t\t\tfigmaMcpServerName,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nexport async function detectAllAgents(): Promise<AgentInfo[]> {\n\tconst agents: AgentInfo[] = [];\n\tfor (const def of AGENT_DEFS) {\n\t\tconst binPath = await whichBinary(def.binary);\n\t\tif (binPath) {\n\t\t\tconst figmaMcpServerName = await findFigmaMcpServer(def.mcpConfigPaths);\n\t\t\tagents.push({\n\t\t\t\ttype: def.type,\n\t\t\t\tpath: binPath,\n\t\t\t\tconfigDir: existsSync(def.configDir) ? def.configDir : undefined,\n\t\t\t\thasFigmaMcp: !!figmaMcpServerName,\n\t\t\t\tfigmaMcpServerName,\n\t\t\t});\n\t\t}\n\t}\n\treturn agents;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport chalk from \"chalk\";\nimport type { ResultPromise } from \"execa\";\nimport type { AgentInfo } from \"../../types/index.js\";\nimport { logger } from \"../logger.js\";\nimport * as ui from \"../ui.js\";\n\n/**\n * Save a prompt to a temp file and return its path.\n */\nexport async function savePromptToFile(prompt: string, projectRoot?: string): Promise<string> {\n\t// Prefer a project-local `tmp/` (gitignored) over the system temp dir, so\n\t// generated prompts land somewhere visible next to the project.\n\tconst base = projectRoot ? path.join(projectRoot, \"tmp\") : tmpdir();\n\tconst dir = path.join(base, \"eds-cli\");\n\tawait mkdir(dir, { recursive: true });\n\tconst filename = `from-design-${Date.now()}.md`;\n\tconst filePath = path.join(dir, filename);\n\tawait writeFile(filePath, prompt, \"utf-8\");\n\treturn filePath;\n}\n\n/**\n * Invoke an AI agent with the given prompt file.\n * Returns true if the agent ran successfully.\n */\nexport async function invokeAgent(\n\tagent: AgentInfo,\n\tpromptFile: string,\n\tcwd: string,\n): Promise<boolean> {\n\tconst { execa } = await import(\"execa\");\n\tconst prompt = await readFile(promptFile, \"utf-8\");\n\n\ttry {\n\t\tswitch (agent.type) {\n\t\t\tcase \"claude\": {\n\t\t\t\tlogger.info(`Running Claude Code ${chalk.dim(\"- live log:\")}`);\n\t\t\t\t// Grant Figma MCP at the server level (`mcp__<server>` allows all of\n\t\t\t\t// its tools). We grant a *superset*, not just the detected server:\n\t\t\t\t// a user may have several Figma servers configured where the first\n\t\t\t\t// one found is stale/disconnected (e.g. a dead `figma-sse` alongside\n\t\t\t\t// a live plugin). Granting every known variant lets the agent fall\n\t\t\t\t// through to whichever one actually responds. Granting a server that\n\t\t\t\t// doesn't exist is harmless.\n\t\t\t\tconst figmaServers = [\n\t\t\t\t\t...(agent.figmaMcpServerName ? [agent.figmaMcpServerName] : []),\n\t\t\t\t\t\"figma-sse\",\n\t\t\t\t\t\"figma-desktop\",\n\t\t\t\t\t\"figma\",\n\t\t\t\t\t\"Figma\",\n\t\t\t\t\t\"plugin_figma_figma\", // Claude Code plugin: plugin:figma:figma\n\t\t\t\t];\n\t\t\t\tconst allowedTools = [\n\t\t\t\t\t...new Set(figmaServers.map((s) => `mcp__${s}`)),\n\t\t\t\t\t\"Edit\",\n\t\t\t\t\t\"Write\",\n\t\t\t\t\t\"Read\",\n\t\t\t\t].join(\",\");\n\t\t\t\t// Stream JSON events so we can render a live, colour-coded log of\n\t\t\t\t// what the agent is doing (tool calls, Figma MCP reads, file writes)\n\t\t\t\t// instead of a silent \"this may take a minute\".\n\t\t\t\tconst sub = execa(\n\t\t\t\t\t\"claude\",\n\t\t\t\t\t[\n\t\t\t\t\t\t\"-p\",\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\"--output-format\",\n\t\t\t\t\t\t\"stream-json\",\n\t\t\t\t\t\t\"--verbose\",\n\t\t\t\t\t\t\"--allowedTools\",\n\t\t\t\t\t\tallowedTools,\n\t\t\t\t\t],\n\t\t\t\t\t{ cwd, buffer: false, stdio: [\"ignore\", \"pipe\", \"inherit\"] },\n\t\t\t\t);\n\t\t\t\tawait renderClaudeStream(sub, cwd);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"cursor\": {\n\t\t\t\tlogger.info(\"Running Cursor agent...\");\n\t\t\t\tawait execa(\"cursor\", [\"--prompt\", prompt], {\n\t\t\t\t\tcwd,\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"codex\": {\n\t\t\t\tlogger.info(\"Running Codex...\");\n\t\t\t\tawait execa(\"codex\", [prompt], {\n\t\t\t\t\tcwd,\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t} catch (err) {\n\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\tlogger.error(`Agent ${agent.type} failed: ${msg}`);\n\t\treturn false;\n\t}\n}\n\n// ── Live stream renderer for Claude Code (`--output-format stream-json`) ──\n\ninterface ToolUseBlock {\n\ttype: \"tool_use\";\n\tid?: string;\n\tname: string;\n\tinput?: Record<string, unknown>;\n}\ninterface TextBlock {\n\ttype: \"text\";\n\ttext: string;\n}\ninterface ToolResultBlock {\n\ttype: \"tool_result\";\n\ttool_use_id?: string;\n\tis_error?: boolean;\n}\ntype ContentBlock = ToolUseBlock | TextBlock | ToolResultBlock | { type: string };\n\ninterface StreamEvent {\n\ttype?: string;\n\tmessage?: { content?: ContentBlock[] };\n\tduration_ms?: number;\n\ttotal_cost_usd?: number;\n}\n\nfunction shortName(name: string): string {\n\treturn name.includes(\"figma\") ? (name.split(\"__\").pop() ?? name) : name.toLowerCase();\n}\n\n/**\n * Read the agent's JSON event stream and render a live, animated log: an `ora`\n * spinner shows the current activity + elapsed time at the bottom while\n * colour-coded lines scroll above it. Each tool is timed from its `tool_use`\n * to its matching `tool_result` and printed with that per-phase duration.\n */\nasync function renderClaudeStream(sub: ResultPromise, cwd: string): Promise<void> {\n\tconst ora = (await import(\"ora\")).default;\n\tconst start = Date.now();\n\tconst elapsed = () => `${Math.round((Date.now() - start) / 1000)}s`;\n\tconst spinner = ora({ text: `thinking ${chalk.dim(elapsed())}`, color: \"yellow\" }).start();\n\tlet activity = \"thinking\";\n\tconst timer = setInterval(() => {\n\t\tspinner.text = `${activity} ${chalk.dim(elapsed())}`;\n\t}, 300);\n\n\t// Pending tool calls keyed by id, so we can print each with its own timing\n\t// once its result arrives.\n\tconst pending = new Map<string, { label: string; start: number }>();\n\tconst emit = (line: string) => {\n\t\tspinner.stop();\n\t\tlogger.info(` ${line}`);\n\t\tspinner.start();\n\t};\n\n\tlet result: string | undefined;\n\ttry {\n\t\tif (sub.stdout) {\n\t\t\tconst rl = readline.createInterface({ input: sub.stdout });\n\t\t\tfor await (const line of rl) {\n\t\t\t\tconst trimmed = line.trim();\n\t\t\t\tif (!trimmed) continue;\n\t\t\t\tlet evt: StreamEvent;\n\t\t\t\ttry {\n\t\t\t\t\tevt = JSON.parse(trimmed) as StreamEvent;\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst content = Array.isArray(evt.message?.content) ? evt.message.content : [];\n\n\t\t\t\tif (evt.type === \"assistant\") {\n\t\t\t\t\tfor (const block of content) {\n\t\t\t\t\t\tif (block.type === \"text\" && \"text\" in block) {\n\t\t\t\t\t\t\tconst first = block.text.trim().split(\"\\n\")[0].slice(0, 100);\n\t\t\t\t\t\t\tif (first) emit(chalk.dim(first));\n\t\t\t\t\t\t} else if (block.type === \"tool_use\" && \"name\" in block) {\n\t\t\t\t\t\t\tconst id = \"id\" in block && block.id ? block.id : `${Math.random()}`;\n\t\t\t\t\t\t\tpending.set(id, {\n\t\t\t\t\t\t\t\tlabel: toolLabel(block.name, block.input, cwd),\n\t\t\t\t\t\t\t\tstart: Date.now(),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tactivity = shortName(block.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (evt.type === \"user\") {\n\t\t\t\t\tfor (const block of content) {\n\t\t\t\t\t\tif (block.type === \"tool_result\" && \"tool_use_id\" in block && block.tool_use_id) {\n\t\t\t\t\t\t\tconst p = pending.get(block.tool_use_id);\n\t\t\t\t\t\t\tif (p) {\n\t\t\t\t\t\t\t\tconst dur = `${((Date.now() - p.start) / 1000).toFixed(1)}s`;\n\t\t\t\t\t\t\t\tconst failed =\n\t\t\t\t\t\t\t\t\t\"is_error\" in block && block.is_error ? ` ${chalk.red(\"failed\")}` : \"\";\n\t\t\t\t\t\t\t\temit(`${p.label} ${chalk.dim(dur)}${failed}`);\n\t\t\t\t\t\t\t\tpending.delete(block.tool_use_id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (evt.type === \"result\") {\n\t\t\t\t\tconst dur =\n\t\t\t\t\t\ttypeof evt.duration_ms === \"number\" ? `${(evt.duration_ms / 1000).toFixed(1)}s` : \"\";\n\t\t\t\t\tconst cost =\n\t\t\t\t\t\ttypeof evt.total_cost_usd === \"number\" ? `$${evt.total_cost_usd.toFixed(3)}` : \"\";\n\t\t\t\t\tresult = [dur, cost].filter(Boolean).join(\" · \") || \"done\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Flush any tool that never reported a result.\n\t\tfor (const p of pending.values()) emit(`${p.label} ${chalk.dim(\"…\")}`);\n\t\tclearInterval(timer);\n\t\tif (result) spinner.succeed(`${ui.brand.accent(\"agent finished\")} ${chalk.dim(result)}`);\n\t\telse spinner.stop();\n\t} catch (err) {\n\t\tclearInterval(timer);\n\t\tspinner.stop();\n\t\tthrow err;\n\t}\n\tawait sub; // propagate a non-zero exit as a throw\n}\n\nfunction toolLabel(name: string, input: Record<string, unknown> | undefined, cwd: string): string {\n\tconst rel = (key: string): string => {\n\t\tconst p = input?.[key];\n\t\tif (typeof p !== \"string\") return \"\";\n\t\treturn p.startsWith(cwd) ? path.relative(cwd, p) : path.basename(p);\n\t};\n\tif (name.includes(\"figma\")) {\n\t\tconst short = name.split(\"__\").pop() ?? name;\n\t\treturn `${ui.icon.figma} ${chalk.bold(short)} ${chalk.dim(\"Figma MCP\")}`;\n\t}\n\tswitch (name) {\n\t\tcase \"Write\":\n\t\tcase \"Edit\":\n\t\tcase \"NotebookEdit\":\n\t\t\treturn `${ui.brand.accent(\"✎\")} ${chalk.cyan(rel(\"file_path\"))}`;\n\t\tcase \"Read\":\n\t\t\treturn chalk.dim(`· read ${rel(\"file_path\")}`);\n\t\tcase \"Bash\": {\n\t\t\tconst cmd =\n\t\t\t\ttypeof input?.command === \"string\" ? input.command.split(\"\\n\")[0].slice(0, 70) : \"\";\n\t\t\treturn chalk.dim(`$ ${cmd}`);\n\t\t}\n\t\tdefault:\n\t\t\treturn `${ui.brand.blue(\"→\")} ${name}`;\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\nimport { type EdsConfig, edsConfigSchema } from \"./schemas.js\";\n\nconst GLOBAL_CONFIG_DIR = path.join(homedir(), \".eds\");\nconst GLOBAL_CONFIG_PATH = path.join(GLOBAL_CONFIG_DIR, \"config.json\");\nconst PROJECT_CONFIG_NAME = \".edsrc.json\";\n\nasync function loadJsonFile(filePath: string): Promise<unknown> {\n\ttry {\n\t\tconst content = await readFile(filePath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport async function loadConfig(projectRoot?: string): Promise<EdsConfig> {\n\tconst globalRaw = await loadJsonFile(GLOBAL_CONFIG_PATH);\n\tconst projectRaw = projectRoot\n\t\t? await loadJsonFile(path.join(projectRoot, PROJECT_CONFIG_NAME))\n\t\t: undefined;\n\n\tconst merged = {\n\t\t...(typeof globalRaw === \"object\" && globalRaw !== null ? globalRaw : {}),\n\t\t...(typeof projectRaw === \"object\" && projectRaw !== null ? projectRaw : {}),\n\t};\n\n\tconst result = edsConfigSchema.safeParse(merged);\n\tif (!result.success) {\n\t\tlogger.debug(\"Config validation issues:\", result.error.flatten());\n\t\treturn edsConfigSchema.parse({});\n\t}\n\n\treturn result.data;\n}\n\nexport function globalConfigDir(): string {\n\treturn GLOBAL_CONFIG_DIR;\n}\n\nexport function globalConfigPath(): string {\n\treturn GLOBAL_CONFIG_PATH;\n}\n\nexport function globalConfigExists(): boolean {\n\treturn existsSync(GLOBAL_CONFIG_PATH);\n}\n","import type { FigmaUrlParts } from \"../schemas.js\";\n\n/**\n * Parse a Figma URL into its components: fileKey, nodeId, fileName.\n *\n * Supported URL formats:\n * - figma.com/design/:fileKey/:fileName?node-id=:nodeId\n * - figma.com/design/:fileKey/branch/:branchKey/:fileName?node-id=:nodeId\n * - figma.com/file/:fileKey/:fileName?node-id=:nodeId\n * - figma.com/board/:fileKey/:fileName?node-id=:nodeId\n * - figma.com/make/:fileKey/:fileName\n * - figma.com/slides/:fileKey/:fileName?node-id=:nodeId\n *\n * nodeId in URL uses \"-\" as separator, converted to \":\" for API calls.\n */\nexport function parseFigmaUrl(input: string): FigmaUrlParts {\n\t// If input looks like a raw node-id (e.g., \"42:100\" or \"42-100\"), reject — need at least a fileKey\n\tif (/^\\d+[-:]\\d+$/.test(input.trim())) {\n\t\tthrow new Error(\n\t\t\t`Input \"${input}\" looks like a node-id but not a full URL. Provide a Figma URL or use --file-key.`,\n\t\t);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(input.trim());\n\t} catch {\n\t\tthrow new Error(`Invalid Figma URL: \"${input}\"`);\n\t}\n\n\tif (!url.hostname.endsWith(\"figma.com\")) {\n\t\tthrow new Error(`Not a Figma URL: \"${input}\"`);\n\t}\n\n\tconst segments = url.pathname.split(\"/\").filter(Boolean);\n\t// segments[0] = type (design|file|board|make|slides)\n\t// segments[1] = fileKey (or branchKey scenario below)\n\n\tif (segments.length < 2) {\n\t\tthrow new Error(`Cannot extract fileKey from URL: \"${input}\"`);\n\t}\n\n\tconst type = segments[0];\n\tlet fileKey: string;\n\tlet fileName: string | undefined;\n\n\t// Branch URLs: /design/:fileKey/branch/:branchKey/:fileName\n\tif (segments[2] === \"branch\" && segments[3]) {\n\t\tfileKey = segments[3]; // use branchKey as fileKey\n\t\tfileName = segments[4] ? decodeURIComponent(segments[4]) : undefined;\n\t} else {\n\t\tfileKey = segments[1];\n\t\tfileName = segments[2] ? decodeURIComponent(segments[2]) : undefined;\n\t}\n\n\t// Parse node-id from query params\n\tconst rawNodeId = url.searchParams.get(\"node-id\");\n\tconst nodeId = rawNodeId ? normalizeNodeId(rawNodeId) : undefined;\n\n\treturn { fileKey, nodeId, fileName };\n}\n\n/**\n * Convert node-id from URL format (42-100) to API format (42:100).\n */\nexport function normalizeNodeId(nodeId: string): string {\n\treturn decodeURIComponent(nodeId).replace(/-/g, \":\");\n}\n\n/**\n * Convert node-id from API format (42:100) to URL format (42-100).\n */\nexport function nodeIdToUrlFormat(nodeId: string): string {\n\treturn nodeId.replace(/:/g, \"-\");\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FigmaUrlParts } from \"../schemas.js\";\n\nconst PROMPT_VERSION = \"0.5.0\";\n\nexport { PROMPT_VERSION };\n\nexport type ContentSource = \"document\" | \"ue\" | \"cf\" | \"mixed\";\n\n/** Design source. Figma is fully wired; the others read via their own MCP. */\nexport type DesignProvider = \"figma\" | \"stitch\" | \"canva\" | \"sketch\";\n\nexport const PROVIDER_NAMES: Record<DesignProvider, string> = {\n\tfigma: \"Figma\",\n\tstitch: \"Google Stitch\",\n\tcanva: \"Canva\",\n\tsketch: \"Sketch\",\n};\n\nexport interface PromptContext {\n\t/** Design source. Defaults to \"figma\". */\n\tprovider?: DesignProvider;\n\t/** Figma URL parts (for the Figma provider). */\n\tfigma?: FigmaUrlParts | null;\n\t/** Generic design reference / link (for non-Figma providers). */\n\tdesignRef?: string;\n\tblockName: string;\n\tprojectRoot: string;\n\twithUeModel: boolean;\n\t/** Where the block's content comes from. Defaults to document authoring. */\n\tcontentSource?: ContentSource;\n\t/** Optional CF model / GraphQL persisted-query hint (for cf/mixed). */\n\tcfHint?: string;\n\t/** Fetch a screenshot for pixel verification. Defaults to true. Off = fewer input tokens. */\n\tscreenshot?: boolean;\n\texistingTokens?: string;\n}\n\n/** Guidance for Content-Fragment-backed and mixed (UE + CF) blocks. */\nfunction contentSourceGuidance(\n\tsource: ContentSource | undefined,\n\tcfHint: string | undefined,\n\tblockName: string,\n): string {\n\tif (!source || source === \"document\" || source === \"ue\") return \"\";\n\tconst q = cfHint ? ` (model / persisted query: \\`${cfHint}\\`)` : \"\";\n\tconst gql = \"`${window.location.origin}/graphql/execute.json/<project>/<query>;path=<cfPath>`\";\n\tif (source === \"cf\") {\n\t\treturn `\n## Content source: Content Fragment\nThis block renders an AEM **Content Fragment**${q} - not inline-authored copy.\n- UE model: use an \\`aem-content-fragment\\` field (e.g. \\`name: \"fragment\"\\`) for the CF reference.\n- \\`decorate(block)\\` must be **async**: read the CF reference from the authored DOM (a link to \\`/content/dam/...\\`), fetch its fields through an AEM GraphQL **persisted query** (${gql}), then build the DOM from the returned fields.\n- Handle loading / empty / error states. Do not hardcode copy that the CF owns.\n- \\`.${blockName}\\` styling still follows the EDS conventions below.\n`;\n\t}\n\t// mixed\n\treturn `\n## Content source: Mixed (Universal Editor + Content Fragment)\nThis block mixes **two sources in one model and one \\`decorate(block)\\`**:\n- **Inline (UE-authored)** parts → normal fields (text / richtext / image / select) read straight from the authored DOM cells, with semantic collapsing.\n- **Content Fragment** part${q} → an \\`aem-content-fragment\\` field; \\`decorate()\\` is **async** and also fetches that CF via a GraphQL persisted query (${gql}) and renders its fields.\n- Field order in the model = cell order in the authored DOM. Read the inline cells by position; detect the CF reference by its \\`/content/dam/\\` link. Merge both into the final markup, and handle the CF loading/empty/error states.\n`;\n}\n\nexport async function buildPrompt(ctx: PromptContext): Promise<string> {\n\tconst tokensHint = await getTokensHint(ctx.projectRoot);\n\tconst contentSourceSection = contentSourceGuidance(ctx.contentSource, ctx.cfHint, ctx.blockName);\n\tconst withScreenshot = ctx.screenshot !== false;\n\tconst verifyStep = withScreenshot\n\t\t? `## Step 5 — Pixel-Perfect Self-Verification (do not skip)\nAfter writing the files, **verify against the screenshot from Step 1**:\n1. Re-open the \\`get_screenshot\\` image and compare it to your implementation region by region.\n2. Check each axis: spacing, font sizes/weights/line-heights, colors, border-radius, shadows, alignment, and overall proportions.\n3. For every mismatch, adjust the CSS and re-check. Repeat until the rendered block is indistinguishable from the screenshot.\n4. Briefly state what you verified and any value you had to infer.`\n\t\t: `## Step 5 — Structural Self-Verification (do not skip)\nNo screenshot was fetched (token-lean mode). Verify against the **exact values from \\`get_design_context\\`**:\n1. Re-check every extracted value (spacing, fonts, colors, radius, shadows, alignment) against your CSS.\n2. Fix any mismatch.\n3. Briefly state what you verified and any value you had to infer.`;\n\n\tconst provider = ctx.provider ?? \"figma\";\n\tconst providerName = PROVIDER_NAMES[provider];\n\tconst fetchSection =\n\t\tprovider === \"figma\"\n\t\t\t? `## Step 1 — Fetch the Design\nCall the Figma MCP tools for this selection:\n- \\`get_design_context\\` — structure, layout, measurements, text content\n- \\`get_variable_defs\\` — design tokens (variables) to map to CSS custom properties\n${withScreenshot ? \"- `get_screenshot` — the ground-truth visual reference for Step 5. Request it at `maxDimension: 1024` (enough to verify; do not request larger).\" : \"- (screenshot skipped to save tokens — pass `excludeScreenshot: true` to `get_design_context`)\"}\n\n**Token efficiency:** call each tool **once** for the target node only — don't re-fetch and don't walk sibling/parent nodes you don't need.${withScreenshot ? \"\" : \" You will verify structurally against the `get_design_context` measurements, not a picture.\"}\n\nTarget:\n- fileKey: \\`${ctx.figma?.fileKey}\\`\n${ctx.figma?.nodeId ? `- node: \\`${ctx.figma.nodeId}\\`` : \"- (no node selected — use the full page)\"}\n\n${\n\tctx.figma?.nodeId\n\t\t? `Use node ID \\`${ctx.figma.nodeId}\\` in file \\`${ctx.figma.fileKey}\\`.`\n\t\t: `Use file key \\`${ctx.figma?.fileKey}\\` (no specific node selected — analyze the full page or ask the user to select a frame).`\n}`\n\t\t\t: `## Step 1 — Fetch the Design\nRead the design from **${providerName}** through your ${providerName} MCP connection (use its design-context / inspect / screenshot tools). Design reference: \\`${ctx.designRef ?? \"(the selected design)\"}\\`.\nExtract the **exact** structure, layout, colours, typography, spacing, radius and effects — do not approximate.${withScreenshot ? \" Capture a screenshot for the Step 5 pixel check.\" : \" No screenshot (token-lean) — verify structurally against the extracted values.\"}\n\n**Token efficiency:** fetch once for the target only.`;\n\n\tconst ueModelSection = ctx.withUeModel\n\t\t? `\n## Step 4b — Universal Editor Authoring (REQUIRED, not optional)\nAuthors must be able to drop and edit this block in the Universal Editor, so generate its UE configuration **in the same pass** as the code.\n\nCreate \\`blocks/${ctx.blockName}/_${ctx.blockName}.json\\` using the EDS block-plugin (xwalk) format with three top-level arrays:\n\n\\`\\`\\`json\n{\n \"definitions\": [\n {\n \"title\": \"<Human Title>\",\n \"id\": \"${ctx.blockName}\",\n \"plugins\": {\n \"xwalk\": {\n \"page\": {\n \"resourceType\": \"core/franklin/components/block/v1/block\",\n \"template\": { \"name\": \"<Human Title>\", \"model\": \"${ctx.blockName}\" }\n }\n }\n }\n }\n ],\n \"models\": [\n { \"id\": \"${ctx.blockName}\", \"fields\": [ /* one field per authorable piece of content */ ] }\n ],\n \"filters\": []\n}\n\\`\\`\\`\n\nDerive the **model fields from the Figma design**, not boilerplate. Pick the correct field \\`component\\` for each authorable element from the **full Universal Editor field catalog** (17 types) — do not default everything to text:\n\n| component | valueType | Use for |\n|---|---|---|\n| \\`text\\` | string | Single-line: titles, labels, alt text, short strings |\n| \\`textarea\\` | string | Multi-line plain text: descriptions, notes |\n| \\`richtext\\` | string | Formatted copy: body with bold/italic/lists/links |\n| \\`reference\\` | string | AEM asset (image/video/doc) from DAM. \\`multi:true\\` for many |\n| \\`aem-content\\` | any | Page link / URL / content path (content picker) |\n| \\`aem-content-fragment\\` | any | Content Fragment reference |\n| \\`aem-experience-fragment\\` | any | Experience Fragment reference |\n| \\`aem-tag\\` | string | Tag picker for categorization |\n| \\`select\\` | string | Single choice dropdown — **requires \\`options\\`** |\n| \\`multiselect\\` | string | Multiple choice (often \\`name:\"classes\"\\` → CSS variants) — **requires \\`options\\`** |\n| \\`checkbox-group\\` | string[] | Multiple independent toggles — **requires \\`options\\`** |\n| \\`radio-group\\` | string | Mutually exclusive choice — **requires \\`options\\`** |\n| \\`boolean\\` | boolean | Single on/off toggle |\n| \\`number\\` | number | Counts, limits (validation: \\`numberMin\\`/\\`numberMax\\`) |\n| \\`date-time\\` | date | Date/time picker |\n| \\`container\\` | any | Group nested \\`fields\\`; \\`multi:true\\` = repeatable items (cards/slides) |\n| \\`tab\\` | any | Organize the property panel into tabs (UI only, not data) |\n\nRules:\n- Every field needs \\`component\\`, \\`name\\`, \\`label\\`. Include the enforced \\`valueType\\` from the table. Add \\`value\\` (default), \\`description\\`, \\`required\\`, \\`condition\\` (JSON Logic) where useful.\n- \\`options\\` format for select/multiselect/checkbox-group/radio-group: \\`[{ \"name\": \"Display\", \"value\": \"stored\" }]\\` (multiselect also supports grouped \\`children\\`).\n- **Semantic collapsing** — name paired fields so EDS collapses them into one element:\n - \\`image\\` (reference) + \\`imageAlt\\` (text) → \\`<picture><img alt=\"…\">\\`\n - \\`link\\` (aem-content) + \\`linkText\\` (text) + \\`linkTitle\\` (text) + \\`linkType\\` (text) → \\`<a href title>text</a>\\`\n - \\`title\\` (text) + \\`titleType\\` (select h1–h6) → \\`<h2>title</h2>\\` at the chosen level\n - \\`classes\\` (multiselect) → values become CSS classes on the block root\n - fields prefixed \\`group_\\` share one cell\n- Map Figma **text layers**: headings → \\`title\\`+\\`titleType\\`; body → \\`richtext\\`; short labels → \\`text\\`.\n- Map **image/media layers** → \\`reference\\` (+ \\`imageAlt\\`). **Links/CTAs** → \\`link\\`/\\`linkText\\`.\n- Map **component variants** → a \\`multiselect\\` named \\`classes\\` (or a \\`select\\`) whose options are the variant values (e.g. Theme dark/light, Layout centered) → CSS modifier classes on the block root. Keep JS/CSS variant handling in sync.\n- **Repeatable groups** (card lists, carousels, tabs): either a \\`container\\` field with \\`multi:true\\` and nested \\`fields\\`, or — for true child blocks — a container definition (\\`template.filter\\`) + an item definition (resourceType \\`core/franklin/components/block/v1/block/item\\`) + a matching \\`filters\\` entry.\n- Field \\`name\\`s must match what \\`decorate()\\` reads from the authored DOM. No underscores in names when using xwalk (except the \\`group_\\` grouping prefix).\n\n**Make multifields and dropdowns actually work — the config is only half; \\`decorate()\\` MUST consume every field:**\n- **Repeatable items** (cards, slides, accordion, list rows) → model them as a **container block**, not a flat model: (a) a container definition whose \\`template\\` has a \\`\"filter\"\\` (not \\`\"model\"\\`), (b) an **item** definition with \\`\"resourceType\": \"core/franklin/components/block/v1/block/item\"\\` and its own \\`model\\`, (c) a \\`filters\\` entry \\`{ \"id\": \"${ctx.blockName}\", \"components\": [\"${ctx.blockName}-item\"] }\\`. The authored block renders **one row per item** — \\`decorate()\\` MUST iterate them: \\`[...block.children].forEach((row) => { /* build one card */ })\\`. A flat model with no iteration = a block that only ever shows one item.\n- **Inline repeatable group** (e.g. 2–3 CTAs inside a hero) → a \\`container\\` field with \\`\"multi\": true\\` and nested \\`fields\\` (no child-block needed).\n- **Dropdowns**: a \\`select\\`/\\`radio-group\\` value arrives as a cell in the authored DOM — read it in \\`decorate()\\` and act on it (e.g. read \\`titleType\\` and swap the heading tag to \\`h1..h6\\`). A \\`multiselect\\` named \\`classes\\` is applied as CSS classes on the block root automatically — just write \\`.${ctx.blockName}.<value>\\` styles; any other \\`multiselect\\`/\\`checkbox-group\\` arrives as a CSV cell you parse.\n- **Self-check before finishing:** every field \\`name\\` in the model must be read by \\`decorate()\\` (or applied via \\`classes\\`). List each field and where the JS/CSS consumes it. Unconsumed fields = broken authoring.\n\nIf the project uses a **single aggregated model file** (\\`component-definition.json\\` + \\`component-models.json\\` + \\`component-filters.json\\`) instead of per-block \\`_${ctx.blockName}.json\\`, detect that convention and add the block's definition/model/filter to those files instead (and register the block in the \\`section\\` filter). Prefer the per-block \\`_${ctx.blockName}.json\\` when neither exists. Full field reference and a repeatable-cards round-trip example: \\`docs/universal-editor-fields.md\\`.\n`\n\t\t: \"\";\n\n\treturn `# Pixel-Perfect EDS Block from ${providerName}\n\n## Task\nGenerate an AEM Edge Delivery Services block named **\\`${ctx.blockName}\\`** that reproduces the ${providerName} design **1:1 — pixel perfect**. Exact spacing, colors, typography, and layout. Not \"close enough\" — identical.\n\n${fetchSection}\n\n## Step 2 — Extract Exact Values\nFrom the design data you fetched, record the **precise** values — do not approximate:\n1. **Layout**: Auto Layout direction, gap, padding, alignment → Flexbox/Grid with exact \\`gap\\`/\\`padding\\`\n2. **Spacing**: every margin/padding in px — convert to \\`rem\\` (÷16) or reuse a matching project token\n3. **Colors**: exact hex / token for every fill, stroke, shadow — prefer bound variables over raw hex\n4. **Typography**: font-family, font-size, font-weight, line-height, letter-spacing per text layer. If the design uses a font **not already loaded by the project**, add it to the project's font pipeline (\\`styles/fonts.css\\` / \\`loadFonts\\` in \\`scripts/scripts.js\\`, or a \\`<link>\\` managed by EDS) — **never** \\`@import\\` or a third-party \\`<link>\\` inside the block CSS (it is render-blocking and fails the loading audit). Always declare a sensible fallback stack.\n5. **Dimensions**: fixed vs. fluid (\\`Fill\\`→fluid, \\`Hug\\`→auto, fixed px→fixed) and border-radius\n6. **Effects**: box-shadow, blur, opacity, gradients — replicate exactly\n\n## Step 3 — Map to Semantic EDS Structure\n- Map layer names/roles to semantic HTML (\\`<h1>\\`/\\`<h2>\\` by text-style level, \\`<p>\\`, \\`<a class=\"button\">\\`, \\`<picture>\\`, \\`<figure>\\`, \\`<nav>\\`…)\n- A \\`decorate(block)\\` function receives a \\`<div class=\"${ctx.blockName}\">\\` whose children are the **authored content** coming from the document (EDS block table rows → nested divs). Your job is to read that existing DOM and enhance/restructure it — **not** to hardcode copy.\n- Assume one row per logical content group; the first cell of each row holds the content. Normalize whatever markup EDS hands you.\n- Map Figma component **variant properties** to modifier classes on the block root (e.g. \\`Theme=dark\\` → \\`.${ctx.blockName}.dark\\`, \\`Layout=centered\\` → \\`.${ctx.blockName}.centered\\`). Read variants via metadata; handle each in CSS.\n- Follow any Figma **annotations** for behavior (autoplay, collapsed-by-default, load eagerly, truncation, tab order).\n\n## Step 4 — Generate Block Files\n\nCreate these files in \\`blocks/${ctx.blockName}/\\`:\n\n### \\`${ctx.blockName}.js\\`\n\\`\\`\\`javascript\n// EDS block: ${ctx.blockName}\n// Generated from Figma design\nexport default function decorate(block) {\n // - Vanilla JS only (no frameworks)\n // - Read the authored children already inside \\`block\\`; restructure into semantic HTML\n // - Add class names prefixed with \"${ctx.blockName}-\"\n // - Wire interactions from Figma annotations (if any)\n // - Eager-load above-fold images, lazy-load below-fold\n}\n\\`\\`\\`\n\n### \\`${ctx.blockName}.css\\`\n\\`\\`\\`css\n/* EDS block: ${ctx.blockName} */\n/* Map Figma design tokens to CSS custom properties; reuse project tokens below where they match */\n/* Mobile-first; exact values from Step 2 */\n\\`\\`\\`\n${ueModelSection}${contentSourceSection}\n## Placeholders & assets — be visible before Universal Editor takes over\nContent images and copy come from **authoring** (the document / DAM via UE), not the repo. Do **not** ship design-tool CDN URLs (Figma / Google Stitch links are short-lived) and do **not** bundle content photos into the repo.\n- In \\`decorate()\\`, read the image/text from the authored DOM. When none is present yet, render a lightweight **placeholder** so the block is visible *before* an author sets the real content: an inline SVG data-URI grey box (or a CSS placeholder) at the correct \\`aspect-ratio\\`, and sensible placeholder copy.\n- Provide the mock for the preview in \\`blocks/${ctx.blockName}/_${ctx.blockName}.preview.html\\` (used by \\`eds block preview\\`). Keep placeholder copy there, not hardcoded in the block.\n- Only bundle genuinely **static, decorative** assets (e.g. a small icon) as an optimized inline/\\`icons/\\` **SVG**, referenced by project-relative path. Never bundle authorable content images.\n- Always set \\`width\\`/\\`height\\` or \\`aspect-ratio\\` to avoid CLS.\n\n${verifyStep}\n\n## EDS Block Conventions\n- **Full-width by default**: the block/section spans the **full viewport width** (full-bleed) — never a fixed or centered fixed-width box. Constrain only the *inner content* to a sensible \\`max-width\\` (centered) for line-length/readability, with fluid horizontal padding. The design frame's width (e.g. 1280px) is the content cap, not the section width.\n- **Mobile-first & fluid**: base styles target the smallest screen; layer breakpoints upward. The section must look right at any width, not only the design frame's.\n- **No frameworks**: vanilla JS and CSS only\n- **\\`decorate(block)\\`**: enhance the authored DOM; never inject hardcoded copy that should be authored\n- **Semantic HTML**: correct elements and heading hierarchy\n- **Class naming**: prefix all classes with the block name: \\`.${ctx.blockName}-item\\`, \\`.${ctx.blockName}-title\\`\n- **Loading strategy**: eager (above-fold/hero), lazy (below-fold/carousels), delayed (analytics)\n- **Images**: always \\`alt\\` (empty for decorative), \\`<picture>\\` with WebP where applicable\n- **Accessibility**: ARIA where needed, keyboard navigation, focus states matching the design\n- **Performance**: no heavy dependencies, minimal DOM work, CSS for animations\n${tokensHint}\n\n## Output Requirements\n1. All files in \\`blocks/${ctx.blockName}/\\`${ctx.withUeModel ? ` — JS, CSS **and** the Universal Editor model (\\`_${ctx.blockName}.json\\`)` : \"\"}\n2. Production-ready, Lighthouse-friendly (aim for 100), no \\`console.log\\`\n3. Brief inline comments only for non-obvious logic\n4. **Minimise chat output (save tokens):** write the files directly with your editing tools — do **not** paste the generated code back into the chat, and skip step-by-step narration. End with a **≤3-line** summary: files created + any value you had to infer.\n5. Mobile-first CSS with breakpoints at 600px and 900px\n6. Prefer existing project tokens over new hardcoded values${ctx.withUeModel ? \"\\n7. UE model field `name`s must match what `decorate()` reads, and every Figma variant must appear as a select option wired to a CSS modifier\" : \"\"}\n\n---\n*Prompt version: ${PROMPT_VERSION}*\n`;\n}\n\nasync function getTokensHint(projectRoot: string): Promise<string> {\n\tconst stylesPath = path.join(projectRoot, \"styles\", \"styles.css\");\n\tif (!existsSync(stylesPath)) return \"\";\n\n\ttry {\n\t\tconst css = await readFile(stylesPath, \"utf-8\");\n\t\t// Extract CSS custom properties from :root\n\t\tconst rootMatch = css.match(/:root\\s*\\{([^}]+)\\}/);\n\t\tif (!rootMatch) return \"\";\n\n\t\tconst props = rootMatch[1]\n\t\t\t.split(\"\\n\")\n\t\t\t.filter((line) => line.trim().startsWith(\"--\"))\n\t\t\t.map((line) => line.trim())\n\t\t\t.join(\"\\n \");\n\n\t\tif (!props) return \"\";\n\n\t\treturn `\n## Existing Project Tokens\nThe project already defines these CSS custom properties in \\`styles/styles.css\\`.\nReuse them instead of hardcoding values:\n\n\\`\\`\\`css\n:root {\n ${props}\n}\n\\`\\`\\`\n`;\n\t} catch {\n\t\treturn \"\";\n\t}\n}\n","/**\n * Generates the in-memory HTML for `eds block preview`.\n *\n * Two documents are produced:\n * - `inner` — renders ONLY the block (authored content + its CSS + decorate).\n * Loaded inside an <iframe> whose width is the chosen breakpoint, so the\n * block's media queries fire against that width, not the real monitor.\n * - `outer` — neutral grayscale chrome: a breakpoint dropdown and an optional\n * \"Open in Figma\" link. Deliberately colourless so it never tints the\n * perception of the design being previewed.\n *\n * Asset paths are root-absolute (`/blocks/<name>/...`) so they resolve no\n * matter which route serves the HTML.\n */\n\nexport interface Breakpoint {\n\twidth: number;\n\tlabel: string;\n\t/** True if this width has a real Figma frame behind it (pixel-perfect). */\n\tfigma: boolean;\n}\n\nexport interface HarnessOptions {\n\tblockName: string;\n\tbreakpoints: Breakpoint[];\n\t/** Authored block markup (`<div class=\"<name> block\">…</div>`). */\n\tsampleContent: string;\n\tfigmaUrl?: string;\n\t/** Route the outer page points its iframe at. */\n\tframeRoute: string;\n\t/** True when sampleContent is a generated placeholder (shows a hint). */\n\tplaceholder?: boolean;\n}\n\nfunction esc(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nexport function buildInner(opts: HarnessOptions): string {\n\tconst { blockName, sampleContent } = opts;\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<link rel=\"stylesheet\" href=\"/blocks/${blockName}/${blockName}.css\" />\n<style>*{box-sizing:border-box}html,body{margin:0;padding:0}</style>\n</head>\n<body>\n${sampleContent}\n<script type=\"module\">\n import decorate from '/blocks/${blockName}/${blockName}.js';\n const block = document.querySelector('.${blockName}');\n if (block) { try { decorate(block); } catch (e) { console.error('decorate() failed:', e); } }\n</script>\n<script>\n // Live reload: refresh when eds detects a change to the block.\n try { new EventSource('/__eds_events').onmessage = () => location.reload(); } catch (e) { /* no SSE */ }\n</script>\n</body>\n</html>`;\n}\n\nexport function buildOuter(opts: HarnessOptions): string {\n\tconst { blockName, breakpoints, figmaUrl, frameRoute, placeholder } = opts;\n\n\t// Default to the widest Figma-referenced breakpoint, else the widest overall.\n\tconst figmaBps = breakpoints.filter((b) => b.figma);\n\tconst def = (figmaBps.length ? figmaBps : breakpoints).reduce(\n\t\t(m, b) => (b.width > m.width ? b : m),\n\t\tbreakpoints[0],\n\t);\n\n\tconst options = breakpoints\n\t\t.map(\n\t\t\t(b) =>\n\t\t\t\t`<option value=\"${b.width}\"${b.width === def.width ? \" selected\" : \"\"}>${esc(b.label)}</option>`,\n\t\t)\n\t\t.join(\"\\n \");\n\n\tconst figmaLink = figmaUrl\n\t\t? `<a class=\"figma-link\" href=\"${esc(figmaUrl)}\" target=\"_blank\" rel=\"noopener\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 3h6v6\"/><path d=\"M10 14 21 3\"/><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/></svg>\n Open in Figma\n </a>`\n\t\t: \"\";\n\n\tconst hint = placeholder\n\t\t? `<span class=\"hint\">placeholder content — add <code>blocks/${blockName}/_${blockName}.preview.html</code></span>`\n\t\t: \"\";\n\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<title>eds preview — ${esc(blockName)}</title>\n<style>\n *{box-sizing:border-box}\n html,body{margin:0;padding:0;background:#1f1f1f;color:#eaeaea;font-family:ui-sans-serif,-apple-system,\"Segoe UI\",sans-serif}\n .bar{position:sticky;top:0;z-index:10;display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:12px 18px;font-size:13px;background:#141414;border-bottom:1px solid #333}\n .bar .label{color:#8a8a8a;font-weight:600}\n .bar .block{color:#e6e6e6;font-weight:700}\n select#bp{appearance:none;cursor:pointer;color:#eaeaea;background:#232323;border:1px solid #3a3a3a;border-radius:8px;padding:7px 34px 7px 13px;font:inherit;font-size:12.5px;font-weight:600;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a8a8a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:14px}\n select#bp:hover{border-color:#6a6a6a;background-color:#2e2e2e}\n .hint{color:#8a8a8a;font-size:12px}\n .hint code{color:#bdbdbd}\n .figma-link{margin-left:auto;display:inline-flex;align-items:center;gap:7px;color:#cfcfcf;text-decoration:none;font-weight:600;font-size:12.5px;padding:7px 13px;border:1px solid #3a3a3a;border-radius:8px;background:#232323}\n .figma-link svg{width:15px;height:15px}\n .figma-link:hover{border-color:#6a6a6a;background:#2e2e2e;color:#fff}\n .stage{padding:30px 28px;display:flex;justify-content:center;overflow-x:auto}\n .device{position:relative;background:#fff;border:1px solid #000;transition:width .2s ease}\n .device::before{content:attr(data-w) \"px\";position:absolute;top:-20px;left:0;font-size:11px;color:#8a8a8a;font-family:ui-monospace,Menlo,monospace}\n iframe{display:block;width:100%;height:820px;border:0}\n</style>\n</head>\n<body>\n <div class=\"bar\">\n <span class=\"label\">Block</span><span class=\"block\">${esc(blockName)}</span>\n <label class=\"label\" for=\"bp\" style=\"margin-left:8px\">Breakpoint</label>\n <select id=\"bp\">\n ${options}\n <option value=\"full\">Full cała szerokość</option>\n </select>\n ${hint}\n ${figmaLink}\n </div>\n <div class=\"stage\">\n <div class=\"device\" id=\"device\" data-w=\"${def.width}\" style=\"width:${def.width}px\">\n <iframe id=\"frame\" src=\"${frameRoute}\" title=\"${esc(blockName)} preview\"></iframe>\n </div>\n </div>\n <script>\n const device = document.getElementById('device');\n const bp = document.getElementById('bp');\n function setWidth(w){\n if(w==='full'){device.style.width='100%';device.dataset.w=Math.round(device.getBoundingClientRect().width);}\n else{device.style.width=w+'px';device.dataset.w=w;}\n }\n bp.addEventListener('change',()=>setWidth(bp.value==='full'?'full':Number(bp.value)));\n setWidth(Number(bp.value));\n </script>\n</body>\n</html>`;\n}\n","import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport http from \"node:http\";\nimport path from \"node:path\";\n\nconst MIME: Record<string, string> = {\n\t\".html\": \"text/html; charset=utf-8\",\n\t\".js\": \"text/javascript; charset=utf-8\",\n\t\".mjs\": \"text/javascript; charset=utf-8\",\n\t\".css\": \"text/css; charset=utf-8\",\n\t\".json\": \"application/json; charset=utf-8\",\n\t\".svg\": \"image/svg+xml\",\n\t\".png\": \"image/png\",\n\t\".jpg\": \"image/jpeg\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".webp\": \"image/webp\",\n\t\".gif\": \"image/gif\",\n\t\".avif\": \"image/avif\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n\t\".ico\": \"image/x-icon\",\n};\n\nexport interface VirtualRoute {\n\tbody: string;\n\ttype: string;\n}\n\nexport interface PreviewServer {\n\turl: string;\n\tport: number;\n\t/** Push a reload to all connected browsers (live reload). */\n\treload: () => void;\n\tclose: () => Promise<void>;\n}\n\n/** Signature route so another `eds` run can detect a live preview server. */\nexport const PING_ROUTE = \"/__eds_ping\";\n/** Server-Sent Events route the harness subscribes to for live reload. */\nexport const EVENTS_ROUTE = \"/__eds_events\";\n\n/**\n * Serve `root` as static files, plus a set of in-memory virtual routes (the\n * generated harness HTML — no files are written to the user's project).\n * Tries `port`, falling back to the next few ports if taken.\n */\nexport function startServer(\n\troot: string,\n\troutes: Record<string, VirtualRoute>,\n\tport: number,\n\thost = \"127.0.0.1\",\n): Promise<PreviewServer> {\n\tconst resolvedRoot = path.resolve(root);\n\tconst clients = new Set<http.ServerResponse>();\n\n\tconst server = http.createServer((req, res) => {\n\t\tconst urlPath = decodeURIComponent((req.url ?? \"/\").split(\"?\")[0]);\n\n\t\t// Ping: lets another `eds` run detect an already-running preview server.\n\t\tif (urlPath === PING_ROUTE) {\n\t\t\tres.writeHead(200, { \"content-type\": \"application/json\" });\n\t\t\tres.end(JSON.stringify({ eds: true }));\n\t\t\treturn;\n\t\t}\n\n\t\t// Live-reload event stream (SSE).\n\t\tif (urlPath === EVENTS_ROUTE) {\n\t\t\tres.writeHead(200, {\n\t\t\t\t\"content-type\": \"text/event-stream\",\n\t\t\t\t\"cache-control\": \"no-cache\",\n\t\t\t\tconnection: \"keep-alive\",\n\t\t\t});\n\t\t\tres.write(\": connected\\n\\n\");\n\t\t\tclients.add(res);\n\t\t\treq.on(\"close\", () => clients.delete(res));\n\t\t\treturn;\n\t\t}\n\n\t\tconst route = routes[urlPath];\n\t\tif (route) {\n\t\t\tres.writeHead(200, { \"content-type\": route.type });\n\t\t\tres.end(route.body);\n\t\t\treturn;\n\t\t}\n\n\t\t// Static file from the project root (with path-traversal protection).\n\t\tconst filePath = path.join(resolvedRoot, urlPath);\n\t\tif (!filePath.startsWith(resolvedRoot)) {\n\t\t\tres.writeHead(403);\n\t\t\tres.end(\"Forbidden\");\n\t\t\treturn;\n\t\t}\n\t\tif (!existsSync(filePath) || !statSync(filePath).isFile()) {\n\t\t\tres.writeHead(404, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(`Not found: ${urlPath}`);\n\t\t\treturn;\n\t\t}\n\t\tres.writeHead(200, {\n\t\t\t\"content-type\": MIME[path.extname(filePath).toLowerCase()] ?? \"application/octet-stream\",\n\t\t});\n\t\tcreateReadStream(filePath).pipe(res);\n\t});\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet attempts = 0;\n\t\tconst tryListen = (p: number) => {\n\t\t\tserver.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tif (err.code === \"EADDRINUSE\" && attempts < 10) {\n\t\t\t\t\tattempts++;\n\t\t\t\t\ttryListen(p + 1);\n\t\t\t\t} else {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t});\n\t\t\tserver.listen(p, host, () => {\n\t\t\t\tresolve({\n\t\t\t\t\turl: `http://${host}:${p}/`,\n\t\t\t\t\tport: p,\n\t\t\t\t\treload: () => {\n\t\t\t\t\t\tfor (const c of clients) c.write(\"data: reload\\n\\n\");\n\t\t\t\t\t},\n\t\t\t\t\tclose: () =>\n\t\t\t\t\t\tnew Promise<void>((res) => {\n\t\t\t\t\t\t\tfor (const c of clients) c.end();\n\t\t\t\t\t\t\tserver.close(() => res());\n\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\t\ttryListen(port);\n\t});\n}\n","import { existsSync, watch } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../../lib/logger.js\";\nimport { type Breakpoint, buildInner, buildOuter } from \"../../lib/preview/harness.js\";\nimport { startServer } from \"../../lib/preview/server.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport * as ui from \"../../lib/ui.js\";\n\ninterface PreviewOptions {\n\tport?: string;\n\twidths?: string;\n\topen?: boolean; // commander sets open=false for --no-open\n}\n\nconst DEFAULT_WIDTHS = [375, 768, 1280];\n\nfunction labelFor(width: number): string {\n\tif (width <= 480) return `${width} mobile`;\n\tif (width <= 1024) return `${width} tablet`;\n\treturn `${width} desktop`;\n}\n\n/** Build breakpoints from --widths, else .eds-meta.json, else sane defaults. */\nfunction resolveBreakpoints(\n\twidthsFlag: string | undefined,\n\tmeta: Record<string, unknown> | null,\n): Breakpoint[] {\n\tif (widthsFlag) {\n\t\tconst widths = widthsFlag\n\t\t\t.split(\",\")\n\t\t\t.map((w) => Number.parseInt(w.trim(), 10))\n\t\t\t.filter((w) => Number.isFinite(w) && w > 0);\n\t\tif (widths.length) return widths.map((w) => ({ width: w, label: labelFor(w), figma: false }));\n\t}\n\n\tconst metaBps = meta?.breakpoints;\n\tif (Array.isArray(metaBps) && metaBps.length) {\n\t\treturn metaBps\n\t\t\t.map((b) => ({\n\t\t\t\twidth: Number(b.width),\n\t\t\t\tlabel: typeof b.label === \"string\" ? b.label : labelFor(Number(b.width)),\n\t\t\t\tfigma: b.source === \"figma\",\n\t\t\t}))\n\t\t\t.filter((b) => Number.isFinite(b.width) && b.width > 0);\n\t}\n\n\treturn DEFAULT_WIDTHS.map((w) => ({ width: w, label: labelFor(w), figma: false }));\n}\n\nfunction figmaUrlFromMeta(meta: Record<string, unknown> | null): string | undefined {\n\tif (!meta?.figmaFileKey || typeof meta.figmaFileKey !== \"string\") return undefined;\n\tconst node =\n\t\ttypeof meta.figmaNodeId === \"string\" ? meta.figmaNodeId.replace(\":\", \"-\") : undefined;\n\tconst base = `https://www.figma.com/design/${meta.figmaFileKey}/preview`;\n\treturn node ? `${base}?node-id=${node}` : base;\n}\n\nfunction defaultSample(blockName: string): string {\n\treturn `<div class=\"${blockName} block\">\n <div><div>\n <h2>${blockName} heading</h2>\n <p>Sample body copy for the preview. Replace with real authored content.</p>\n <p><a href=\"#\">Primary action</a></p>\n <p><a href=\"#\">Secondary action</a></p>\n </div></div>\n</div>`;\n}\n\nasync function openInBrowser(url: string): Promise<void> {\n\tconst cmd =\n\t\tprocess.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n\ttry {\n\t\tconst { execa } = await import(\"execa\");\n\t\tawait execa(cmd, [url], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n\t} catch {\n\t\t// Non-fatal — the URL is printed anyway.\n\t}\n}\n\nexport async function previewBlock(name: string, options: PreviewOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst blockDir = path.join(projectRoot, \"blocks\", name);\n\tif (!existsSync(blockDir)) {\n\t\tlogger.error(`Block \"${name}\" not found at blocks/${name}/.`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (\n\t\t!existsSync(path.join(blockDir, `${name}.css`)) &&\n\t\t!existsSync(path.join(blockDir, `${name}.js`))\n\t) {\n\t\tlogger.error(`Block \"${name}\" has no ${name}.css / ${name}.js to preview.`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Load metadata (breakpoints, Figma source) if present.\n\tlet meta: Record<string, unknown> | null = null;\n\tconst metaPath = path.join(blockDir, \".eds-meta.json\");\n\tif (existsSync(metaPath)) {\n\t\ttry {\n\t\t\tmeta = JSON.parse(await readFile(metaPath, \"utf-8\"));\n\t\t} catch {\n\t\t\t// ignore malformed meta\n\t\t}\n\t}\n\n\t// Sample authored content: _<name>.preview.html if provided, else a placeholder.\n\tconst samplePath = path.join(blockDir, `_${name}.preview.html`);\n\tlet sampleContent: string;\n\tlet placeholder = false;\n\tif (existsSync(samplePath)) {\n\t\tsampleContent = await readFile(samplePath, \"utf-8\");\n\t} else {\n\t\tsampleContent = defaultSample(name);\n\t\tplaceholder = true;\n\t}\n\n\tconst breakpoints = resolveBreakpoints(options.widths, meta);\n\tconst figmaUrl = figmaUrlFromMeta(meta);\n\tconst frameRoute = \"/__eds_preview_frame\";\n\n\tconst inner = buildInner({ blockName: name, breakpoints, sampleContent, frameRoute });\n\tconst outer = buildOuter({\n\t\tblockName: name,\n\t\tbreakpoints,\n\t\tsampleContent,\n\t\tfigmaUrl,\n\t\tframeRoute,\n\t\tplaceholder,\n\t});\n\n\tconst port = Number.parseInt(options.port ?? \"8777\", 10);\n\tconst server = await startServer(\n\t\tprojectRoot,\n\t\t{\n\t\t\t\"/\": { body: outer, type: \"text/html; charset=utf-8\" },\n\t\t\t[frameRoute]: { body: inner, type: \"text/html; charset=utf-8\" },\n\t\t},\n\t\tNumber.isFinite(port) ? port : 8777,\n\t);\n\n\tlogger.logoOnce(ui.logo(`Preview — ${name}`));\n\tlogger.info(ui.heading(\"Live preview\", server.url));\n\tlogger.info(\n\t\tui.statusLine(\n\t\t\t\"pass\",\n\t\t\t\"breakpoints\",\n\t\t\t`${breakpoints.map((b) => `${b.width}${b.figma ? \"✓\" : \"\"}`).join(\", \")}, Full`,\n\t\t),\n\t);\n\tif (placeholder) {\n\t\tlogger.info(\n\t\t\tui.statusLine(\n\t\t\t\t\"warn\",\n\t\t\t\t\"content\",\n\t\t\t\t`placeholder — add blocks/${name}/_${name}.preview.html for real content`,\n\t\t\t),\n\t\t);\n\t}\n\t// Live reload: watch the block folder and push a browser refresh on change.\n\tlet reloadTimer: NodeJS.Timeout | undefined;\n\tconst watcher = watch(blockDir, { recursive: true }, () => {\n\t\tclearTimeout(reloadTimer);\n\t\treloadTimer = setTimeout(() => server.reload(), 150);\n\t});\n\n\tlogger.info(\"\");\n\tlogger.info(` ${chalk.bold(\"➜\")} ${chalk.cyan(server.url)}`);\n\tlogger.info(ui.statusLine(\"pass\", \"live reload\", \"edits to the block refresh the browser\"));\n\tlogger.info(chalk.dim(\" Press Ctrl+C to stop.\\n\"));\n\n\tif (options.open !== false) await openInBrowser(server.url);\n\n\t// Keep running until interrupted.\n\tconst stop = async () => {\n\t\twatcher.close();\n\t\tawait server.close();\n\t\tprocess.exit(0);\n\t};\n\tprocess.on(\"SIGINT\", stop);\n\tprocess.on(\"SIGTERM\", stop);\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectAgent, detectAllAgents } from \"../../lib/agents/detect.js\";\nimport { invokeAgent, savePromptToFile } from \"../../lib/agents/invoke.js\";\nimport { loadConfig } from \"../../lib/config.js\";\nimport { parseFigmaUrl } from \"../../lib/figma/node-id.js\";\nimport {\n\ttype ContentSource,\n\ttype DesignProvider,\n\tPROMPT_VERSION,\n\tPROVIDER_NAMES,\n\tbuildPrompt,\n} from \"../../lib/figma/prompt-builder.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport { kebabCaseRegex } from \"../../lib/schemas.js\";\nimport * as ui from \"../../lib/ui.js\";\nimport type { AgentType, FigmaUrlParts } from \"../../types/index.js\";\n\ninterface FromDesignOptions {\n\tname?: string;\n\tagent?: string;\n\tdryRun?: boolean;\n\t/** Generate the Universal Editor model. Defaults to true (`--no-ue-model` disables). */\n\tueModel?: boolean;\n\tyes?: boolean;\n\t/** Where the block's content comes from (default: document). */\n\tsource?: ContentSource;\n\t/** Optional CF model / GraphQL persisted-query hint (cf/mixed). */\n\tcfHint?: string;\n\t/** Fetch a screenshot for pixel verification. Default true; `--no-screenshot` saves tokens. */\n\tscreenshot?: boolean;\n\t/** Auto-start the preview after generating. Default true; `--no-serve` disables. */\n\tserve?: boolean;\n\t/** Design source. Defaults to figma. */\n\tprovider?: DesignProvider;\n}\n\n/** Is an eds preview server already answering on this port? */\nasync function previewRunning(port = 8777): Promise<boolean> {\n\ttry {\n\t\tconst ctrl = new AbortController();\n\t\tconst t = setTimeout(() => ctrl.abort(), 400);\n\t\tconst res = await fetch(`http://127.0.0.1:${port}/__eds_ping`, { signal: ctrl.signal });\n\t\tclearTimeout(t);\n\t\tif (!res.ok) return false;\n\t\tconst data = (await res.json()) as { eds?: boolean };\n\t\treturn data?.eds === true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Interactive, step-by-step wizard used when `eds block from-design` is run\n * without a URL. Collects everything the flags would, including the content\n * source (document / UE / Content Fragment / mixed), then hands control back\n * to the normal flow. Returns null if the user cancels at the summary.\n */\nasync function runWizard(\n\tfigmaUrl: string | undefined,\n): Promise<(FromDesignOptions & { figmaUrl: string }) | null> {\n\tconst { input, select, confirm } = await import(\"@inquirer/prompts\");\n\n\tconst provider = (await select({\n\t\tmessage: \"1/7 Design source\",\n\t\tchoices: [\n\t\t\t{ name: \"Figma\", value: \"figma\" },\n\t\t\t{ name: \"Google Stitch\", value: \"stitch\" },\n\t\t\t{ name: \"Canva\", value: \"canva\" },\n\t\t\t{ name: \"Sketch\", value: \"sketch\" },\n\t\t],\n\t\tdefault: \"figma\",\n\t})) as DesignProvider;\n\n\tconst name = await input({\n\t\tmessage: \"2/7 Component name\",\n\t\tvalidate: (v) => kebabCaseRegex.test(v.trim()) || \"Use kebab-case, e.g. hero-banner\",\n\t});\n\n\tconst url =\n\t\tfigmaUrl ??\n\t\t(await input({\n\t\t\tmessage: `3/7 ${PROVIDER_NAMES[provider]} link`,\n\t\t\tvalidate: (v) => {\n\t\t\t\tif (!v.trim()) return \"Paste the design link\";\n\t\t\t\tif (provider !== \"figma\") return true;\n\t\t\t\ttry {\n\t\t\t\t\tparseFigmaUrl(v.trim());\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (err) {\n\t\t\t\t\treturn (err as Error).message;\n\t\t\t\t}\n\t\t\t},\n\t\t}));\n\n\tconst source = (await select({\n\t\tmessage: \"4/7 Where does the content come from?\",\n\t\tchoices: [\n\t\t\t{ name: \"Document authoring (default EDS)\", value: \"document\" },\n\t\t\t{ name: \"Universal Editor\", value: \"ue\" },\n\t\t\t{ name: \"Content Fragment\", value: \"cf\" },\n\t\t\t{ name: \"Mixed - Universal Editor + Content Fragment\", value: \"mixed\" },\n\t\t],\n\t\tdefault: \"document\",\n\t})) as ContentSource;\n\n\tlet cfHint: string | undefined;\n\tif (source === \"cf\" || source === \"mixed\") {\n\t\tconst hint = await input({\n\t\t\tmessage: \" CF model / GraphQL persisted-query name (optional)\",\n\t\t});\n\t\tcfHint = hint.trim() || undefined;\n\t}\n\n\tconst ueModel = await confirm({\n\t\tmessage: \"5/7 Generate the Universal Editor model?\",\n\t\tdefault: true,\n\t});\n\n\tconst screenshot = await confirm({\n\t\tmessage: \"6/7 Fetch a screenshot for a pixel-perfect check? (off = fewer tokens)\",\n\t\tdefault: true,\n\t});\n\n\tconst agents = await detectAllAgents();\n\tconst runMode = await select({\n\t\tmessage: \"7/7 Run with\",\n\t\tchoices: [\n\t\t\t...agents.map((a) => ({\n\t\t\t\tname: `${a.type}${provider === \"figma\" && !a.hasFigmaMcp ? \" (Figma MCP not detected)\" : \"\"}`,\n\t\t\t\tvalue: `agent:${a.type}`,\n\t\t\t})),\n\t\t\t{ name: \"Preview the prompt only (--dry-run)\", value: \"dry-run\" },\n\t\t\t{ name: \"Save the prompt, run it later (--agent none)\", value: \"none\" },\n\t\t],\n\t\tdefault: agents[0] ? `agent:${agents[0].type}` : \"dry-run\",\n\t});\n\n\tconst sourceLabel = PROVIDER_NAMES[provider].toLowerCase();\n\tlogger.info(ui.heading(\"Summary\"));\n\tconst w = ui.columnWidth([\"component\", sourceLabel, \"content\", \"ue model\", \"screenshot\", \"run\"]);\n\tlogger.info(ui.accentLine(\"component\", name, w));\n\tconst designRef =\n\t\tprovider === \"figma\"\n\t\t\t? (() => {\n\t\t\t\t\tconst parsed = parseFigmaUrl(url.trim());\n\t\t\t\t\treturn parsed.nodeId ? `node ${parsed.nodeId}` : parsed.fileKey;\n\t\t\t\t})()\n\t\t\t: url.trim();\n\tlogger.info(ui.accentLine(sourceLabel, designRef, w));\n\tlogger.info(ui.accentLine(\"content\", source + (cfHint ? ` (${cfHint})` : \"\"), w));\n\tlogger.info(ui.accentLine(\"ue model\", ueModel ? \"yes\" : \"no\", w));\n\tlogger.info(ui.accentLine(\"screenshot\", screenshot ? \"yes\" : \"no (token-lean)\", w));\n\tlogger.info(ui.accentLine(\"run\", runMode.replace(\"agent:\", \"\"), w));\n\tlogger.info(\"\");\n\n\tconst go = await confirm({ message: \"Generate this block?\", default: true });\n\tif (!go) return null;\n\n\tconst opts: FromDesignOptions & { figmaUrl: string } = {\n\t\tfigmaUrl: url.trim(),\n\t\tname,\n\t\tprovider,\n\t\tsource,\n\t\tcfHint,\n\t\tueModel,\n\t\tscreenshot,\n\t};\n\tif (runMode === \"dry-run\") opts.dryRun = true;\n\telse if (runMode === \"none\") opts.agent = \"none\";\n\telse {\n\t\topts.agent = runMode.replace(\"agent:\", \"\");\n\t\topts.yes = true;\n\t}\n\treturn opts;\n}\n\nfunction inferBlockName(fileName?: string): string {\n\tif (!fileName) return \"design-block\";\n\treturn (\n\t\tfileName\n\t\t\t.replace(/[-_\\s]+/g, \"-\")\n\t\t\t.replace(/[^a-z0-9-]/gi, \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/^-+|-+$/g, \"\") || \"design-block\"\n\t);\n}\n\nexport async function blockFromDesign(\n\tfigmaUrlArg: string | undefined,\n\toptionsArg: FromDesignOptions,\n): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\n\t\t\t\"Not inside an EDS project (no EDS project markers found). Run this from your project root.\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tawait logger.logoOnceAnimated(\"Design → EDS block\");\n\n\tlet designUrl = figmaUrlArg;\n\tlet options = optionsArg;\n\t// No URL given → run the interactive, step-by-step wizard.\n\tif (!designUrl) {\n\t\tconst wiz = await runWizard(designUrl);\n\t\tif (!wiz) {\n\t\t\tlogger.info(\"Cancelled.\");\n\t\t\treturn;\n\t\t}\n\t\tdesignUrl = wiz.figmaUrl;\n\t\toptions = { ...options, ...wiz };\n\t}\n\n\tconst provider = options.provider ?? \"figma\";\n\tconst providerName = PROVIDER_NAMES[provider];\n\n\t// Resolve the design reference. Figma links are parsed into file/node parts\n\t// (which feed the Figma MCP tools); every other provider passes its raw link\n\t// through as a reference the agent reads via that provider's own MCP.\n\tlet figma: FigmaUrlParts | null = null;\n\tconst designRef = designUrl;\n\tif (provider === \"figma\") {\n\t\tconst spinner = ora(\"Parsing Figma URL...\").start();\n\t\ttry {\n\t\t\tfigma = parseFigmaUrl(designUrl);\n\t\t\tspinner.succeed(\n\t\t\t\t`Parsed Figma URL ${chalk.dim(figma.nodeId ? `node ${figma.nodeId}` : `file ${figma.fileKey}`)}`,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tspinner.fail((err as Error).message);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlogger.info(` ${ui.icon.pass} ${providerName} design ${chalk.dim(designRef)}`);\n\t}\n\n\t// Determine block name. Non-Figma providers can't infer one from a file name,\n\t// so a name is required there.\n\tconst blockName = options.name || (figma ? inferBlockName(figma.fileName) : \"\");\n\tif (!kebabCaseRegex.test(blockName)) {\n\t\tlogger.error(\n\t\t\t`Invalid block name \"${blockName}\". Use --name with a kebab-case name (e.g., --name hero-banner).`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Build prompt (reads project design tokens from styles/styles.css)\n\tconst promptSpinner = ora(\"Reading design tokens & building prompt...\").start();\n\tconst prompt = await buildPrompt({\n\t\tprovider,\n\t\tfigma,\n\t\tdesignRef,\n\t\tblockName,\n\t\tprojectRoot,\n\t\twithUeModel: options.ueModel !== false,\n\t\tcontentSource: options.source ?? \"document\",\n\t\tcfHint: options.cfHint,\n\t\tscreenshot: options.screenshot !== false,\n\t});\n\tconst promptFile = await savePromptToFile(prompt, projectRoot);\n\tconst hasTokens = existsSync(path.join(projectRoot, \"styles\", \"styles.css\"));\n\tpromptSpinner.succeed(\n\t\thasTokens\n\t\t\t? `Loaded design tokens ${chalk.dim(\"styles/styles.css\")}`\n\t\t\t: `Built prompt ${chalk.dim(\"no project tokens found\")}`,\n\t);\n\tlogger.info(chalk.dim(` prompt → ${promptFile}`));\n\n\t// Dry run — stop here\n\tif (options.dryRun) {\n\t\tlogger.info(\"\");\n\t\tlogger.info(chalk.yellow(\"Dry run mode — prompt generated but agent not invoked.\"));\n\t\tlogger.info(`Prompt file: ${chalk.cyan(promptFile)}`);\n\t\tlogger.info(`Block name: ${chalk.cyan(blockName)}`);\n\t\tlogger.info(`Prompt version: ${PROMPT_VERSION}`);\n\t\tlogger.info(\"\");\n\t\tlogger.info(\"Preview:\");\n\t\tlogger.info(chalk.dim(\"─\".repeat(60)));\n\t\tconsole.log(prompt);\n\t\treturn;\n\t}\n\n\t// Detect agent\n\tconst config = await loadConfig(projectRoot);\n\tconst preferredAgent = (options.agent as AgentType) || config.agent;\n\n\tif (options.agent === \"none\") {\n\t\tlogger.info(\"Agent skipped (--agent none). Use the prompt file manually:\");\n\t\tlogger.info(` ${chalk.cyan(promptFile)}`);\n\t\treturn;\n\t}\n\n\tconst agentSpinner = ora(\"Detecting AI agent...\").start();\n\tconst agent = await detectAgent(preferredAgent);\n\n\tif (!agent) {\n\t\tagentSpinner.fail(\"No AI agent found (claude, cursor, or codex).\");\n\t\tlogger.info(`Install Claude Code: ${chalk.cyan(\"npm install -g @anthropic-ai/claude-code\")}`);\n\t\tlogger.info(`Or use the prompt file manually: ${chalk.cyan(promptFile)}`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tagentSpinner.succeed(`Agent ready ${chalk.cyan(agent.type)} ${chalk.dim(agent.path)}`);\n\n\tif (provider === \"figma\" && !agent.hasFigmaMcp) {\n\t\tlogger.warn(`Figma MCP may not be configured for ${agent.type}.`);\n\t\tlogger.info(`Run ${chalk.cyan(\"eds figma setup\")} to configure it.`);\n\t}\n\n\t// Confirm with user unless --yes\n\tif (!options.yes) {\n\t\tconst { confirm } = await import(\"@inquirer/prompts\");\n\t\tconst proceed = await confirm({\n\t\t\tmessage: `Run ${agent.type} with the generated prompt?`,\n\t\t\tdefault: true,\n\t\t});\n\t\tif (!proceed) {\n\t\t\tlogger.info(`Prompt saved to: ${chalk.cyan(promptFile)}`);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Hand off to the agent (mirrors the flow shown on the landing page).\n\tlogger.info(\n\t\t` ${chalk.dim(\"→\")} Handing off to ${chalk.cyan(agent.type)} ${chalk.dim(`via ${providerName} MCP`)}`,\n\t);\n\tif (provider === \"figma\") {\n\t\tlogger.info(chalk.dim(\" get_design_context · get_variable_defs · get_screenshot\"));\n\t}\n\n\t// Invoke agent\n\tconst success = await invokeAgent(agent, promptFile, projectRoot);\n\n\tif (!success) {\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Verify what the agent actually produced before declaring success.\n\tconst blockDir = path.join(projectRoot, \"blocks\", blockName);\n\tconst ok = await verifyGeneratedBlock(blockDir, blockName, options.ueModel !== false);\n\n\t// Post-process: save .eds-meta.json\n\tif (existsSync(blockDir)) {\n\t\tconst meta = {\n\t\t\tprovider,\n\t\t\tdesignRef,\n\t\t\tfigmaFileKey: figma?.fileKey ?? null,\n\t\t\tfigmaNodeId: figma?.nodeId ?? null,\n\t\t\tlastSyncedAt: new Date().toISOString(),\n\t\t\tpromptVersion: PROMPT_VERSION,\n\t\t\tagentUsed: agent.type,\n\t\t};\n\t\tawait writeFile(path.join(blockDir, \".eds-meta.json\"), `${JSON.stringify(meta, null, 2)}\\n`);\n\t}\n\n\tif (!ok) {\n\t\tlogger.warn(\n\t\t\t`Block \"${blockName}\" generated with issues — review the output above before publishing.`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tlogger.success(`Block \"${blockName}\" generation complete.`);\n\n\t// Auto-start the live preview. If one is already running, leave it — its\n\t// file watcher refreshes the browser when the generated files change.\n\tif (options.serve !== false) {\n\t\tif (await previewRunning()) {\n\t\t\tlogger.info(\n\t\t\t\tchalk.dim(\n\t\t\t\t\t\" A preview server is already running at http://127.0.0.1:8777 — your change will refresh there.\",\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tlogger.info(\"\");\n\t\t\tconst { previewBlock } = await import(\"./preview.js\");\n\t\t\tawait previewBlock(blockName, {});\n\t\t}\n\t} else {\n\t\tlogger.info(` ${chalk.dim(\"→\")} Next: ${chalk.cyan(`eds block preview ${blockName}`)}`);\n\t}\n}\n\n/**\n * Sanity-check the files the agent wrote: core files present, JS exports a\n * decorator, CSS is scoped to the block, no stray debug logging. Prints an\n * aligned report and returns false if any hard check fails.\n */\nasync function verifyGeneratedBlock(\n\tblockDir: string,\n\tblockName: string,\n\twithUeModel: boolean,\n): Promise<boolean> {\n\tconst checks: { status: ui.Status; name: string; message: string }[] = [];\n\tconst jsPath = path.join(blockDir, `${blockName}.js`);\n\tconst cssPath = path.join(blockDir, `${blockName}.css`);\n\n\tconst hasJs = existsSync(jsPath);\n\tconst hasCss = existsSync(cssPath);\n\tchecks.push({\n\t\tstatus: hasJs ? \"pass\" : \"fail\",\n\t\tname: `${blockName}.js`,\n\t\tmessage: hasJs ? \"created\" : \"missing — agent did not write the JS file\",\n\t});\n\tchecks.push({\n\t\tstatus: hasCss ? \"pass\" : \"fail\",\n\t\tname: `${blockName}.css`,\n\t\tmessage: hasCss ? \"created\" : \"missing — agent did not write the CSS file\",\n\t});\n\n\tif (hasJs) {\n\t\tconst js = await readFile(jsPath, \"utf-8\");\n\t\tchecks.push({\n\t\t\tstatus: /export\\s+default/.test(js) ? \"pass\" : \"fail\",\n\t\t\tname: \"decorate export\",\n\t\t\tmessage: /export\\s+default/.test(js) ? \"found\" : \"no default export — block won't load\",\n\t\t});\n\t\tif (js.includes(\"console.log\")) {\n\t\t\tchecks.push({\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tname: \"no console.log\",\n\t\t\t\tmessage: \"found console.log — remove before production\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hasCss) {\n\t\tconst css = await readFile(cssPath, \"utf-8\");\n\t\tchecks.push({\n\t\t\tstatus: css.includes(`.${blockName}`) ? \"pass\" : \"warn\",\n\t\t\tname: \"scoped CSS\",\n\t\t\tmessage: css.includes(`.${blockName}`)\n\t\t\t\t? `scoped to .${blockName}`\n\t\t\t\t: `no .${blockName} selector — styles may leak`,\n\t\t});\n\t}\n\n\tif (withUeModel) {\n\t\tconst hasPerBlock = existsSync(path.join(blockDir, `_${blockName}.json`));\n\t\t// Accept an aggregated model file that references this block, too.\n\t\tconst modelsFile = path.join(blockDir, \"..\", \"..\", \"component-models.json\");\n\t\tlet hasAggregated = false;\n\t\tif (!hasPerBlock && existsSync(modelsFile)) {\n\t\t\ttry {\n\t\t\t\thasAggregated = (await readFile(modelsFile, \"utf-8\")).includes(`\"${blockName}\"`);\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\t\tconst hasModel = hasPerBlock || hasAggregated;\n\t\tchecks.push({\n\t\t\tstatus: hasModel ? \"pass\" : \"warn\",\n\t\t\tname: \"Universal Editor model\",\n\t\t\tmessage: hasModel\n\t\t\t\t? hasPerBlock\n\t\t\t\t\t? `_${blockName}.json created`\n\t\t\t\t\t: \"added to component-models.json\"\n\t\t\t\t: `missing — no _${blockName}.json (run with default UE generation, or --no-ue-model to skip)`,\n\t\t});\n\n\t\t// Multifield guardrail: a repeatable (container) model whose decorate()\n\t\t// doesn't iterate block.children will only ever render one item.\n\t\tif (hasPerBlock && hasJs) {\n\t\t\ttry {\n\t\t\t\tconst modelRaw = await readFile(path.join(blockDir, `_${blockName}.json`), \"utf-8\");\n\t\t\t\tconst js = await readFile(jsPath, \"utf-8\");\n\t\t\t\tconst isRepeatable =\n\t\t\t\t\t/\"resourceType\"\\s*:\\s*\"[^\"]*\\/item\"/.test(modelRaw) ||\n\t\t\t\t\t/\"filter\"\\s*:/.test(modelRaw) ||\n\t\t\t\t\t/\"multi\"\\s*:\\s*true/.test(modelRaw);\n\t\t\t\tconst iterates =\n\t\t\t\t\t/\\.children/.test(js) || /\\bfor\\s*\\(/.test(js) || /\\.forEach\\s*\\(/.test(js);\n\t\t\t\tif (isRepeatable) {\n\t\t\t\t\tchecks.push({\n\t\t\t\t\t\tstatus: iterates ? \"pass\" : \"warn\",\n\t\t\t\t\t\tname: \"multifield wired\",\n\t\t\t\t\t\tmessage: iterates\n\t\t\t\t\t\t\t? \"decorate() iterates items\"\n\t\t\t\t\t\t\t: \"repeatable model but decorate() never iterates block.children — only one item will render\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\t}\n\n\tlogger.info(ui.heading(\"Verification\"));\n\tconst nameWidth = ui.columnWidth(checks.map((c) => c.name));\n\tfor (const c of checks) {\n\t\tlogger.info(ui.statusLine(c.status, c.name, c.message, nameWidth));\n\t}\n\tlogger.info(\"\");\n\n\treturn !checks.some((c) => c.status === \"fail\");\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../../lib/logger.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport * as ui from \"../../lib/ui.js\";\n\ninterface BlockInfo {\n\tname: string;\n\thasJs: boolean;\n\thasCss: boolean;\n\thasUeModel: boolean;\n\tfigmaSource?: {\n\t\tfileKey: string;\n\t\tnodeId?: string;\n\t\tlastSyncedAt: string;\n\t};\n}\n\ninterface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function listBlocks(options: ListOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst blocksDir = path.join(projectRoot, \"blocks\");\n\tif (!existsSync(blocksDir)) {\n\t\tlogger.info(\"No blocks/ directory found.\");\n\t\treturn;\n\t}\n\n\tconst entries = await readdir(blocksDir, { withFileTypes: true });\n\tconst blocks: BlockInfo[] = [];\n\n\tfor (const entry of entries) {\n\t\tif (!entry.isDirectory()) continue;\n\t\tconst name = entry.name;\n\t\tconst blockDir = path.join(blocksDir, name);\n\n\t\tconst info: BlockInfo = {\n\t\t\tname,\n\t\t\thasJs: existsSync(path.join(blockDir, `${name}.js`)),\n\t\t\thasCss: existsSync(path.join(blockDir, `${name}.css`)),\n\t\t\thasUeModel: existsSync(path.join(blockDir, `_${name}.json`)),\n\t\t};\n\n\t\tconst metaFile = path.join(blockDir, \".eds-meta.json\");\n\t\tif (existsSync(metaFile)) {\n\t\t\ttry {\n\t\t\t\tconst meta = JSON.parse(await readFile(metaFile, \"utf-8\"));\n\t\t\t\tinfo.figmaSource = {\n\t\t\t\t\tfileKey: meta.figmaFileKey,\n\t\t\t\t\tnodeId: meta.figmaNodeId,\n\t\t\t\t\tlastSyncedAt: meta.lastSyncedAt,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\t// skip invalid meta\n\t\t\t}\n\t\t}\n\n\t\tblocks.push(info);\n\t}\n\n\tif (options.json) {\n\t\tconsole.log(JSON.stringify(blocks, null, 2));\n\t\treturn;\n\t}\n\n\tif (blocks.length === 0) {\n\t\tlogger.info(\"No blocks found.\");\n\t\treturn;\n\t}\n\n\tlogger.info(ui.heading(\"Blocks\", `${blocks.length} in project`));\n\n\tconst nameWidth = ui.columnWidth(blocks.map((b) => b.name));\n\tfor (const b of blocks) {\n\t\tconst badges = [\n\t\t\tb.hasJs ? ui.brand.ok(\"js\") : chalk.dim.strikethrough(\"js\"),\n\t\t\tb.hasCss ? ui.brand.ok(\"css\") : chalk.dim.strikethrough(\"css\"),\n\t\t];\n\t\tif (b.hasUeModel) badges.push(ui.brand.blue(\"ue-model\"));\n\t\tif (b.figmaSource) badges.push(`${ui.icon.figma} ${ui.brand.dotPurple(\"figma\")}`);\n\n\t\tconst name = ui.padEndVisible(chalk.bold(b.name), nameWidth);\n\t\tlogger.info(` ${name} ${chalk.dim(\"[\")}${badges.join(\" \")}${chalk.dim(\"]\")}`);\n\n\t\tif (b.figmaSource) {\n\t\t\tconst synced = new Date(b.figmaSource.lastSyncedAt).toLocaleDateString();\n\t\t\tlogger.info(\n\t\t\t\t` ${\" \".repeat(nameWidth)} ${ui.icon.arrow} ${chalk.dim(\n\t\t\t\t\t`figma:${b.figmaSource.fileKey} · synced ${synced}`,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tlogger.info(\"\");\n}\n","/**\n * Third-party integration templates for EDS. Everything here is appended to\n * `scripts/delayed.js` so it loads in the delayed phase (after LCP, non-blocking)\n * per EDS performance best practices. Heavy widgets (chat) use the facade\n * pattern — a lightweight trigger that loads the real script on first interaction.\n */\n\nexport interface IntegrationField {\n\tname: string;\n\tmessage: string;\n\tplaceholder?: string;\n}\n\nexport interface Integration {\n\tid: string;\n\tname: string;\n\tfields: IntegrationField[];\n\tcode: (v: Record<string, string>) => string;\n}\n\nexport const INTEGRATIONS: Integration[] = [\n\t{\n\t\tid: \"gtm\",\n\t\tname: \"Google Tag Manager\",\n\t\tfields: [{ name: \"id\", message: \"GTM container ID\", placeholder: \"GTM-XXXXXXX\" }],\n\t\tcode: (v) => `// Google Tag Manager (${v.id}) — delayed phase, after LCP.\n(function (w, d, s, l, i) {\n w[l] = w[l] || [];\n w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });\n const f = d.getElementsByTagName(s)[0];\n const j = d.createElement(s);\n j.async = true;\n j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i;\n f.parentNode.insertBefore(j, f);\n})(window, document, 'script', 'dataLayer', '${v.id}');`,\n\t},\n\t{\n\t\tid: \"ga4\",\n\t\tname: \"Google Analytics 4\",\n\t\tfields: [{ name: \"id\", message: \"Measurement ID\", placeholder: \"G-XXXXXXXXXX\" }],\n\t\tcode: (v) => `// Google Analytics 4 (${v.id}) — delayed phase.\nconst gaScript = document.createElement('script');\ngaScript.async = true;\ngaScript.src = 'https://www.googletagmanager.com/gtag/js?id=${v.id}';\ndocument.head.appendChild(gaScript);\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag() { window.dataLayer.push(arguments); }\ngtag('js', new Date());\ngtag('config', '${v.id}');`,\n\t},\n\t{\n\t\tid: \"chat\",\n\t\tname: \"Chat widget (facade)\",\n\t\tfields: [\n\t\t\t{ name: \"label\", message: \"Button label\", placeholder: \"Chat with us\" },\n\t\t\t{ name: \"src\", message: \"Chat widget script URL\" },\n\t\t],\n\t\tcode: (v) => `// Chat widget — facade pattern: load the heavy script only on first interaction.\nconst chatBtn = document.createElement('button');\nchatBtn.type = 'button';\nchatBtn.className = 'chat-facade';\nchatBtn.textContent = ${JSON.stringify(v.label || \"Chat\")};\nchatBtn.addEventListener('click', () => {\n const s = document.createElement('script');\n s.async = true;\n s.src = ${JSON.stringify(v.src || \"\")};\n document.body.appendChild(s);\n chatBtn.remove();\n}, { once: true });\ndocument.body.appendChild(chatBtn);`,\n\t},\n\t{\n\t\tid: \"cookiebot\",\n\t\tname: \"Cookie consent (Cookiebot)\",\n\t\tfields: [{ name: \"id\", message: \"Cookiebot domain group ID (CBID)\" }],\n\t\tcode: (\n\t\t\tv,\n\t\t) => `// Cookiebot consent — load early in delayed; configure GTM consent mode to respect it.\nconst cb = document.createElement('script');\ncb.id = 'Cookiebot';\ncb.src = 'https://consent.cookiebot.com/uc.js';\ncb.setAttribute('data-cbid', '${v.id}');\ncb.async = true;\ndocument.head.appendChild(cb);`,\n\t},\n\t{\n\t\tid: \"custom\",\n\t\tname: \"Custom third-party script\",\n\t\tfields: [{ name: \"url\", message: \"Script URL\" }],\n\t\tcode: (v) => `// Custom third-party script — delayed phase.\nconst s = document.createElement('script');\ns.async = true;\ns.src = ${JSON.stringify(v.url || \"\")};\ndocument.head.appendChild(s);`,\n\t},\n];\n\nexport function integrationById(id: string): Integration | undefined {\n\treturn INTEGRATIONS.find((i) => i.id === id);\n}\n\n/** Wrap generated code in a marked block for `scripts/delayed.js`. */\nexport function wrapBlock(name: string, code: string): string {\n\treturn `\\n// ── ${name} (eds integrate) ──────────────────────────────\\n{\\n${code\n\t\t.split(\"\\n\")\n\t\t.map((l) => (l ? ` ${l}` : l))\n\t\t.join(\"\\n\")}\\n}\\n`;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { INTEGRATIONS, integrationById, wrapBlock } from \"../lib/integrations.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\nconst DELAYED_HEADER = `// delayed.js — third-party / non-critical scripts.\n// Loaded in the EDS delayed phase (after LCP), so nothing here blocks the page.\n`;\n\n/**\n * `eds integrate [type]` — interactively add a third-party service (GTM, GA4,\n * chat facade, consent, custom) to scripts/delayed.js, the EDS-correct place\n * for non-critical third-party code.\n */\nexport async function integrate(type: string | undefined): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Integrate — third-party service\"));\n\n\tconst { select, input } = await import(\"@inquirer/prompts\");\n\n\tconst chosenId =\n\t\ttype ||\n\t\t(await select({\n\t\t\tmessage: \"Which service do you want to add?\",\n\t\t\tchoices: INTEGRATIONS.map((i) => ({ name: i.name, value: i.id })),\n\t\t}));\n\n\tconst integration = integrationById(chosenId);\n\tif (!integration) {\n\t\tlogger.error(\n\t\t\t`Unknown integration \"${chosenId}\". Options: ${INTEGRATIONS.map((i) => i.id).join(\", \")}`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst values: Record<string, string> = {};\n\tfor (const f of integration.fields) {\n\t\tconst answer = await input({ message: ` ${f.message}`, default: f.placeholder });\n\t\tvalues[f.name] = answer.trim();\n\t}\n\n\tconst block = wrapBlock(integration.name, integration.code(values));\n\n\tconst delayedPath = path.join(projectRoot, \"scripts\", \"delayed.js\");\n\tawait mkdir(path.dirname(delayedPath), { recursive: true });\n\tconst existing = existsSync(delayedPath) ? await readFile(delayedPath, \"utf-8\") : DELAYED_HEADER;\n\tawait writeFile(delayedPath, `${existing.replace(/\\s*$/, \"\")}\\n${block}`);\n\n\tlogger.info(ui.heading(\"Added\"));\n\tlogger.info(ui.accentLine(integration.name, \"→ scripts/delayed.js\"));\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tchalk.dim(\" Loads after LCP (delayed phase) — zero impact on your Core Web Vitals.\"),\n\t);\n\tif (integration.id === \"gtm\" || integration.id === \"ga4\") {\n\t\tlogger.info(\n\t\t\tchalk.dim(\" Tip: gate analytics behind user consent (add the Cookiebot integration).\"),\n\t\t);\n\t}\n\tif (integration.id === \"chat\") {\n\t\tlogger.info(\n\t\t\tchalk.dim(\" The widget loads only when the visitor clicks the button (facade pattern).\"),\n\t\t);\n\t}\n\tlogger.info(\"\");\n\tlogger.info(ui.box([\"Integration added\"]));\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport { detectAgent, detectAllAgents } from \"../../lib/agents/detect.js\";\nimport { globalConfigDir, globalConfigPath, loadConfig } from \"../../lib/config.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport * as ui from \"../../lib/ui.js\";\n\nexport async function figmaSetup(): Promise<void> {\n\tconst { select, confirm } = await import(\"@inquirer/prompts\");\n\n\tlogger.logoOnce(ui.logo());\n\tlogger.info(ui.heading(\"Figma MCP Setup Wizard\"));\n\n\t// Step 1: Detect agents\n\tlogger.info(\"Detecting installed AI agents...\");\n\tconst agents = await detectAllAgents();\n\n\tlet selectedAgent: string;\n\n\tif (agents.length === 0) {\n\t\tlogger.warn(\"No AI agents found (claude, cursor, codex).\");\n\t\tlogger.info(`Install Claude Code: ${chalk.cyan(\"npm install -g @anthropic-ai/claude-code\")}`);\n\t\tselectedAgent = \"none\";\n\t} else {\n\t\tlogger.success(`Found: ${agents.map((a) => chalk.cyan(a.type)).join(\", \")}`);\n\n\t\tselectedAgent = await select({\n\t\t\tmessage: \"Which agent do you want to use with eds-cli?\",\n\t\t\tchoices: [\n\t\t\t\t...agents.map((a) => ({\n\t\t\t\t\tname: `${a.type}${a.hasFigmaMcp ? chalk.green(\" (Figma MCP detected)\") : \"\"}`,\n\t\t\t\t\tvalue: a.type,\n\t\t\t\t})),\n\t\t\t\t{ name: \"None (manual mode)\", value: \"none\" },\n\t\t\t],\n\t\t});\n\t}\n\n\t// Step 2: Check Figma MCP\n\tif (selectedAgent !== \"none\") {\n\t\tconst agent = agents.find((a) => a.type === selectedAgent);\n\t\tif (agent && !agent.hasFigmaMcp) {\n\t\t\tlogger.warn(`Figma MCP is not configured for ${selectedAgent}.\\n`);\n\t\t\tlogger.info(\"Install it with one of these methods:\\n\");\n\n\t\t\tswitch (selectedAgent) {\n\t\t\t\tcase \"claude\":\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t` ${chalk.cyan(\"claude mcp add --transport sse figma-sse https://mcp.figma.com/sse\")}`,\n\t\t\t\t\t);\n\t\t\t\t\tlogger.info(\" or for Figma Desktop app:\");\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t` ${chalk.cyan(\"claude mcp add --transport http figma-desktop http://127.0.0.1:3845/mcp\")}`,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"cursor\":\n\t\t\t\t\tlogger.info(` Add to ${chalk.cyan(\"~/.cursor/mcp.json\")}:`);\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\tchalk.dim(\n\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmcpServers: {\n\t\t\t\t\t\t\t\t\t\tfigma: { url: \"https://mcp.figma.com/sse\" },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"codex\":\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\" See Figma MCP docs: https://help.figma.com/hc/en-us/articles/32132100833559\",\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlogger.info(\"\");\n\t\t} else if (agent?.hasFigmaMcp) {\n\t\t\tlogger.success(`Figma MCP is already configured for ${selectedAgent}!`);\n\t\t}\n\t}\n\n\t// Step 3: Figma seat info\n\tlogger.info(\n\t\tchalk.dim(\n\t\t\t\"\\nNote: Figma MCP requires a Figma seat (Dev or Full on paid plans for desktop server).\",\n\t\t),\n\t);\n\n\t// Step 4: Save config\n\tconst shouldSave = await confirm({\n\t\tmessage: \"Save preferences to ~/.eds/config.json?\",\n\t\tdefault: true,\n\t});\n\n\tif (shouldSave) {\n\t\tconst configDir = globalConfigDir();\n\t\tif (!existsSync(configDir)) {\n\t\t\tawait mkdir(configDir, { recursive: true });\n\t\t}\n\n\t\tconst config: Record<string, unknown> = {};\n\t\tif (selectedAgent !== \"none\") {\n\t\t\tconfig.agent = selectedAgent;\n\t\t}\n\n\t\tawait writeFile(globalConfigPath(), `${JSON.stringify(config, null, 2)}\\n`, {\n\t\t\tmode: 0o600,\n\t\t});\n\t\tlogger.success(`Config saved to ${chalk.cyan(globalConfigPath())}`);\n\t}\n\n\tlogger.info(chalk.bold(\"\\nSetup complete!\"));\n\tif (selectedAgent !== \"none\") {\n\t\tlogger.info(`Try: ${chalk.cyan('eds block from-design \"<figma-url>\" --dry-run')}`);\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { globalConfigExists } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { detectProject, findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\nimport type { DoctorCheckResult } from \"../types/index.js\";\n\ninterface DoctorOptions {\n\tjson?: boolean;\n}\n\nexport async function doctor(options: DoctorOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst project = detectProject(projectRoot);\n\tif (!options.json) {\n\t\tlogger.logoOnce(ui.logo(\"Doctor\"));\n\t\tlogger.info(ui.heading(\"Doctor\", projectRoot));\n\t}\n\n\tconst results: DoctorCheckResult[] = [];\n\n\t// Check fstab.yaml. Not a hard failure: Universal Editor / crosswalk and\n\t// Document Authoring projects legitimately have no fstab, so missing is a\n\t// warning, not a fail (which would otherwise break CI for those projects).\n\tresults.push({\n\t\tname: \"fstab.yaml exists\",\n\t\tstatus: project.hasFstab ? \"pass\" : \"warn\",\n\t\tmessage: project.hasFstab\n\t\t\t? \"Found\"\n\t\t\t: \"Missing - fine for Universal Editor / DA; required for document-mounted setups\",\n\t});\n\n\t// Check fstab.yaml is valid YAML\n\tif (project.hasFstab) {\n\t\ttry {\n\t\t\tconst content = await readFile(path.join(projectRoot, \"fstab.yaml\"), \"utf-8\");\n\t\t\tparseYaml(content);\n\t\t\tresults.push({ name: \"fstab.yaml valid YAML\", status: \"pass\", message: \"Valid\" });\n\t\t} catch {\n\t\t\tresults.push({\n\t\t\t\tname: \"fstab.yaml valid YAML\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"Invalid YAML syntax\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check head.html\n\tresults.push({\n\t\tname: \"head.html exists\",\n\t\tstatus: project.hasHeadHtml ? \"pass\" : \"warn\",\n\t\tmessage: project.hasHeadHtml ? \"Found\" : \"Missing - recommended for metadata/scripts\",\n\t});\n\n\t// Check blocks directory\n\tresults.push({\n\t\tname: \"blocks/ directory\",\n\t\tstatus: project.hasBlocks ? \"pass\" : \"warn\",\n\t\tmessage: project.hasBlocks ? \"Found\" : \"Missing - no blocks yet\",\n\t});\n\n\t// Check each block has a JS file\n\tif (project.hasBlocks) {\n\t\tconst blocksDir = path.join(projectRoot, \"blocks\");\n\t\tconst entries = await readdir(blocksDir, { withFileTypes: true });\n\n\t\t// An aggregated UE model file (if the project uses one) can hold models\n\t\t// for many blocks - read it once so per-block checks can look inside.\n\t\tlet aggregatedModels = \"\";\n\t\tconst aggregatedPath = path.join(projectRoot, \"component-models.json\");\n\t\tif (existsSync(aggregatedPath)) {\n\t\t\ttry {\n\t\t\t\taggregatedModels = await readFile(aggregatedPath, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!entry.isDirectory()) continue;\n\t\t\tconst blockName = entry.name;\n\t\t\tconst jsFile = path.join(blocksDir, blockName, `${blockName}.js`);\n\t\t\tconst hasJs = existsSync(jsFile);\n\t\t\tresults.push({\n\t\t\t\tname: `blocks/${blockName} has JS`,\n\t\t\t\tstatus: hasJs ? \"pass\" : \"warn\",\n\t\t\t\tmessage: hasJs ? \"Found\" : `Missing ${blockName}.js`,\n\t\t\t});\n\n\t\t\t// Check for console.log in block JS\n\t\t\tif (hasJs) {\n\t\t\t\tconst jsContent = await readFile(jsFile, \"utf-8\");\n\t\t\t\tif (jsContent.includes(\"console.log\")) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tname: `blocks/${blockName} no console.log`,\n\t\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\t\tmessage: \"Found console.log - remove before production\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for a Universal Editor model (per-block or aggregated).\n\t\t\tconst hasPerBlockModel = existsSync(path.join(blocksDir, blockName, `_${blockName}.json`));\n\t\t\tconst hasAggregatedModel = aggregatedModels.includes(`\"${blockName}\"`);\n\t\t\tresults.push({\n\t\t\t\tname: `blocks/${blockName} UE model`,\n\t\t\t\tstatus: hasPerBlockModel || hasAggregatedModel ? \"pass\" : \"warn\",\n\t\t\t\tmessage:\n\t\t\t\t\thasPerBlockModel || hasAggregatedModel\n\t\t\t\t\t\t? hasPerBlockModel\n\t\t\t\t\t\t\t? `_${blockName}.json`\n\t\t\t\t\t\t\t: \"in component-models.json\"\n\t\t\t\t\t\t: \"no Universal Editor model - authors can't edit this block in UE\",\n\t\t\t});\n\n\t\t\t// Check .eds-meta.json freshness\n\t\t\tconst metaFile = path.join(blocksDir, blockName, \".eds-meta.json\");\n\t\t\tif (existsSync(metaFile)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst meta = JSON.parse(await readFile(metaFile, \"utf-8\"));\n\t\t\t\t\tconst syncDate = new Date(meta.lastSyncedAt);\n\t\t\t\t\tconst daysSinceSync = Math.floor(\n\t\t\t\t\t\t(Date.now() - syncDate.getTime()) / (1000 * 60 * 60 * 24),\n\t\t\t\t\t);\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tname: `blocks/${blockName} Figma sync`,\n\t\t\t\t\t\tstatus: daysSinceSync > 30 ? \"warn\" : \"pass\",\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\tdaysSinceSync > 30\n\t\t\t\t\t\t\t\t? `Last synced ${daysSinceSync} days ago - design may have changed`\n\t\t\t\t\t\t\t\t: `Synced ${daysSinceSync} days ago`,\n\t\t\t\t\t});\n\t\t\t\t} catch {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tname: `blocks/${blockName} .eds-meta.json`,\n\t\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\t\tmessage: \"Invalid metadata file\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check helix-query.yaml if exists\n\tconst queryFile = path.join(projectRoot, \"helix-query.yaml\");\n\tif (existsSync(queryFile)) {\n\t\ttry {\n\t\t\tconst content = await readFile(queryFile, \"utf-8\");\n\t\t\tparseYaml(content);\n\t\t\tresults.push({ name: \"helix-query.yaml valid\", status: \"pass\", message: \"Valid YAML\" });\n\t\t} catch {\n\t\t\tresults.push({\n\t\t\t\tname: \"helix-query.yaml valid\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"Invalid YAML syntax\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check eds config\n\tresults.push({\n\t\tname: \"~/.eds/config.json\",\n\t\tstatus: globalConfigExists() ? \"pass\" : \"warn\",\n\t\tmessage: globalConfigExists() ? \"Found\" : 'Missing - run \"eds figma setup\" to configure',\n\t});\n\n\tconst fails0 = results.filter((r) => r.status === \"fail\");\n\tconst warns0 = results.filter((r) => r.status === \"warn\");\n\n\tif (options.json) {\n\t\tconst summary = {\n\t\t\tpass: results.filter((r) => r.status === \"pass\").length,\n\t\t\twarn: warns0.length,\n\t\t\tfail: fails0.length,\n\t\t};\n\t\tconsole.log(JSON.stringify({ projectRoot, results, summary }, null, 2));\n\t\tif (fails0.length > 0) process.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Print results - align names into a shared column.\n\tconst nameWidth = ui.columnWidth(results.map((r) => r.name));\n\tfor (const r of results) {\n\t\tlogger.info(ui.statusLine(r.status, r.name, r.message, nameWidth));\n\t}\n\n\tconst fails = results.filter((r) => r.status === \"fail\");\n\tconst warns = results.filter((r) => r.status === \"warn\");\n\tconst passes = results.filter((r) => r.status === \"pass\");\n\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tui.box([ui.summary({ pass: passes.length, warn: warns.length, fail: fails.length })]),\n\t);\n\tif (fails.length > 0) process.exitCode = 1;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\ninterface AuditResult {\n\trule: string;\n\tstatus: \"pass\" | \"warn\" | \"fail\" | \"info\";\n\tmessage: string;\n\tfile?: string;\n\tline?: number;\n}\n\nconst LCP_BUDGET_KB = 100;\n\ninterface AuditLoadingOptions {\n\tjson?: boolean;\n}\n\nexport async function auditLoading(options: AuditLoadingOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tif (!options.json) {\n\t\tlogger.logoOnce(ui.logo(\"Loading Audit\"));\n\t\tlogger.info(ui.heading(\"Loading Order Audit\", projectRoot));\n\t}\n\n\tconst results: AuditResult[] = [];\n\n\tawait checkHeadHtml(projectRoot, results);\n\tawait checkScriptsJs(projectRoot, results);\n\tawait checkStylesCss(projectRoot, results);\n\tawait checkDelayedJs(projectRoot, results);\n\tawait checkBlocks(projectRoot, results);\n\tawait checkAemJs(projectRoot, results);\n\n\tif (options.json) {\n\t\tconst summary = {\n\t\t\tpass: results.filter((r) => r.status === \"pass\").length,\n\t\t\twarn: results.filter((r) => r.status === \"warn\").length,\n\t\t\tfail: results.filter((r) => r.status === \"fail\").length,\n\t\t\tinfo: results.filter((r) => r.status === \"info\").length,\n\t\t};\n\t\tconsole.log(JSON.stringify({ projectRoot, results, summary }, null, 2));\n\t\tif (summary.fail > 0) process.exitCode = 1;\n\t\treturn;\n\t}\n\n\tprintResults(results);\n}\n\n// ── head.html ──────────────────────────────────────────────\n\nasync function checkHeadHtml(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"head.html\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"head.html exists\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Missing head.html\",\n\t\t});\n\t\treturn;\n\t}\n\n\tconst content = await readFile(filePath, \"utf-8\");\n\tconst lines = content.split(\"\\n\");\n\n\t// Check for render-blocking scripts (not type=\"module\")\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tif (\n\t\t\t/<script\\b/i.test(line) &&\n\t\t\t!/type\\s*=\\s*[\"']module[\"']/i.test(line) &&\n\t\t\t!/<\\/script>/.test(line)\n\t\t) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No render-blocking scripts in head.html\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: 'Script without type=\"module\" blocks rendering',\n\t\t\t\tfile: \"head.html\",\n\t\t\t\tline: i + 1,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for extra stylesheets beyond styles.css\n\tconst stylesheetMatches = content.match(/<link[^>]+rel=[\"']stylesheet[\"'][^>]*>/gi) || [];\n\tconst extraStylesheets = stylesheetMatches.filter(\n\t\t(tag) => !tag.includes(\"styles/styles.css\") && !tag.includes(\"styles.css\"),\n\t);\n\tif (extraStylesheets.length > 0) {\n\t\tresults.push({\n\t\t\trule: \"No extra stylesheets in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: `${extraStylesheets.length} extra stylesheet(s) — each competes with LCP budget`,\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\t// Check for preload/preconnect (Adobe says these hurt EDS performance)\n\tif (/<link[^>]+rel=[\"'](preload|preconnect)[\"']/i.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No preload/preconnect in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"preload/preconnect can hurt EDS LCP — resources compete with the 100KB budget\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\t// Check for inline scripts\n\tif (/<script\\b[^>]*>[\\s\\S]*?[^\\s<][\\s\\S]*?<\\/script>/i.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No inline scripts in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Inline scripts block rendering — move to delayed.js\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\t// Check for third-party origins in script/link tags\n\tconst thirdPartyPattern =\n\t\t/(?:src|href)=[\"'](https?:\\/\\/(?!(?:localhost|127\\.0\\.0\\.1))[^\"']+)[\"']/gi;\n\tfor (const match of content.matchAll(thirdPartyPattern)) {\n\t\tconst url = match[1];\n\t\t// Allow common CDN for fonts metadata but warn about scripts\n\t\tif (!url.includes(\"fonts.googleapis.com\")) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No third-party resources in head.html\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `Third-party resource: ${url} — move to delayed.js`,\n\t\t\t\tfile: \"head.html\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for font preloads\n\tif (/<link[^>]+as=[\"']font[\"']/i.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No font preloads in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Font preloads consume LCP bandwidth budget — let loadFonts() handle them\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\tif (!results.some((r) => r.file === \"head.html\")) {\n\t\tresults.push({\n\t\t\trule: \"head.html is clean\",\n\t\t\tstatus: \"pass\",\n\t\t\tmessage: \"No render-blocking issues found\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n}\n\n// ── scripts.js ─────────────────────────────────────────────\n\nasync function checkScriptsJs(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"scripts\", \"scripts.js\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"scripts/scripts.js exists\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Missing scripts.js — cannot audit loading phases\",\n\t\t});\n\t\treturn;\n\t}\n\n\tconst content = await readFile(filePath, \"utf-8\");\n\tconst lines = content.split(\"\\n\");\n\n\t// Check three-phase structure\n\tconst hasLoadEager = /function\\s+loadEager|loadEager\\s*=/i.test(content);\n\tconst hasLoadLazy = /function\\s+loadLazy|loadLazy\\s*=/i.test(content);\n\tconst hasLoadDelayed = /function\\s+loadDelayed|loadDelayed\\s*=/i.test(content);\n\n\tresults.push({\n\t\trule: \"loadEager phase exists\",\n\t\tstatus: hasLoadEager ? \"pass\" : \"fail\",\n\t\tmessage: hasLoadEager ? \"Found\" : \"Missing loadEager — LCP optimization depends on it\",\n\t\tfile: \"scripts/scripts.js\",\n\t});\n\n\tresults.push({\n\t\trule: \"loadLazy phase exists\",\n\t\tstatus: hasLoadLazy ? \"pass\" : \"fail\",\n\t\tmessage: hasLoadLazy ? \"Found\" : \"Missing loadLazy — below-fold content won't load properly\",\n\t\tfile: \"scripts/scripts.js\",\n\t});\n\n\tresults.push({\n\t\trule: \"loadDelayed phase exists\",\n\t\tstatus: hasLoadDelayed ? \"pass\" : \"warn\",\n\t\tmessage: hasLoadDelayed ? \"Found\" : \"Missing loadDelayed — third-party scripts may block LCP\",\n\t\tfile: \"scripts/scripts.js\",\n\t});\n\n\t// Check delayed uses setTimeout with >=3000ms\n\tconst delayedTimeoutMatch = content.match(/setTimeout\\s*\\([^,]+,\\s*(\\d+)\\s*\\)/);\n\tif (hasLoadDelayed && delayedTimeoutMatch) {\n\t\tconst delay = Number.parseInt(delayedTimeoutMatch[1], 10);\n\t\tif (delay < 3000) {\n\t\t\tresults.push({\n\t\t\t\trule: \"Delayed phase waits >= 3s\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `delayed.js loads after ${delay}ms — should be >= 3000ms for LCP safety`,\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t} else {\n\t\t\tresults.push({\n\t\t\t\trule: \"Delayed phase waits >= 3s\",\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tmessage: `${delay}ms delay before loading delayed.js`,\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check that loadEager only loads first section\n\tif (hasLoadEager) {\n\t\tconst eagerSection = content.match(/loadEager[\\s\\S]*?(?=function\\s|const\\s+load|$)/)?.[0] || \"\";\n\t\tif (/loadSections\\s*\\(/.test(eagerSection)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"loadEager loads only first section\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"loadEager calls loadSections() — should only load first section for fast LCP\",\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for third-party imports in top-level / eager phase\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tif (/import\\s.*from\\s+['\"]https?:\\/\\//i.test(line)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No third-party imports at top level\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `Third-party import at line ${i + 1} — move to delayed.js if not critical`,\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t\tline: i + 1,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for header/footer loading in eager phase\n\tif (hasLoadEager) {\n\t\tconst eagerBody = extractFunctionBody(content, \"loadEager\");\n\t\tif (eagerBody && /loadHeader|loadFooter/.test(eagerBody)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"Header/footer not in loadEager\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: \"Header/footer in loadEager delays LCP — move to loadLazy\",\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// ── styles.css ─────────────────────────────────────────────\n\nasync function checkStylesCss(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"styles\", \"styles.css\");\n\tif (!existsSync(filePath)) return;\n\n\tconst stats = await stat(filePath);\n\tconst sizeKb = stats.size / 1024;\n\n\tresults.push({\n\t\trule: \"styles.css size within LCP budget\",\n\t\tstatus: sizeKb > 40 ? \"warn\" : \"pass\",\n\t\tmessage: `${sizeKb.toFixed(1)} KB${sizeKb > 40 ? \" — large CSS competes with 100KB LCP budget\" : \"\"}`,\n\t\tfile: \"styles/styles.css\",\n\t});\n\n\t// Check for @import (render-blocking chain)\n\tconst content = await readFile(filePath, \"utf-8\");\n\tif (/@import\\s/.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No @import in styles.css\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"@import creates a request chain — inline the CSS or use lazy-styles.css\",\n\t\t\tfile: \"styles/styles.css\",\n\t\t});\n\t}\n}\n\n// ── delayed.js ─────────────────────────────────────────────\n\nasync function checkDelayedJs(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"scripts\", \"delayed.js\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"scripts/delayed.js exists\",\n\t\t\tstatus: \"info\",\n\t\t\tmessage: \"No delayed.js — third-party scripts should go here\",\n\t\t});\n\t\treturn;\n\t}\n\n\tconst content = await readFile(filePath, \"utf-8\");\n\n\t// Check it actually has content (not just the stub comment)\n\tconst stripped = content\n\t\t.replace(/\\/\\/.*$/gm, \"\")\n\t\t.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n\t\t.trim();\n\tif (!stripped) {\n\t\tresults.push({\n\t\t\trule: \"delayed.js has content\",\n\t\t\tstatus: \"info\",\n\t\t\tmessage: \"delayed.js is empty — add analytics/martech here\",\n\t\t\tfile: \"scripts/delayed.js\",\n\t\t});\n\t}\n}\n\n// ── Block JS files ─────────────────────────────────────────\n\nasync function checkBlocks(root: string, results: AuditResult[]) {\n\tconst blocksDir = path.join(root, \"blocks\");\n\tif (!existsSync(blocksDir)) return;\n\n\tconst entries = await readdir(blocksDir, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\tif (!entry.isDirectory()) continue;\n\t\tconst blockName = entry.name;\n\t\tconst jsFile = path.join(blocksDir, blockName, `${blockName}.js`);\n\t\tif (!existsSync(jsFile)) continue;\n\n\t\tconst content = await readFile(jsFile, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\");\n\n\t\t// Check for heavy library imports\n\t\tconst heavyLibs = [\n\t\t\t\"jquery\",\n\t\t\t\"lodash\",\n\t\t\t\"moment\",\n\t\t\t\"rxjs\",\n\t\t\t\"d3\",\n\t\t\t\"three\",\n\t\t\t\"gsap\",\n\t\t\t\"anime\",\n\t\t\t\"chart.js\",\n\t\t\t\"swiper\",\n\t\t];\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i].toLowerCase();\n\t\t\tfor (const lib of heavyLibs) {\n\t\t\t\tif (line.includes(\"from\") && line.includes(lib) && /import\\s/.test(line)) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\trule: \"No heavy imports in blocks\",\n\t\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\t\tmessage: `Imports \"${lib}\" — heavy library delays section loading`,\n\t\t\t\t\t\tfile: `blocks/${blockName}/${blockName}.js`,\n\t\t\t\t\t\tline: i + 1,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check for synchronous DOM-heavy patterns\n\t\tif (/document\\.write/i.test(content)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No document.write in blocks\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"document.write blocks parsing and can break the page\",\n\t\t\t\tfile: `blocks/${blockName}/${blockName}.js`,\n\t\t\t});\n\t\t}\n\n\t\t// Check block JS file size\n\t\tconst stats = await stat(jsFile);\n\t\tconst sizeKb = stats.size / 1024;\n\t\tif (sizeKb > 20) {\n\t\t\tresults.push({\n\t\t\t\trule: \"Block JS size reasonable\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `${sizeKb.toFixed(1)} KB — consider splitting or lazy-loading parts`,\n\t\t\t\tfile: `blocks/${blockName}/${blockName}.js`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check block CSS for unscoped selectors\n\tfor (const entry of entries) {\n\t\tif (!entry.isDirectory()) continue;\n\t\tconst blockName = entry.name;\n\t\tconst cssFile = path.join(blocksDir, blockName, `${blockName}.css`);\n\t\tif (!existsSync(cssFile)) continue;\n\n\t\tconst content = await readFile(cssFile, \"utf-8\");\n\n\t\t// Simple check: top-level selectors that don't start with .blockname\n\t\tconst selectorPattern = /^([a-z][a-z0-9-]*)\\s*\\{/gm;\n\t\tfor (const selectorMatch of content.matchAll(selectorPattern)) {\n\t\t\tconst selector = selectorMatch[1];\n\t\t\tif (![\"body\", \"html\", \"main\"].includes(selector)) {\n\t\t\t\tresults.push({\n\t\t\t\t\trule: \"Block CSS is scoped\",\n\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\tmessage: `Bare element selector \"${selector}\" — may leak styles and cause CLS. Use .${blockName} prefix`,\n\t\t\t\t\tfile: `blocks/${blockName}/${blockName}.css`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n// ── aem.js ─────────────────────────────────────────────────\n\nasync function checkAemJs(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"scripts\", \"aem.js\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"scripts/aem.js exists\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Missing aem.js (or lib-franklin.js) — the EDS framework library\",\n\t\t});\n\t\treturn;\n\t}\n\n\tresults.push({\n\t\trule: \"aem.js present\",\n\t\tstatus: \"pass\",\n\t\tmessage: \"Found — remember: never modify this file\",\n\t\tfile: \"scripts/aem.js\",\n\t});\n}\n\n// ── Helpers ────────────────────────────────────────────────\n\nfunction extractFunctionBody(source: string, funcName: string): string | null {\n\tconst pattern = new RegExp(`(?:async\\\\s+)?function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{`);\n\tconst match = pattern.exec(source);\n\tif (!match) return null;\n\n\tlet depth = 1;\n\tlet i = match.index + match[0].length;\n\tconst start = i;\n\twhile (i < source.length && depth > 0) {\n\t\tif (source[i] === \"{\") depth++;\n\t\telse if (source[i] === \"}\") depth--;\n\t\ti++;\n\t}\n\treturn source.slice(start, i - 1);\n}\n\nfunction printResults(results: AuditResult[]) {\n\t// Group by file\n\tconst grouped = new Map<string, AuditResult[]>();\n\tfor (const r of results) {\n\t\tconst key = r.file || \"general\";\n\t\tconst bucket = grouped.get(key) ?? [];\n\t\tbucket.push(r);\n\t\tgrouped.set(key, bucket);\n\t}\n\n\tfor (const [file, fileResults] of grouped) {\n\t\tlogger.info(` ${ui.icon.bullet} ${chalk.underline(file)}`);\n\t\tfor (const r of fileResults) {\n\t\t\tconst loc = r.line ? chalk.dim(`:${r.line}`) : \"\";\n\t\t\tlogger.info(` ${ui.statusIcon(r.status)} ${r.rule}${loc}`);\n\t\t\tif (r.status !== \"pass\") {\n\t\t\t\tlogger.info(chalk.dim(` ${r.message}`));\n\t\t\t}\n\t\t}\n\t\tlogger.info(\"\");\n\t}\n\n\tconst counts = {\n\t\tpass: results.filter((r) => r.status === \"pass\").length,\n\t\twarn: results.filter((r) => r.status === \"warn\").length,\n\t\tfail: results.filter((r) => r.status === \"fail\").length,\n\t\tinfo: results.filter((r) => r.status === \"info\").length,\n\t};\n\n\tlogger.info(ui.box([ui.summary(counts)]));\n\tif (counts.fail > 0) process.exitCode = 1;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\ninterface AuditSecurityOptions {\n\tjson?: boolean;\n}\n\ntype Severity = \"critical\" | \"high\" | \"moderate\" | \"low\";\n\ninterface Finding {\n\tseverity: Severity;\n\trule: string;\n\tmessage: string;\n\tfile: string;\n\tline: number;\n\tsnippet: string;\n}\n\ninterface Rule {\n\tid: string;\n\tseverity: Severity;\n\tre: RegExp;\n\tmessage: string;\n\text: string[];\n\t/** Optional extra predicate on the matched line (e.g. negative look-aside). */\n\textra?: (line: string) => boolean;\n}\n\n// Ordered: dynamic innerHTML before static so we don't double-report a line.\nconst RULES: Rule[] = [\n\t{\n\t\tid: \"eval\",\n\t\tseverity: \"critical\",\n\t\tre: /\\beval\\s*\\(/,\n\t\tmessage: \"eval() executes arbitrary code — prime XSS / RCE vector\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"aws-key\",\n\t\tseverity: \"critical\",\n\t\tre: /\\bAKIA[0-9A-Z]{16}\\b/,\n\t\tmessage: \"Hardcoded AWS access key id\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\"],\n\t},\n\t{\n\t\tid: \"private-key\",\n\t\tseverity: \"critical\",\n\t\tre: /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/,\n\t\tmessage: \"Embedded private key material\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\", \"pem\", \"txt\"],\n\t},\n\t{\n\t\tid: \"new-function\",\n\t\tseverity: \"high\",\n\t\tre: /\\bnew\\s+Function\\s*\\(/,\n\t\tmessage: \"new Function() runs strings as code\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"document-write\",\n\t\tseverity: \"high\",\n\t\tre: /document\\.write(?:ln)?\\s*\\(/,\n\t\tmessage: \"document.write() enables XSS and blocks parsing\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"innerhtml-dynamic\",\n\t\tseverity: \"high\",\n\t\tre: /\\.(?:inner|outer)HTML\\s*=\\s*[^;\\n]*(?:\\$\\{|\\+|concat)/,\n\t\tmessage: \"Dynamic innerHTML assignment — sanitize or use textContent / DOM APIs\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"insert-adjacent-html\",\n\t\tseverity: \"high\",\n\t\tre: /insertAdjacentHTML\\s*\\(/,\n\t\tmessage: \"insertAdjacentHTML with untrusted data is an XSS vector\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"js-url\",\n\t\tseverity: \"high\",\n\t\tre: /(?:href|src)\\s*=\\s*[\"']?\\s*javascript:/i,\n\t\tmessage: \"javascript: URL — XSS vector\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"secret\",\n\t\tseverity: \"high\",\n\t\tre: /(?:api[_-]?key|secret|access[_-]?token|auth[_-]?token|client[_-]?secret|passwd|password)\\s*[:=]\\s*[\"'][^\"']{8,}[\"']/i,\n\t\tmessage: \"Possible hardcoded secret / credential\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\"],\n\t\t// Skip obvious placeholders.\n\t\textra: (line) => !/(example|placeholder|your[-_]|changeme|xxxx|<[^>]+>|\\$\\{)/i.test(line),\n\t},\n\t{\n\t\tid: \"bearer-token\",\n\t\tseverity: \"high\",\n\t\tre: /Bearer\\s+[A-Za-z0-9\\-._~+/]{20,}/,\n\t\tmessage: \"Hardcoded bearer token\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\"],\n\t},\n\t{\n\t\tid: \"innerhtml-static\",\n\t\tseverity: \"moderate\",\n\t\tre: /\\.(?:inner|outer)HTML\\s*=/,\n\t\tmessage: \"innerHTML assignment — confirm the content is trusted / sanitized\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"insecure-url\",\n\t\tseverity: \"moderate\",\n\t\tre: /(?:href|src)\\s*=\\s*[\"']http:\\/\\/(?!localhost|127\\.0\\.0\\.1)/i,\n\t\tmessage: \"Insecure http:// resource — mixed content, use https://\",\n\t\text: [\"html\", \"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"target-blank\",\n\t\tseverity: \"moderate\",\n\t\tre: /target\\s*=\\s*[\"']_blank[\"']/,\n\t\tmessage: 'target=\"_blank\" without rel=\"noopener\" — reverse tabnabbing',\n\t\text: [\"html\", \"js\", \"mjs\"],\n\t\textra: (line) => !/rel\\s*=\\s*[\"'][^\"']*noopener/i.test(line),\n\t},\n\t{\n\t\tid: \"postmessage-wildcard\",\n\t\tseverity: \"moderate\",\n\t\tre: /postMessage\\s*\\([^,]+,\\s*[\"']\\*[\"']\\s*\\)/,\n\t\tmessage: \"postMessage to '*' origin — restrict the target origin\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"inline-handler\",\n\t\tseverity: \"low\",\n\t\tre: /\\son[a-z]+\\s*=\\s*[\"']/i,\n\t\tmessage: \"Inline event handler — move to addEventListener (CSP-unfriendly)\",\n\t\text: [\"html\"],\n\t},\n\t{\n\t\tid: \"console-log\",\n\t\tseverity: \"low\",\n\t\tre: /console\\.(?:log|debug)\\s*\\(/,\n\t\tmessage: \"console.log / debug left in code — potential info leak\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n];\n\nconst SEVERITY_ORDER: Severity[] = [\"critical\", \"high\", \"moderate\", \"low\"];\nconst SEVERITY_META: Record<Severity, { status: ui.Status; label: string }> = {\n\tcritical: { status: \"fail\", label: \"CRIT\" },\n\thigh: { status: \"fail\", label: \"HIGH\" },\n\tmoderate: { status: \"warn\", label: \"MOD \" },\n\tlow: { status: \"info\", label: \"LOW \" },\n};\n\nconst IGNORE_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".vscode\", \"coverage\"]);\nconst SCAN_EXT = new Set([\"js\", \"mjs\", \"html\", \"json\", \"pem\", \"txt\"]);\n\nasync function* walk(dir: string): AsyncGenerator<string> {\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tconst full = path.join(dir, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tif (IGNORE_DIRS.has(entry.name)) continue;\n\t\t\tyield* walk(full);\n\t\t} else if (entry.isFile()) {\n\t\t\tyield full;\n\t\t}\n\t}\n}\n\nfunction scanContent(content: string, relFile: string, ext: string): Finding[] {\n\tconst findings: Finding[] = [];\n\tconst lines = content.split(\"\\n\");\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tlet innerHtmlDynamicHit = false;\n\t\tfor (const rule of RULES) {\n\t\t\tif (!rule.ext.includes(ext)) continue;\n\t\t\t// Don't double-report the same innerHTML line as both dynamic + static.\n\t\t\tif (rule.id === \"innerhtml-static\" && innerHtmlDynamicHit) continue;\n\t\t\tif (!rule.re.test(line)) continue;\n\t\t\tif (rule.extra && !rule.extra(line)) continue;\n\t\t\tif (rule.id === \"innerhtml-dynamic\") innerHtmlDynamicHit = true;\n\t\t\tfindings.push({\n\t\t\t\tseverity: rule.severity,\n\t\t\t\trule: rule.id,\n\t\t\t\tmessage: rule.message,\n\t\t\t\tfile: relFile,\n\t\t\t\tline: i + 1,\n\t\t\t\tsnippet: line.trim().slice(0, 100),\n\t\t\t});\n\t\t}\n\t}\n\treturn findings;\n}\n\ninterface DepReport {\n\tstatus: \"ok\" | \"vulnerable\" | \"skipped\";\n\tcounts?: { critical: number; high: number; moderate: number; low: number };\n\tnote?: string;\n}\n\nasync function auditDependencies(root: string): Promise<DepReport> {\n\tif (!existsSync(path.join(root, \"package.json\"))) {\n\t\treturn { status: \"skipped\", note: \"no package.json\" };\n\t}\n\tconst hasLock =\n\t\texistsSync(path.join(root, \"package-lock.json\")) ||\n\t\texistsSync(path.join(root, \"npm-shrinkwrap.json\"));\n\tif (!hasLock && !existsSync(path.join(root, \"node_modules\"))) {\n\t\treturn { status: \"skipped\", note: \"no package-lock.json / node_modules — run npm install\" };\n\t}\n\ttry {\n\t\tconst { execa } = await import(\"execa\");\n\t\tconst { stdout } = await execa(\"npm\", [\"audit\", \"--json\"], {\n\t\t\tcwd: root,\n\t\t\treject: false,\n\t\t});\n\t\tconst data = JSON.parse(stdout);\n\t\tconst v = data?.metadata?.vulnerabilities ?? {};\n\t\tconst counts = {\n\t\t\tcritical: v.critical ?? 0,\n\t\t\thigh: v.high ?? 0,\n\t\t\tmoderate: v.moderate ?? 0,\n\t\t\tlow: v.low ?? 0,\n\t\t};\n\t\tconst total = counts.critical + counts.high + counts.moderate + counts.low;\n\t\treturn { status: total > 0 ? \"vulnerable\" : \"ok\", counts };\n\t} catch (err) {\n\t\treturn { status: \"skipped\", note: `npm audit failed: ${(err as Error).message}` };\n\t}\n}\n\nexport async function auditSecurity(options: AuditSecurityOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// ── Exploit / code scan ──────────────────────────────────\n\tconst findings: Finding[] = [];\n\tfor await (const file of walk(projectRoot)) {\n\t\tconst ext = path.extname(file).slice(1).toLowerCase();\n\t\tif (!SCAN_EXT.has(ext)) continue;\n\t\t// Never flag the EDS framework library — it's vendored and not ours to edit.\n\t\tconst rel = path.relative(projectRoot, file);\n\t\tif (rel.endsWith(\"aem.js\") || rel.endsWith(\"lib-franklin.js\")) continue;\n\t\tconst content = await readFile(file, \"utf-8\");\n\t\tfindings.push(...scanContent(content, rel, ext));\n\t}\n\n\t// ── Dependency vulnerabilities ───────────────────────────\n\tconst deps = await auditDependencies(projectRoot);\n\n\tconst bySeverity = (s: Severity) => findings.filter((f) => f.severity === s);\n\tconst codeCounts = {\n\t\tcritical: bySeverity(\"critical\").length,\n\t\thigh: bySeverity(\"high\").length,\n\t\tmoderate: bySeverity(\"moderate\").length,\n\t\tlow: bySeverity(\"low\").length,\n\t};\n\tconst hardFail =\n\t\tcodeCounts.critical > 0 ||\n\t\tcodeCounts.high > 0 ||\n\t\t(deps.counts?.critical ?? 0) > 0 ||\n\t\t(deps.counts?.high ?? 0) > 0;\n\n\tif (options.json) {\n\t\tconsole.log(\n\t\t\tJSON.stringify(\n\t\t\t\t{ projectRoot, dependencies: deps, findings, summary: { code: codeCounts } },\n\t\t\t\tnull,\n\t\t\t\t2,\n\t\t\t),\n\t\t);\n\t\tif (hardFail) process.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Security Audit\"));\n\tlogger.info(ui.heading(\"Dependencies\", \"npm audit\"));\n\tif (deps.status === \"skipped\") {\n\t\tlogger.info(ui.statusLine(\"info\", \"npm audit\", deps.note ?? \"skipped\"));\n\t} else if (deps.status === \"ok\") {\n\t\tlogger.info(ui.statusLine(\"pass\", \"npm audit\", \"no known vulnerabilities\"));\n\t} else {\n\t\tconst c = deps.counts ?? { critical: 0, high: 0, moderate: 0, low: 0 };\n\t\tlogger.info(\n\t\t\tui.statusLine(\n\t\t\t\tc.critical + c.high > 0 ? \"fail\" : \"warn\",\n\t\t\t\t\"npm audit\",\n\t\t\t\t`${c.critical} critical, ${c.high} high, ${c.moderate} moderate, ${c.low} low — run \\`npm audit fix\\``,\n\t\t\t),\n\t\t);\n\t}\n\n\tlogger.info(ui.heading(\"Exploit scan\", \"XSS · secrets · injection · tabnabbing\"));\n\tif (findings.length === 0) {\n\t\tlogger.info(ui.statusLine(\"pass\", \"code\", \"no risky patterns found\"));\n\t} else {\n\t\tconst sorted = [...findings].sort(\n\t\t\t(a, b) => SEVERITY_ORDER.indexOf(a.severity) - SEVERITY_ORDER.indexOf(b.severity),\n\t\t);\n\t\tfor (const f of sorted) {\n\t\t\tconst meta = SEVERITY_META[f.severity];\n\t\t\tconst loc = chalk.dim(`${f.file}:${f.line}`);\n\t\t\tlogger.info(` ${ui.statusIcon(meta.status)} ${chalk.bold(meta.label)} ${f.message} ${loc}`);\n\t\t\tlogger.info(chalk.dim(` ${f.snippet}`));\n\t\t}\n\t}\n\n\tconst summaryLine = ui.summary({\n\t\tfail:\n\t\t\tcodeCounts.critical +\n\t\t\tcodeCounts.high +\n\t\t\t(deps.counts?.critical ?? 0) +\n\t\t\t(deps.counts?.high ?? 0),\n\t\twarn: codeCounts.moderate + (deps.counts?.moderate ?? 0),\n\t\tinfo: codeCounts.low + (deps.counts?.low ?? 0),\n\t});\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tui.box([summaryLine || `${ui.icon.pass} no vulnerabilities or risky patterns found`]),\n\t);\n\tif (hardFail) process.exitCode = 1;\n}\n","import { logger } from \"./logger.js\";\n\nconst ADMIN_BASE = \"https://admin.hlx.page\";\n\nexport interface AdminApiConfig {\n\torg: string;\n\tsite: string;\n\tref?: string;\n}\n\nexport interface AdminApiResult {\n\tok: boolean;\n\tstatus: number;\n\tpath: string;\n\tpreviewUrl?: string;\n\tliveUrl?: string;\n\tmessage?: string;\n}\n\nasync function adminRequest(\n\taction: \"preview\" | \"live\",\n\tconfig: AdminApiConfig,\n\tpagePath: string,\n): Promise<AdminApiResult> {\n\tconst ref = config.ref || \"main\";\n\tconst normalizedPath = pagePath.startsWith(\"/\") ? pagePath : `/${pagePath}`;\n\tconst url = `${ADMIN_BASE}/${action}/${config.org}/${config.site}/${ref}${normalizedPath}`;\n\n\tlogger.debug(`POST ${url}`);\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n\n\tconst body = await response.json().catch(() => ({}));\n\tconst data = body as Record<string, Record<string, string>>;\n\n\tif (!response.ok) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tstatus: response.status,\n\t\t\tpath: normalizedPath,\n\t\t\tmessage: (body as Record<string, string>).message || `HTTP ${response.status}`,\n\t\t};\n\t}\n\n\treturn {\n\t\tok: true,\n\t\tstatus: response.status,\n\t\tpath: normalizedPath,\n\t\tpreviewUrl: data.preview?.url,\n\t\tliveUrl: data.live?.url,\n\t};\n}\n\nexport async function previewPage(\n\tconfig: AdminApiConfig,\n\tpagePath: string,\n): Promise<AdminApiResult> {\n\treturn adminRequest(\"preview\", config, pagePath);\n}\n\nexport async function publishPage(\n\tconfig: AdminApiConfig,\n\tpagePath: string,\n): Promise<AdminApiResult> {\n\treturn adminRequest(\"live\", config, pagePath);\n}\n\nexport async function previewPages(\n\tconfig: AdminApiConfig,\n\tpaths: string[],\n): Promise<AdminApiResult[]> {\n\treturn Promise.all(paths.map((p) => previewPage(config, p)));\n}\n\nexport async function publishPages(\n\tconfig: AdminApiConfig,\n\tpaths: string[],\n): Promise<AdminApiResult[]> {\n\treturn Promise.all(paths.map((p) => publishPage(config, p)));\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { previewPage, previewPages } from \"../lib/admin-api.js\";\nimport { loadConfig } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\n\ninterface PreviewOptions {\n\torg?: string;\n\tsite?: string;\n\tref?: string;\n}\n\nexport async function preview(paths: string[], options: PreviewOptions): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tconst config = await loadConfig(projectRoot);\n\tconst adminConfig = resolveAdminConfig(config, options);\n\n\tif (!adminConfig) return;\n\n\tconst spinner = ora(`Previewing ${paths.length} path(s)...`).start();\n\n\tconst results =\n\t\tpaths.length === 1\n\t\t\t? [await previewPage(adminConfig, paths[0])]\n\t\t\t: await previewPages(adminConfig, paths);\n\n\tspinner.stop();\n\n\tlet hasErrors = false;\n\tfor (const r of results) {\n\t\tif (r.ok) {\n\t\t\tlogger.success(`${r.path} → ${chalk.cyan(r.previewUrl || \"preview updated\")}`);\n\t\t} else {\n\t\t\tlogger.error(`${r.path} — ${r.message}`);\n\t\t\thasErrors = true;\n\t\t}\n\t}\n\n\tif (hasErrors) process.exitCode = 1;\n}\n\nfunction resolveAdminConfig(\n\tconfig: { admin?: { org?: string; site?: string; ref?: string } },\n\toptions: PreviewOptions,\n) {\n\tconst org = options.org || config.admin?.org;\n\tconst site = options.site || config.admin?.site;\n\tconst ref = options.ref || config.admin?.ref || \"main\";\n\n\tif (!org || !site) {\n\t\tlogger.error(\"Missing --org and --site. Set them via flags or in .edsrc.json:\");\n\t\tlogger.info(chalk.dim(' { \"admin\": { \"org\": \"my-org\", \"site\": \"my-site\" } }'));\n\t\tprocess.exitCode = 1;\n\t\treturn undefined;\n\t}\n\n\treturn { org, site, ref };\n}\n\n// Re-export for publish to reuse\nexport { resolveAdminConfig };\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { publishPage, publishPages } from \"../lib/admin-api.js\";\nimport { loadConfig } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { resolveAdminConfig } from \"./preview.js\";\n\ninterface PublishOptions {\n\torg?: string;\n\tsite?: string;\n\tref?: string;\n}\n\nexport async function publish(paths: string[], options: PublishOptions): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tconst config = await loadConfig(projectRoot);\n\tconst adminConfig = resolveAdminConfig(config, options);\n\n\tif (!adminConfig) return;\n\n\tconst spinner = ora(`Publishing ${paths.length} path(s)...`).start();\n\n\tconst results =\n\t\tpaths.length === 1\n\t\t\t? [await publishPage(adminConfig, paths[0])]\n\t\t\t: await publishPages(adminConfig, paths);\n\n\tspinner.stop();\n\n\tlet hasErrors = false;\n\tfor (const r of results) {\n\t\tif (r.ok) {\n\t\t\tlogger.success(`${r.path} → ${chalk.cyan(r.liveUrl || \"published\")}`);\n\t\t} else {\n\t\t\tlogger.error(`${r.path} — ${r.message}`);\n\t\t\thasErrors = true;\n\t\t}\n\t}\n\n\tif (hasErrors) process.exitCode = 1;\n}\n","import { loadConfig } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\n/**\n * Interactive wizard for the AEM Admin API (preview / publish). Reached from the\n * main menu or by running `eds preview` / `eds publish` with no paths. Defaults\n * come from `.edsrc.json` (`admin.org/site/ref`).\n */\nexport async function adminWizard(initialOp?: \"preview\" | \"publish\"): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Admin API — preview / publish\"));\n\n\tconst { select, input, confirm } = await import(\"@inquirer/prompts\");\n\tconst config = await loadConfig(projectRoot);\n\tconst admin = (config as { admin?: { org?: string; site?: string; ref?: string } }).admin ?? {};\n\n\tconst op =\n\t\tinitialOp ??\n\t\t((await select({\n\t\t\tmessage: \"What do you want to do?\",\n\t\t\tchoices: [\n\t\t\t\t{ name: \"Preview pages (staging)\", value: \"preview\" },\n\t\t\t\t{ name: \"Publish pages (go live)\", value: \"publish\" },\n\t\t\t],\n\t\t})) as \"preview\" | \"publish\");\n\n\tconst org = (await input({ message: \"GitHub org / owner\", default: admin.org })).trim();\n\tconst site = (await input({ message: \"Repository / site\", default: admin.site })).trim();\n\tconst ref = (await input({ message: \"Git ref\", default: admin.ref || \"main\" })).trim();\n\tconst pathsRaw = await input({\n\t\tmessage: \"Paths (space- or comma-separated)\",\n\t\tdefault: \"/\",\n\t});\n\tconst paths = pathsRaw.split(/[\\s,]+/).filter(Boolean);\n\n\tif (!org || !site || paths.length === 0) {\n\t\tlogger.error(\"org, site and at least one path are required.\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.info(ui.heading(\"Summary\"));\n\tconst w = ui.columnWidth([\"operation\", \"org\", \"site\", \"ref\", \"paths\"]);\n\tlogger.info(ui.accentLine(\"operation\", op, w));\n\tlogger.info(ui.accentLine(\"org\", org, w));\n\tlogger.info(ui.accentLine(\"site\", site, w));\n\tlogger.info(ui.accentLine(\"ref\", ref, w));\n\tlogger.info(ui.accentLine(\"paths\", paths.join(\", \"), w));\n\tlogger.info(\"\");\n\n\tif (op === \"publish\") {\n\t\tconst go = await confirm({\n\t\t\tmessage: `Publish ${paths.length} path(s) to LIVE?`,\n\t\t\tdefault: false,\n\t\t});\n\t\tif (!go) {\n\t\t\tlogger.info(\"Cancelled.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst options = { org, site, ref };\n\tif (op === \"preview\") {\n\t\tconst { preview } = await import(\"./preview.js\");\n\t\tawait preview(paths, options);\n\t} else {\n\t\tconst { publish } = await import(\"./publish.js\");\n\t\tawait publish(paths, options);\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { kebabCaseRegex } from \"../lib/schemas.js\";\n\nasync function listBlockNames(projectRoot: string): Promise<string[]> {\n\tconst dir = path.join(projectRoot, \"blocks\");\n\tif (!existsSync(dir)) return [];\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\treturn entries.filter((e) => e.isDirectory()).map((e) => e.name);\n}\n\n/**\n * The interactive front door: `eds` with no command opens this menu and routes\n * to each feature's own wizard. Flags/subcommands still work for power users/CI.\n */\nexport async function mainMenu(): Promise<void> {\n\tconst { select, input } = await import(\"@inquirer/prompts\");\n\n\tawait logger.logoOnceAnimated(\"What do you want to do?\");\n\n\tconst action = await select({\n\t\tmessage: \"Choose an action\",\n\t\tchoices: [\n\t\t\t{ name: \"Set up this project (authoring model, CI, naming)\", value: \"init\" },\n\t\t\t{ name: \"Generate a block from a design (Figma/Stitch/Canva/Sketch)\", value: \"from-design\" },\n\t\t\t{ name: \"Scaffold Universal Editor components\", value: \"scaffold\" },\n\t\t\t{ name: \"Create an empty block\", value: \"create\" },\n\t\t\t{ name: \"Add a third-party integration (GTM, chat, consent…)\", value: \"integrate\" },\n\t\t\t{ name: \"Preview a block in the browser\", value: \"preview-block\" },\n\t\t\t{ name: \"Preview / publish pages (Admin API)\", value: \"admin\" },\n\t\t\t{ name: \"Audit the project\", value: \"audit\" },\n\t\t\t{ name: \"Configure Figma MCP\", value: \"figma-setup\" },\n\t\t],\n\t});\n\n\tswitch (action) {\n\t\tcase \"init\": {\n\t\t\tconst { initProject } = await import(\"./init.js\");\n\t\t\tawait initProject({});\n\t\t\treturn;\n\t\t}\n\t\tcase \"from-design\": {\n\t\t\tconst { blockFromDesign } = await import(\"./block/from-design.js\");\n\t\t\tawait blockFromDesign(undefined, {});\n\t\t\treturn;\n\t\t}\n\t\tcase \"scaffold\": {\n\t\t\tconst { scaffoldInteractive } = await import(\"./scaffold.js\");\n\t\t\tawait scaffoldInteractive();\n\t\t\treturn;\n\t\t}\n\t\tcase \"create\": {\n\t\t\tconst name = await input({\n\t\t\t\tmessage: \"Block name\",\n\t\t\t\tvalidate: (v) => kebabCaseRegex.test(v.trim()) || \"Use kebab-case, e.g. hero-banner\",\n\t\t\t});\n\t\t\tconst { createBlock } = await import(\"./block/create.js\");\n\t\t\tawait createBlock(name.trim(), {});\n\t\t\treturn;\n\t\t}\n\t\tcase \"integrate\": {\n\t\t\tconst { integrate } = await import(\"./integrate.js\");\n\t\t\tawait integrate(undefined);\n\t\t\treturn;\n\t\t}\n\t\tcase \"preview-block\": {\n\t\t\tconst projectRoot = findProjectRoot();\n\t\t\tif (!projectRoot) {\n\t\t\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst blocks = await listBlockNames(projectRoot);\n\t\t\tif (blocks.length === 0) {\n\t\t\t\tlogger.warn(\"No blocks found in blocks/.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst name = await select({\n\t\t\t\tmessage: \"Which block?\",\n\t\t\t\tchoices: blocks.map((b) => ({ name: b, value: b })),\n\t\t\t});\n\t\t\tconst { previewBlock } = await import(\"./block/preview.js\");\n\t\t\tawait previewBlock(name, {});\n\t\t\treturn;\n\t\t}\n\t\tcase \"admin\": {\n\t\t\tconst { adminWizard } = await import(\"./admin.js\");\n\t\t\tawait adminWizard();\n\t\t\treturn;\n\t\t}\n\t\tcase \"audit\": {\n\t\t\tconst which = await select({\n\t\t\t\tmessage: \"Which audit?\",\n\t\t\t\tchoices: [\n\t\t\t\t\t{ name: \"Doctor — overall project health\", value: \"doctor\" },\n\t\t\t\t\t{ name: \"Loading — three-phase / LCP budget\", value: \"loading\" },\n\t\t\t\t\t{ name: \"Security — vulnerabilities & exploit patterns\", value: \"security\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (which === \"doctor\") {\n\t\t\t\tconst { doctor } = await import(\"./doctor.js\");\n\t\t\t\tawait doctor({});\n\t\t\t} else if (which === \"loading\") {\n\t\t\t\tconst { auditLoading } = await import(\"./audit-loading.js\");\n\t\t\t\tawait auditLoading({});\n\t\t\t} else {\n\t\t\t\tconst { auditSecurity } = await import(\"./audit-security.js\");\n\t\t\t\tawait auditSecurity({});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase \"figma-setup\": {\n\t\t\tconst { figmaSetup } = await import(\"./figma/setup.js\");\n\t\t\tawait figmaSetup();\n\t\t\treturn;\n\t\t}\n\t}\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n// Single source of truth for the version - inlined from package.json at build\n// time, so `eds --version` can never drift from the published version.\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { logger } from \"../lib/logger.js\";\nimport * as ui from \"../lib/ui.js\";\n\nconst program = new Command();\n\nprogram\n\t.name(\"eds\")\n\t.description(\"CLI for AEM Edge Delivery Services with Figma integration\")\n\t.version(pkg.version)\n\t.option(\"--verbose\", \"Enable verbose output\")\n\t.option(\"--quiet\", \"Suppress non-error output\")\n\t.option(\"--json\", \"Output in JSON format\")\n\t.option(\"--no-color\", \"Disable color output\")\n\t.showHelpAfterError(\"(add --help for usage)\")\n\t.hook(\"preAction\", (thisCommand) => {\n\t\tconst opts = thisCommand.opts();\n\t\tif (opts.verbose) logger.setLevel(\"debug\");\n\t\tif (opts.quiet) logger.setQuiet(true);\n\t\t// `--no-color` yields `opts.color === false`; silence chalk entirely.\n\t\tif (opts.color === false) chalk.level = 0;\n\t});\n\n// ANSI-art logo above every help screen (root and subcommands).\nprogram.addHelpText(\"beforeAll\", () => ui.logo());\n\n// eds init\nprogram\n\t.command(\"init\")\n\t.description(\"Set up a freshly cloned EDS boilerplate for your authoring model (interactive)\")\n\t.option(\"--name <name>\", \"Project name (kebab-case)\")\n\t.option(\"--authoring <model>\", \"Authoring model: ue | da | gdrive | sharepoint\")\n\t.option(\"--mountpoint <url>\", \"Content source URL (document models)\")\n\t.option(\"--org <org>\", \"DA org (authoring=da)\")\n\t.option(\"--site <site>\", \"DA site (authoring=da)\")\n\t.option(\"--no-ci\", \"Skip the GitHub Actions CI workflow\")\n\t.option(\"--yes\", \"Skip prompts; apply with flags/defaults\")\n\t.action(async (options) => {\n\t\tconst { initProject } = await import(\"../commands/init.js\");\n\t\tawait initProject(options);\n\t});\n\n// eds block create <name>\nconst block = program.command(\"block\").description(\"Manage EDS blocks\");\n\nblock\n\t.command(\"create <name>\")\n\t.description(\"Scaffold a new EDS block (with Universal Editor model by default)\")\n\t.option(\"--no-ue-model\", \"Skip the Universal Editor model (generated by default)\")\n\t.action(async (name: string, options) => {\n\t\tconst { createBlock } = await import(\"../commands/block/create.js\");\n\t\tawait createBlock(name, options);\n\t});\n\n// eds block from-design <url>\nblock\n\t.command(\"from-design [design-url]\")\n\t.description(\n\t\t\"Generate an EDS block from a design (Figma/Stitch/Canva/Sketch; interactive wizard when run with no URL)\",\n\t)\n\t.option(\"--name <name>\", \"Override the inferred block name\")\n\t.option(\"--agent <type>\", \"Force agent type (claude|cursor|codex|none)\")\n\t.option(\"--dry-run\", \"Generate prompt only, do not invoke agent\")\n\t.option(\"--source <type>\", \"Content source: document|ue|cf|mixed (default: document)\")\n\t.option(\"--no-ue-model\", \"Skip the Universal Editor model (generated by default)\")\n\t.option(\"--no-screenshot\", \"Skip the screenshot fetch (fewer tokens; structural verification)\")\n\t.option(\"--no-serve\", \"Don't auto-start the live preview after generating\")\n\t.option(\"--yes\", \"Skip confirmation prompts\")\n\t.action(async (designUrl: string | undefined, options) => {\n\t\tconst { blockFromDesign } = await import(\"../commands/block/from-design.js\");\n\t\tawait blockFromDesign(designUrl, options);\n\t});\n\n// eds block list\nblock\n\t.command(\"list\")\n\t.description(\"List all blocks in the project\")\n\t.action(async (options) => {\n\t\tconst { listBlocks } = await import(\"../commands/block/list.js\");\n\t\tawait listBlocks({ ...options, json: program.opts().json });\n\t});\n\n// eds block preview <name>\nblock\n\t.command(\"preview <name>\")\n\t.description(\"Serve a live, breakpoint-switchable preview of a block in the browser\")\n\t.option(\"--port <port>\", \"Port to serve on (default: 8777, falls back if taken)\")\n\t.option(\"--widths <list>\", \"Comma-separated breakpoint widths (e.g. 375,768,1280)\")\n\t.option(\"--no-open\", \"Do not open the browser automatically\")\n\t.action(async (name: string, options) => {\n\t\tconst { previewBlock } = await import(\"../commands/block/preview.js\");\n\t\tawait previewBlock(name, options);\n\t});\n\n// eds scaffold ...\nconst scaffold = program\n\t.command(\"scaffold\")\n\t.description(\"Scaffold standard UE components and blocks\")\n\t.action(async () => {\n\t\tconst { scaffoldInteractive } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldInteractive();\n\t});\n\nscaffold\n\t.command(\"ue\")\n\t.description(\"Scaffold default-content UE components + a field-reference block (all 17 fields)\")\n\t.action(async () => {\n\t\tconst { scaffoldUe } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldUe();\n\t});\n\nscaffold\n\t.command(\"blocks [names...]\")\n\t.description(\"Scaffold standard blocks (hero, cards, columns, accordion, embed) with UE models\")\n\t.action(async (names: string[]) => {\n\t\tconst { scaffoldBlocks } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldBlocks(names);\n\t});\n\nscaffold\n\t.command(\"ci\")\n\t.description(\"Scaffold a GitHub Actions workflow (doctor + audits + project lint/build)\")\n\t.action(async () => {\n\t\tconst { scaffoldCi } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldCi();\n\t});\n\n// eds integrate [type]\nprogram\n\t.command(\"integrate [type]\")\n\t.description(\"Add a third-party service (GTM, GA4, chat, consent) to scripts/delayed.js\")\n\t.action(async (type: string | undefined) => {\n\t\tconst { integrate } = await import(\"../commands/integrate.js\");\n\t\tawait integrate(type);\n\t});\n\n// eds figma setup\nconst figma = program.command(\"figma\").description(\"Figma MCP integration\");\n\nfigma\n\t.command(\"setup\")\n\t.description(\"Configure Figma MCP for your AI agent\")\n\t.action(async () => {\n\t\tconst { figmaSetup } = await import(\"../commands/figma/setup.js\");\n\t\tawait figmaSetup();\n\t});\n\n// eds doctor\nprogram\n\t.command(\"doctor\")\n\t.description(\"Audit your EDS project for common issues\")\n\t.action(async () => {\n\t\tconst { doctor } = await import(\"../commands/doctor.js\");\n\t\tawait doctor({ json: program.opts().json });\n\t});\n\n// eds audit loading\nconst audit = program.command(\"audit\").description(\"Run project audits\");\n\naudit\n\t.command(\"loading\")\n\t.description(\"Check loading order (eager/lazy/delayed phases, LCP budget)\")\n\t.action(async () => {\n\t\tconst { auditLoading } = await import(\"../commands/audit-loading.js\");\n\t\tawait auditLoading({ json: program.opts().json });\n\t});\n\naudit\n\t.command(\"security\")\n\t.description(\n\t\t\"Scan for vulnerabilities (npm audit) and exploit patterns (XSS, secrets, tabnabbing)\",\n\t)\n\t.action(async () => {\n\t\tconst { auditSecurity } = await import(\"../commands/audit-security.js\");\n\t\tawait auditSecurity({ json: program.opts().json });\n\t});\n\n// eds preview [path...] (interactive Admin API wizard when no paths)\nprogram\n\t.command(\"preview [paths...]\")\n\t.description(\"Preview pages via Admin API (interactive wizard when run with no paths)\")\n\t.option(\"--org <org>\", \"GitHub org/owner\")\n\t.option(\"--site <site>\", \"Repository name\")\n\t.option(\"--ref <ref>\", \"Git ref (default: main)\")\n\t.action(async (paths: string[], options) => {\n\t\tif (!paths || paths.length === 0) {\n\t\t\tconst { adminWizard } = await import(\"../commands/admin.js\");\n\t\t\tawait adminWizard(\"preview\");\n\t\t\treturn;\n\t\t}\n\t\tconst { preview } = await import(\"../commands/preview.js\");\n\t\tawait preview(paths, options);\n\t});\n\n// eds publish [path...] (interactive Admin API wizard when no paths)\nprogram\n\t.command(\"publish [paths...]\")\n\t.description(\"Publish pages to live via Admin API (interactive wizard when run with no paths)\")\n\t.option(\"--org <org>\", \"GitHub org/owner\")\n\t.option(\"--site <site>\", \"Repository name\")\n\t.option(\"--ref <ref>\", \"Git ref (default: main)\")\n\t.action(async (paths: string[], options) => {\n\t\tif (!paths || paths.length === 0) {\n\t\t\tconst { adminWizard } = await import(\"../commands/admin.js\");\n\t\t\tawait adminWizard(\"publish\");\n\t\t\treturn;\n\t\t}\n\t\tconst { publish } = await import(\"../commands/publish.js\");\n\t\tawait publish(paths, options);\n\t});\n\n// No command → open the interactive menu in a terminal; fall back to help when\n// piped / non-interactive (CI). Flags and subcommands always work directly.\n(async () => {\n\ttry {\n\t\tif (process.argv.slice(2).length === 0) {\n\t\t\tif (process.stdout.isTTY) {\n\t\t\t\tconst { mainMenu } = await import(\"../commands/menu.js\");\n\t\t\t\tawait mainMenu();\n\t\t\t} else {\n\t\t\t\tprogram.outputHelp();\n\t\t\t}\n\t\t} else {\n\t\t\tawait program.parseAsync();\n\t\t}\n\t} catch (err) {\n\t\tlogger.error(err instanceof Error ? err.message : String(err));\n\t\tprocess.exitCode = 1;\n\t}\n})();\n","{\n \"name\": \"aem-eds-kit\",\n \"version\": \"0.4.7\",\n \"description\": \"CLI for AEM Edge Delivery Services with Figma MCP integration\",\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"bin\": {\n \"eds\": \"dist/bin/eds.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"CHANGELOG.md\"\n ],\n \"scripts\": {\n \"dev\": \"tsx src/bin/eds.ts\",\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"lint\": \"biome check src/ tests/\",\n \"lint:fix\": \"biome check --write src/ tests/\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepare\": \"git config core.hooksPath .githooks || true\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"keywords\": [\n \"aem\",\n \"edge-delivery-services\",\n \"helix\",\n \"figma\",\n \"mcp\",\n \"cli\",\n \"adobe\"\n ],\n \"author\": \"Piotr Godycki <piotrgodycki@yahoo.com>\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/piotrgodycki/aem-eds-kit.git\"\n },\n \"homepage\": \"https://piotrgodycki.github.io/aem-eds-kit/\",\n \"bugs\": {\n \"url\": \"https://github.com/piotrgodycki/aem-eds-kit/issues\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.0.0\",\n \"chalk\": \"^5.4.0\",\n \"commander\": \"^13.0.0\",\n \"execa\": \"^9.5.0\",\n \"ora\": \"^8.1.0\",\n \"yaml\": \"^2.6.0\",\n \"zod\": \"^3.24.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.0\",\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^2.1.0\"\n },\n \"optionalDependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.29.0\"\n }\n}\n"],"mappings":"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","names":["chalk","path","existsSync","path","writeFile","path","existsSync","mkdir","writeFile","path","existsSync","readFile","writeFile","path","chalk","existsSync","mkdir","writeFile","path","chalk","existsSync","readFile","path","mkdir","readFile","writeFile","path","chalk","ora","block","existsSync","readFile","homedir","path","existsSync","readFile","path","existsSync","path","existsSync","readFile","path","chalk","existsSync","readFile","writeFile","path","chalk","figma","previewBlock","existsSync","readFile","path","chalk","existsSync","mkdir","readFile","writeFile","path","chalk","block","existsSync","mkdir","writeFile","chalk","existsSync","readFile","readdir","path","summary","existsSync","readFile","readdir","stat","path","chalk","summary","existsSync","readFile","readdir","path","chalk","preview_exports","chalk","ora","init_preview","chalk","ora","init_preview","preview","publish","existsSync","readdir","path","initProject","blockFromDesign","scaffoldInteractive","createBlock","integrate","previewBlock","adminWizard","doctor","auditLoading","auditSecurity","figmaSetup","chalk","chalk","initProject","createBlock","blockFromDesign","listBlocks","previewBlock","scaffoldInteractive","scaffoldUe","scaffoldBlocks","scaffoldCi","integrate","figmaSetup","doctor","auditLoading","auditSecurity","adminWizard","preview","publish","mainMenu"]}
1
+ {"version":3,"sources":["../../node_modules/tsup/assets/esm_shims.js","../../src/lib/ui.ts","../../src/lib/logger.ts","../../src/lib/schemas.ts","../../src/lib/project.ts","../../src/lib/scaffold/ci.ts","../../src/lib/scaffold/fstab.ts","../../src/lib/scaffold/blocks.ts","../../src/lib/scaffold/ue.ts","../../src/commands/scaffold.ts","../../src/commands/init.ts","../../src/lib/migrate/clientlib.ts","../../src/lib/migrate/dialog.ts","../../src/lib/migrate/component.ts","../../src/commands/migrate.ts","../../src/commands/block/create.ts","../../src/lib/agents/detect.ts","../../src/lib/agents/invoke.ts","../../src/lib/config.ts","../../src/lib/figma/node-id.ts","../../src/lib/figma/prompt-builder.ts","../../src/lib/preview/harness.ts","../../src/lib/preview/server.ts","../../src/commands/block/preview.ts","../../src/commands/block/from-design.ts","../../src/commands/block/list.ts","../../src/lib/integrations.ts","../../src/commands/integrate.ts","../../src/commands/figma/setup.ts","../../src/commands/doctor.ts","../../src/commands/audit-loading.ts","../../src/commands/audit-security.ts","../../src/lib/admin-api.ts","../../src/commands/preview.ts","../../src/commands/publish.ts","../../src/commands/admin.ts","../../src/commands/menu.ts","../../src/bin/eds.ts","../../package.json"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import chalk from \"chalk\";\n\n/**\n * Shared presentation layer for the eds CLI.\n *\n * The CLI's own visual identity: a warm red→orange wordmark, a blue accent,\n * and a five-colour dot mark. Everything funnels through `chalk`, so\n * `--no-color` (which sets `chalk.level = 0`) transparently strips every\n * style defined here.\n */\n\n// ── Brand palette ──────────────────────────────────────────────\n//\n// The CLI's own palette: a warm red→orange sweep for the wordmark, a blue\n// accent, and a five-colour dot mark for the signature. Names are neutral -\n// the product's identity is its own.\n\nexport const brand = {\n\t// Warm sweep for the logo wordmark (red → ember → orange)\n\tred: chalk.hex(\"#FA0F00\"),\n\tember: chalk.hex(\"#FF4B1F\"),\n\torange: chalk.hex(\"#FF7B00\"),\n\t// Accent\n\tblue: chalk.hex(\"#2680EB\"),\n\t// Signature accent (matches the landing's `#FF5A36`)\n\taccent: chalk.hex(\"#ff5a36\"),\n\t// Five-colour dot mark (the CLI signature)\n\tdotOrange: chalk.hex(\"#F24E1E\"),\n\tdotPurple: chalk.hex(\"#A259FF\"),\n\tdotBlue: chalk.hex(\"#1ABCFE\"),\n\tdotGreen: chalk.hex(\"#0ACF83\"),\n\tdotPink: chalk.hex(\"#FF7262\"),\n\t// Semantic roles\n\tok: chalk.hex(\"#2D9D78\"),\n\twarn: chalk.hex(\"#E68619\"),\n\terr: chalk.hex(\"#D7373F\"),\n\tinfo: chalk.hex(\"#2680EB\"),\n};\n\n// ── Status icons ───────────────────────────────────────────────\n\nexport type Status = \"pass\" | \"warn\" | \"fail\" | \"info\";\n\nexport const icon = {\n\tpass: brand.ok(\"✓\"),\n\twarn: brand.warn(\"⚠\"),\n\tfail: brand.err(\"✗\"),\n\tinfo: brand.info(\"ℹ\"),\n\tbullet: chalk.dim(\"•\"),\n\tarrow: chalk.dim(\"↳\"),\n\tfigma: brand.dotPurple(\"◆\"),\n};\n\nexport function statusIcon(status: Status): string {\n\treturn icon[status];\n}\n\n// ── ANSI-aware width helpers ───────────────────────────────────\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: matching ANSI escapes\nconst ANSI = /\u001b\\[[0-9;]*m/g;\n\n/** Visible length of a string, ignoring ANSI colour codes. */\nexport function visibleLength(s: string): number {\n\treturn s.replace(ANSI, \"\").length;\n}\n\n/** Pad a (possibly coloured) string to a visible width. */\nexport function padEndVisible(s: string, width: number): string {\n\tconst pad = width - visibleLength(s);\n\treturn pad > 0 ? s + \" \".repeat(pad) : s;\n}\n\n// ── Building blocks ────────────────────────────────────────────\n\n/**\n * The CLI signature: five Figma-coloured dots, the wordmark, and a tagline.\n * Printed once at the top of long-running / interactive commands.\n */\n/**\n * The `>_` brand mark - a dark glyph on a warm tile. Matches the landing's\n * logo lockup so the CLI and the site read as the same product. With\n * `--no-color` chalk strips the tile and it degrades to plain ` >_ `.\n */\nexport function mark(): string {\n\treturn chalk.bgHex(\"#ff5a36\").hex(\"#0d0d0c\").bold(\" >_ \");\n}\n\n/** Compact brand lockup: the `>_` tile and the wordmark. */\nexport function lockup(): string {\n\treturn `${mark()} ${chalk.bold(\"aem-eds-kit\")}`;\n}\n\n// ── Five-dot signature ─────────────────────────────────────────\n\nconst DOTS_N = 5;\n\n/** The static five accent dots. */\nexport function dotsStatic(): string {\n\treturn Array.from({ length: DOTS_N }, () => brand.accent(\"●\")).join(\" \");\n}\n\n/**\n * One frame of the dot animation: a highlight bounces left↔right across the\n * five dots, trailing a dimmer glow. Driven by `logger.logoOnceAnimated`.\n */\nexport function dotsFrame(step: number): string {\n\tconst period = DOTS_N * 2 - 2; // bounce without repeating the endpoints\n\tconst phase = step % period;\n\tconst lit = phase < DOTS_N ? phase : period - phase;\n\treturn Array.from({ length: DOTS_N }, (_, i) => {\n\t\tconst d = Math.abs(i - lit);\n\t\tif (d === 0) return chalk.hex(\"#ff8a66\").bold(\"●\");\n\t\tif (d === 1) return brand.accent(\"●\");\n\t\treturn chalk.hex(\"#7a3a2a\")(\"●\");\n\t}).join(\" \");\n}\n\n/** The brand line (lockup + dots + tagline) with a given dots string. */\nexport function brandLine(dots: string, tagline: string): string {\n\treturn `${lockup()} ${dots} ${chalk.dim(tagline)}`;\n}\n\nexport function banner(tagline = \"AEM Edge Delivery Services\"): string {\n\treturn `\\n ${brandLine(dotsStatic(), tagline)}\\n`;\n}\n\n// ── Truecolor gradient helpers (for the ANSI art logo) ─────────\n\nfunction hexToRgb(hex: string): [number, number, number] {\n\tconst h = hex.replace(\"#\", \"\");\n\treturn [\n\t\tNumber.parseInt(h.slice(0, 2), 16),\n\t\tNumber.parseInt(h.slice(2, 4), 16),\n\t\tNumber.parseInt(h.slice(4, 6), 16),\n\t];\n}\n\nfunction mix(a: string, b: string, t: number): string {\n\tconst [ar, ag, ab] = hexToRgb(a);\n\tconst [br, bg, bb] = hexToRgb(b);\n\tconst r = Math.round(ar + (br - ar) * t);\n\tconst g = Math.round(ag + (bg - ag) * t);\n\tconst bl = Math.round(ab + (bb - ab) * t);\n\treturn `#${[r, g, bl].map((n) => n.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/** Colour each visible column of a line along a multi-stop gradient. */\nfunction gradientLine(line: string, stops: string[], width: number): string {\n\tconst chars = [...line];\n\tconst span = Math.max(width - 1, 1);\n\treturn chars\n\t\t.map((ch, i) => {\n\t\t\tif (ch === \" \") return ch;\n\t\t\tconst seg = (i / span) * (stops.length - 1);\n\t\t\tconst idx = Math.min(Math.floor(seg), stops.length - 2);\n\t\t\treturn chalk.hex(mix(stops[idx], stops[idx + 1], seg - idx))(ch);\n\t\t})\n\t\t.join(\"\");\n}\n\n// Bold 5-row block wordmark \"EDS\".\nconst LOGO_ART = [\n\t\"█████ ████ █████\",\n\t\"█ █ █ █ \",\n\t\"████ █ █ █████\",\n\t\"█ █ █ █\",\n\t\"█████ ████ █████\",\n];\n// Warm sweep, applied column-by-column for a smooth truecolor gradient.\nconst LOGO_STOPS = [\"#ff3b1e\", \"#ff5a36\", \"#ff7d52\"];\n\n/**\n * The full EDS wordmark — bold block-letter ANSI art with a smooth truecolor\n * warm sweep, the five-dot mark, and a tagline. Use at the top of entry\n * points (help, setup wizard, the Figma / security flows) where a strong\n * signature earns its vertical space; prefer the compact {@link banner} inside\n * routine commands. Degrades gracefully: with `--no-color` the art prints as\n * plain blocks.\n */\n/** The gradient \"EDS\" ANSI art block (indented, no trailing newline). */\nexport function logoArt(): string {\n\tconst width = columnWidth(LOGO_ART);\n\treturn LOGO_ART.map((row) => ` ${gradientLine(row, LOGO_STOPS, width)}`).join(\"\\n\");\n}\n\nexport function logo(tagline = \"AEM Edge Delivery Services\"): string {\n\treturn `\\n${logoArt()}\\n\\n ${brandLine(dotsStatic(), tagline)}\\n`;\n}\n\n/** A section heading with a red accent bar. */\nexport function heading(title: string, subtitle?: string): string {\n\tconst bar = brand.red(\"▊\");\n\tconst sub = subtitle ? ` ${chalk.dim(subtitle)}` : \"\";\n\treturn `\\n${bar} ${chalk.bold(title)}${sub}\\n`;\n}\n\n/** A dimmed horizontal rule. */\nexport function divider(width = 56): string {\n\treturn chalk.dim(\"─\".repeat(width));\n}\n\n/** A `label: value` row with the label dimmed. */\nexport function kv(label: string, value: string, labelWidth = 0): string {\n\tconst l = chalk.dim(`${label}`);\n\tconst padded = labelWidth ? padEndVisible(l, labelWidth) : l;\n\treturn ` ${padded} ${value}`;\n}\n\n/**\n * A single status line: icon, name (padded to a shared column), then a\n * dimmed message. Pass `nameWidth` from `columnWidth(names)` to align a list.\n */\nexport function statusLine(status: Status, name: string, message?: string, nameWidth = 0): string {\n\tconst padded = nameWidth ? padEndVisible(name, nameWidth) : name;\n\tconst msg = message ? ` ${chalk.dim(message)}` : \"\";\n\treturn ` ${icon[status]} ${padded}${msg}`;\n}\n\n/**\n * A summary line with the brand-accent `✔` (matches the landing page), rather\n * than the semantic green pass tick. Use for wizard summaries / brand moments.\n */\nexport function accentLine(name: string, message?: string, nameWidth = 0): string {\n\tconst padded = nameWidth ? padEndVisible(name, nameWidth) : name;\n\tconst msg = message ? ` ${chalk.dim(message)}` : \"\";\n\treturn ` ${brand.accent(\"✔\")} ${padded}${msg}`;\n}\n\n/** Widest visible length in a list of strings — use for column alignment. */\nexport function columnWidth(items: string[]): number {\n\treturn items.reduce((max, s) => Math.max(max, visibleLength(s)), 0);\n}\n\n/**\n * A rounded box around pre-formatted lines. Used for end-of-command summaries.\n * `accent` colours the border (defaults to red).\n */\nexport function box(lines: string[], accent = brand.red): string {\n\tconst inner = columnWidth(lines);\n\tconst top = accent(`╭${\"─\".repeat(inner + 2)}╮`);\n\tconst bot = accent(`╰${\"─\".repeat(inner + 2)}╯`);\n\tconst body = lines\n\t\t.map((l) => `${accent(\"│\")} ${padEndVisible(l, inner)} ${accent(\"│\")}`)\n\t\t.join(\"\\n\");\n\treturn `${top}\\n${body}\\n${bot}`;\n}\n\n/**\n * A tallied summary line like `✓ 12 passed ⚠ 3 warnings ✗ 1 failed`.\n * Zero-count segments are omitted.\n */\nexport function summary(counts: {\n\tpass?: number;\n\twarn?: number;\n\tfail?: number;\n\tinfo?: number;\n}): string {\n\tconst parts: string[] = [];\n\tif (counts.pass) parts.push(`${icon.pass} ${counts.pass} passed`);\n\tif (counts.warn) parts.push(`${icon.warn} ${counts.warn} ${plural(counts.warn, \"warning\")}`);\n\tif (counts.fail) parts.push(`${icon.fail} ${counts.fail} failed`);\n\tif (counts.info) parts.push(`${icon.info} ${counts.info} info`);\n\treturn parts.join(chalk.dim(\" \"));\n}\n\nfunction plural(n: number, word: string): string {\n\treturn n === 1 ? word : `${word}s`;\n}\n","import chalk from \"chalk\";\nimport * as ui from \"./ui.js\";\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n\tdebug: 0,\n\tinfo: 1,\n\twarn: 2,\n\terror: 3,\n\tsilent: 4,\n};\n\nfunction getLevel(): LogLevel {\n\tconst env = process.env.EDS_LOG_LEVEL?.toLowerCase();\n\tif (env && env in LEVEL_ORDER) return env as LogLevel;\n\treturn \"info\";\n}\n\nlet currentLevel: LogLevel = getLevel();\nlet quiet = false;\nlet logoShown = false;\n\nfunction shouldLog(level: LogLevel): boolean {\n\tif (quiet) return level === \"error\";\n\treturn LEVEL_ORDER[level] >= LEVEL_ORDER[currentLevel];\n}\n\nexport const logger = {\n\tsetLevel(level: LogLevel) {\n\t\tcurrentLevel = level;\n\t},\n\tsetQuiet(q: boolean) {\n\t\tquiet = q;\n\t},\n\n\tdebug(...args: unknown[]) {\n\t\tif (shouldLog(\"debug\")) console.error(chalk.gray(\"[debug]\"), ...args);\n\t},\n\tinfo(...args: unknown[]) {\n\t\tif (shouldLog(\"info\")) console.error(...args);\n\t},\n\t/**\n\t * Print the brand logo at most once per process. The interactive menu and\n\t * every command call this, so running a command directly shows the logo,\n\t * while picking it from the menu (which already showed it) doesn't repeat it.\n\t */\n\tlogoOnce(art: string) {\n\t\tif (logoShown) return;\n\t\tlogoShown = true;\n\t\tif (shouldLog(\"info\")) console.error(art);\n\t},\n\n\t/**\n\t * Like {@link logoOnce}, but animates the five accent dots on an interactive\n\t * TTY: a highlight bounces across them before settling. Falls back to the\n\t * static logo when piped, when `--no-color` is set, or when logging is quiet.\n\t * Used at the interactive entry points (menu, `block from-design`).\n\t */\n\tasync logoOnceAnimated(tagline: string) {\n\t\tif (logoShown) return;\n\t\tlogoShown = true;\n\t\tif (!shouldLog(\"info\")) return;\n\t\tconst out = process.stderr;\n\t\tif (!out.isTTY || chalk.level === 0) {\n\t\t\tconsole.error(ui.logo(tagline));\n\t\t\treturn;\n\t\t}\n\t\tout.write(`\\n${ui.logoArt()}\\n\\n`);\n\t\tconst caret = (on: boolean) => (on ? ui.brand.accent(\"▌\") : \" \");\n\t\t// Sweep: the dot highlight bounces while an accent caret blinks at the\n\t\t// end of the line.\n\t\tconst sweep = 14;\n\t\tfor (let step = 0; step < sweep; step++) {\n\t\t\tout.write(`\\r\\x1b[K ${ui.brandLine(ui.dotsFrame(step), tagline)} ${caret(step % 2 === 0)}`);\n\t\t\tawait new Promise((r) => setTimeout(r, 70));\n\t\t}\n\t\t// Settle the dots, then a few idle blinks of the caret.\n\t\tfor (let b = 0; b < 4; b++) {\n\t\t\tout.write(`\\r\\x1b[K ${ui.brandLine(ui.dotsStatic(), tagline)} ${caret(b % 2 === 0)}`);\n\t\t\tawait new Promise((r) => setTimeout(r, 200));\n\t\t}\n\t\tout.write(`\\r\\x1b[K ${ui.brandLine(ui.dotsStatic(), tagline)}\\n`);\n\t},\n\tsuccess(...args: unknown[]) {\n\t\tif (shouldLog(\"info\")) console.error(chalk.green(\"✓\"), ...args);\n\t},\n\twarn(...args: unknown[]) {\n\t\tif (shouldLog(\"warn\")) console.error(chalk.yellow(\"⚠\"), ...args);\n\t},\n\terror(...args: unknown[]) {\n\t\tif (shouldLog(\"error\")) console.error(chalk.red(\"✗\"), ...args);\n\t},\n};\n","import { z } from \"zod\";\n\nexport const figmaUrlSchema = z.object({\n\tfileKey: z.string().min(1),\n\tnodeId: z.string().optional(),\n\tfileName: z.string().optional(),\n});\n\nexport const edsConfigSchema = z.object({\n\tagent: z.enum([\"claude\", \"cursor\", \"codex\"]).optional(),\n\tfigma: z\n\t\t.object({\n\t\t\tmcpEndpoint: z.string().url().optional(),\n\t\t\ttoken: z.string().optional(),\n\t\t})\n\t\t.optional(),\n\tadmin: z\n\t\t.object({\n\t\t\torg: z.string().optional(),\n\t\t\tsite: z.string().optional(),\n\t\t\tref: z.string().default(\"main\"),\n\t\t})\n\t\t.optional(),\n});\n\nexport const edsProjectSchema = z.object({\n\troot: z.string(),\n\thasFstab: z.boolean(),\n\thasBlocks: z.boolean(),\n\thasHeadHtml: z.boolean(),\n});\n\nexport const edsMetaSchema = z.object({\n\tfigmaFileKey: z.string(),\n\tfigmaNodeId: z.string().optional(),\n\tlastSyncedAt: z.string().datetime(),\n\tpromptVersion: z.string(),\n\tagentUsed: z.string().optional(),\n});\n\nexport const kebabCaseRegex = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\n\nexport type FigmaUrlParts = z.infer<typeof figmaUrlSchema>;\nexport type EdsConfig = z.infer<typeof edsConfigSchema>;\nexport type EdsProject = z.infer<typeof edsProjectSchema>;\nexport type EdsMeta = z.infer<typeof edsMetaSchema>;\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { EdsProject } from \"./schemas.js\";\nimport { edsProjectSchema } from \"./schemas.js\";\n\n/**\n * Files that mark an EDS/AEM project root. `fstab.yaml` is the classic\n * Franklin/Helix mountpoint, but Universal Editor / crosswalk and Document\n * Authoring projects often don't have one - so we also accept the EDS runtime\n * (`scripts/`), the document `head.html`, the UE config, and the crosswalk /\n * query maps. A directory counts as a root if it has ANY of these.\n */\nconst ROOT_MARKERS = [\n\t\"fstab.yaml\",\n\t\"head.html\",\n\t\"helix-query.yaml\",\n\t\"component-definition.json\",\n\t\"paths.json\",\n\t\"scripts/scripts.js\",\n\t\"scripts/aem.js\",\n];\n\n/**\n * Walk up from `startDir` looking for an EDS project root - the first ancestor\n * directory that contains any of {@link ROOT_MARKERS}.\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | undefined {\n\tlet dir = path.resolve(startDir);\n\tconst { root } = path.parse(dir);\n\n\twhile (dir !== root) {\n\t\tif (ROOT_MARKERS.some((m) => existsSync(path.join(dir, m)))) {\n\t\t\treturn dir;\n\t\t}\n\t\tdir = path.dirname(dir);\n\t}\n\t// Also check the filesystem root itself (the loop stops before testing it).\n\tif (ROOT_MARKERS.some((m) => existsSync(path.join(root, m)))) return root;\n\treturn undefined;\n}\n\nexport function detectProject(rootDir: string): EdsProject {\n\treturn edsProjectSchema.parse({\n\t\troot: rootDir,\n\t\thasFstab: existsSync(path.join(rootDir, \"fstab.yaml\")),\n\t\thasBlocks: existsSync(path.join(rootDir, \"blocks\")),\n\t\thasHeadHtml: existsSync(path.join(rootDir, \"head.html\")),\n\t});\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/** Repo-relative path of the generated workflow. */\nexport const CI_WORKFLOW_PATH = \".github/workflows/eds.yml\";\n\n/**\n * GitHub Actions boilerplate for an EDS project: runs the project's own\n * lint/build (if defined) plus the eds audits as a PR gatekeeper. The audits\n * exit non-zero on problems, so a bad change fails the check.\n *\n * `if:` conditions are intentionally written without a `${{ }}` wrapper so this\n * template literal has no `${` sequences to escape.\n */\nexport const CI_WORKFLOW = `name: EDS checks\n\n# Generated by aem-eds-kit (\\`eds scaffold ci\\`). Runs the project's own\n# lint/build plus the eds audits as a gatekeeper on every PR and push to main.\non:\n pull_request:\n push:\n branches: [main]\n\njobs:\n checks:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-node@v4\n with:\n node-version: 20\n\n # Install project dependencies when the repo has them.\n - name: Install dependencies\n run: |\n if [ -f package-lock.json ]; then\n npm ci\n elif [ -f package.json ]; then\n npm install\n fi\n\n # The project's own scripts, if defined (skipped otherwise).\n - name: Lint\n if: hashFiles('package.json') != ''\n run: npm run lint --if-present\n - name: Build\n if: hashFiles('package.json') != ''\n run: npm run build --if-present\n\n # aem-eds-kit audits - run via npx, no install needed. Each exits\n # non-zero on failures, so a bad PR fails the check.\n - name: Project health (doctor)\n run: npx --yes aem-eds-kit@latest doctor\n - name: Loading & LCP budget\n run: npx --yes aem-eds-kit@latest audit loading\n - name: Security & exploit scan\n run: npx --yes aem-eds-kit@latest audit security\n`;\n\nexport interface CiScaffoldResult {\n\tpath: string;\n\tcreated: boolean;\n}\n\n/**\n * Write `.github/workflows/eds.yml` into the project. Never overwrites an\n * existing workflow - returns `created: false` so the caller can report it.\n */\nexport async function writeCiWorkflow(projectRoot: string): Promise<CiScaffoldResult> {\n\tconst file = path.join(projectRoot, \".github\", \"workflows\", \"eds.yml\");\n\tif (existsSync(file)) return { path: CI_WORKFLOW_PATH, created: false };\n\tawait mkdir(path.dirname(file), { recursive: true });\n\tawait writeFile(file, CI_WORKFLOW);\n\treturn { path: CI_WORKFLOW_PATH, created: true };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/** Authoring models `eds init` can set a project up for. */\nexport type Authoring = \"ue\" | \"da\" | \"gdrive\" | \"sharepoint\";\n\nexport const AUTHORING_NAMES: Record<Authoring, string> = {\n\tue: \"Universal Editor (crosswalk)\",\n\tda: \"Document Authoring (da.live)\",\n\tgdrive: \"Document Authoring (Google Drive)\",\n\tsharepoint: \"Document Authoring (SharePoint)\",\n};\n\n/**\n * Document-based models mount a content source via `fstab.yaml`; Universal\n * Editor / crosswalk authors in AEM and doesn't need one. So we only generate\n * fstab when it's actually required.\n */\nexport function needsFstab(a: Authoring): boolean {\n\treturn a !== \"ue\";\n}\n\n/** The DA (da.live) content mountpoint for an org/site. */\nexport function daMountpoint(org: string, site: string): string {\n\treturn `https://content.da.live/${org}/${site}/`;\n}\n\n/** Render an `fstab.yaml` that mounts `/` to a content source. */\nexport function fstabYaml(mountpoint: string): string {\n\treturn `mountpoints:\\n /: ${mountpoint}\\n`;\n}\n\n/**\n * Write `fstab.yaml`. `eds init` owns this file, so it overwrites the\n * boilerplate's placeholder mountpoint with the real one.\n */\nexport async function writeFstab(projectRoot: string, mountpoint: string): Promise<string> {\n\tawait writeFile(path.join(projectRoot, \"fstab.yaml\"), fstabYaml(mountpoint));\n\treturn \"fstab.yaml\";\n}\n\n/**\n * A minimal crosswalk `paths.json` mapping AEM content under\n * `/content/<site>/` to the site root. A sensible starting point - adjust the\n * mapping if your AEM content path differs.\n */\nexport function pathsJson(site: string): string {\n\treturn `${JSON.stringify(\n\t\t{\n\t\t\tmappings: [`/content/${site}/:/`],\n\t\t\tincludes: [`/content/${site}/`],\n\t\t},\n\t\tnull,\n\t\t2,\n\t)}\\n`;\n}\n\nexport async function writePaths(projectRoot: string, site: string): Promise<string> {\n\tawait writeFile(path.join(projectRoot, \"paths.json\"), pathsJson(site));\n\treturn \"paths.json\";\n}\n","/**\n * Standard block library, modelled on the AEM Block Collection. Each block is\n * self-contained: `<name>.js`, `<name>.css`, and a distributed `_<name>.json`\n * (definitions / models / filters) so it's authorable in the Universal Editor.\n * Container blocks (cards, columns, accordion) use the child-item multifield\n * pattern. Scaffolding registers each block id in the central `section` filter.\n */\n\nexport interface BlockTemplate {\n\tid: string;\n\ttitle: string;\n\tjs: string;\n\tcss: string;\n\t/** Contents of `_<name>.json`. */\n\tmodel: string;\n}\n\nfunction json(value: unknown): string {\n\treturn `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nconst blockDef = (title: string, id: string, model: string) => ({\n\ttitle,\n\tid,\n\tplugins: {\n\t\txwalk: {\n\t\t\tpage: {\n\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\ttemplate: { name: title, model },\n\t\t\t},\n\t\t},\n\t},\n});\n\nconst containerDef = (title: string, id: string, filter: string) => ({\n\ttitle,\n\tid,\n\tplugins: {\n\t\txwalk: {\n\t\t\tpage: {\n\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\ttemplate: { name: title, filter },\n\t\t\t},\n\t\t},\n\t},\n});\n\nconst itemDef = (title: string, id: string, model: string) => ({\n\ttitle,\n\tid,\n\tplugins: {\n\t\txwalk: {\n\t\t\tpage: {\n\t\t\t\tresourceType: \"core/franklin/components/block/v1/block/item\",\n\t\t\t\ttemplate: { name: title, model },\n\t\t\t},\n\t\t},\n\t},\n});\n\nexport const STANDARD_BLOCKS: BlockTemplate[] = [\n\t// ── hero ──────────────────────────────────────────────\n\t{\n\t\tid: \"hero\",\n\t\ttitle: \"Hero\",\n\t\tjs: `// Block: hero\nexport default function decorate(block) {\n block.classList.add('hero');\n const picture = block.querySelector('picture');\n if (picture) picture.closest('div')?.classList.add('hero-image');\n}\n`,\n\t\tcss: `/* Block: hero */\n.hero {\n position: relative;\n display: grid;\n min-height: 60vh;\n align-content: center;\n}\n\n.hero .hero-image img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n z-index: -1;\n}\n\n.hero h1,\n.hero p {\n max-width: 720px;\n margin: 0 auto;\n padding: 0 var(--spacing-m, 16px);\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [blockDef(\"Hero\", \"hero\", \"hero\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hero\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Alt\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"title\", label: \"Title\" },\n\t\t\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"text\", value: \"\", label: \"Text\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [],\n\t\t}),\n\t},\n\n\t// ── cards (container / multifield) ────────────────────\n\t{\n\t\tid: \"cards\",\n\t\ttitle: \"Cards\",\n\t\tjs: `// Block: cards\nexport default function decorate(block) {\n const ul = document.createElement('ul');\n [...block.children].forEach((row) => {\n const li = document.createElement('li');\n while (row.firstElementChild) li.append(row.firstElementChild);\n [...li.children].forEach((cell) => {\n cell.className = cell.querySelector('picture') ? 'cards-card-image' : 'cards-card-body';\n });\n ul.append(li);\n });\n block.textContent = '';\n block.append(ul);\n}\n`,\n\t\tcss: `/* Block: cards */\n.cards ul {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));\n gap: var(--spacing-m, 16px);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.cards li {\n border: 1px solid var(--color-line, #e5e5e5);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.cards .cards-card-image img {\n width: 100%;\n aspect-ratio: 16 / 9;\n object-fit: cover;\n}\n\n.cards .cards-card-body {\n padding: var(--spacing-m, 16px);\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [containerDef(\"Cards\", \"cards\", \"cards\"), itemDef(\"Card\", \"card\", \"card\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"card\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Alt\" },\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"title\", label: \"Title\" },\n\t\t\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"text\", value: \"\", label: \"Text\" },\n\t\t\t\t\t\t{ component: \"aem-content\", name: \"link\", label: \"Link\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [{ id: \"cards\", components: [\"card\"] }],\n\t\t}),\n\t},\n\n\t// ── columns ───────────────────────────────────────────\n\t{\n\t\tid: \"columns\",\n\t\ttitle: \"Columns\",\n\t\tjs: `// Block: columns\nexport default function decorate(block) {\n const cols = [...block.firstElementChild.children];\n block.classList.add(\\`columns-\\${cols.length}-cols\\`);\n [...block.children].forEach((row) => {\n [...row.children].forEach((col) => {\n const pic = col.querySelector('picture');\n if (pic && pic.closest('div') === col) col.classList.add('columns-img-col');\n });\n });\n}\n`,\n\t\tcss: `/* Block: columns */\n.columns > div {\n display: grid;\n gap: var(--spacing-l, 32px);\n}\n\n@media (width >= 900px) {\n .columns > div {\n grid-template-columns: repeat(var(--columns, 2), 1fr);\n }\n .columns-2-cols > div { --columns: 2; }\n .columns-3-cols > div { --columns: 3; }\n .columns-4-cols > div { --columns: 4; }\n}\n\n.columns img { width: 100%; height: auto; }\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [blockDef(\"Columns\", \"columns\", \"columns\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"columns\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcomponent: \"richtext\",\n\t\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t\t\tname: \"content\",\n\t\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\t\tlabel: \"Content\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [],\n\t\t}),\n\t},\n\n\t// ── accordion (container / <details>) ─────────────────\n\t{\n\t\tid: \"accordion\",\n\t\ttitle: \"Accordion\",\n\t\tjs: `// Block: accordion\nexport default function decorate(block) {\n [...block.children].forEach((row) => {\n const [label, body] = row.children;\n const details = document.createElement('details');\n const summary = document.createElement('summary');\n summary.className = 'accordion-item-label';\n if (label) summary.append(...label.childNodes);\n const content = document.createElement('div');\n content.className = 'accordion-item-body';\n if (body) content.append(...body.childNodes);\n details.append(summary, content);\n row.replaceWith(details);\n });\n}\n`,\n\t\tcss: `/* Block: accordion */\n.accordion details {\n border-bottom: 1px solid var(--color-line, #e5e5e5);\n}\n\n.accordion summary {\n cursor: pointer;\n padding: var(--spacing-m, 16px) 0;\n font-weight: 600;\n list-style: none;\n}\n\n.accordion summary::after { content: '+'; float: right; }\n.accordion details[open] summary::after { content: '−'; }\n\n.accordion .accordion-item-body {\n padding-bottom: var(--spacing-m, 16px);\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [\n\t\t\t\tcontainerDef(\"Accordion\", \"accordion\", \"accordion\"),\n\t\t\t\titemDef(\"Accordion Item\", \"accordion-item\", \"accordion-item\"),\n\t\t\t],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"accordion-item\",\n\t\t\t\t\tfields: [\n\t\t\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"label\", label: \"Label\" },\n\t\t\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"body\", value: \"\", label: \"Body\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [{ id: \"accordion\", components: [\"accordion-item\"] }],\n\t\t}),\n\t},\n\n\t// ── embed ─────────────────────────────────────────────\n\t{\n\t\tid: \"embed\",\n\t\ttitle: \"Embed\",\n\t\tjs: `// Block: embed\nexport default function decorate(block) {\n const link = block.querySelector('a');\n const url = link?.href;\n block.textContent = '';\n if (!url) return;\n const wrapper = document.createElement('div');\n wrapper.className = 'embed-wrapper';\n const iframe = document.createElement('iframe');\n iframe.src = url;\n iframe.loading = 'lazy';\n iframe.title = 'Embedded content';\n iframe.setAttribute('allow', 'encrypted-media; fullscreen');\n wrapper.append(iframe);\n block.append(wrapper);\n}\n`,\n\t\tcss: `/* Block: embed */\n.embed .embed-wrapper {\n position: relative;\n aspect-ratio: 16 / 9;\n}\n\n.embed iframe {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n`,\n\t\tmodel: json({\n\t\t\tdefinitions: [blockDef(\"Embed\", \"embed\", \"embed\")],\n\t\t\tmodels: [\n\t\t\t\t{\n\t\t\t\t\tid: \"embed\",\n\t\t\t\t\tfields: [{ component: \"aem-content\", name: \"link\", label: \"Embed URL\" }],\n\t\t\t\t},\n\t\t\t],\n\t\t\tfilters: [],\n\t\t}),\n\t},\n];\n\nexport function blockById(id: string): BlockTemplate | undefined {\n\treturn STANDARD_BLOCKS.find((b) => b.id === id);\n}\n","/**\n * Deterministic Universal Editor scaffolding: the default-content components\n * every UE/EDS project ships with, plus a `field-reference` block whose model\n * demonstrates all 17 UE field types and a multifield. No agent involved.\n *\n * Config is merged by id, so running this on an existing project adds what's\n * missing without clobbering your entries.\n */\n\n// ── Default-content components (core/franklin) ─────────────────\n\nexport const DEFAULT_CONTENT_DEFINITIONS = [\n\t{\n\t\ttitle: \"Text\",\n\t\tid: \"text\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/text/v1/text\",\n\t\t\t\t\ttemplate: { text: \"<p>Text</p>\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttitle: \"Image\",\n\t\tid: \"image\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/image/v1/image\",\n\t\t\t\t\ttemplate: { image: \"\", imageAlt: \"\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttitle: \"Button\",\n\t\tid: \"button\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/button/v1/button\",\n\t\t\t\t\ttemplate: { text: \"Button\", href: \"\", type: \"\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\t{\n\t\ttitle: \"Title\",\n\t\tid: \"title\",\n\t\tplugins: {\n\t\t\txwalk: {\n\t\t\t\tpage: {\n\t\t\t\t\tresourceType: \"core/franklin/components/title/v1/title\",\n\t\t\t\t\ttemplate: { title: \"Title\", type: \"h2\" },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n];\n\nexport const DEFAULT_CONTENT_MODELS = [\n\t{\n\t\tid: \"title\",\n\t\tfields: [\n\t\t\t{ component: \"text\", valueType: \"string\", name: \"title\", label: \"Title\" },\n\t\t\t{\n\t\t\t\tcomponent: \"select\",\n\t\t\t\tvalueType: \"string\",\n\t\t\t\tname: \"type\",\n\t\t\t\tlabel: \"Type\",\n\t\t\t\tvalue: \"h2\",\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"H1\", value: \"h1\" },\n\t\t\t\t\t{ name: \"H2\", value: \"h2\" },\n\t\t\t\t\t{ name: \"H3\", value: \"h3\" },\n\t\t\t\t\t{ name: \"H4\", value: \"h4\" },\n\t\t\t\t\t{ name: \"H5\", value: \"h5\" },\n\t\t\t\t\t{ name: \"H6\", value: \"h6\" },\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: \"image\",\n\t\tfields: [\n\t\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image\", multi: false },\n\t\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Alt Text\" },\n\t\t],\n\t},\n\t{\n\t\tid: \"button\",\n\t\tfields: [\n\t\t\t{ component: \"text\", valueType: \"string\", name: \"text\", label: \"Text\" },\n\t\t\t{ component: \"aem-content\", name: \"href\", label: \"Link\" },\n\t\t\t{\n\t\t\t\tcomponent: \"select\",\n\t\t\t\tvalueType: \"string\",\n\t\t\t\tname: \"type\",\n\t\t\t\tlabel: \"Type\",\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"Default\", value: \"\" },\n\t\t\t\t\t{ name: \"Primary\", value: \"primary\" },\n\t\t\t\t\t{ name: \"Secondary\", value: \"secondary\" },\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t},\n];\n\n// ── field-reference block: one of every UE field type + a multifield ──\n\n/** All 17 UE field component types, each shown once, plus a repeatable container. */\nexport function fieldReferenceFields(): Array<Record<string, unknown>> {\n\treturn [\n\t\t{ component: \"tab\", name: \"basics\", label: \"Basics\" },\n\t\t{ component: \"text\", valueType: \"string\", name: \"text\", label: \"Text (single line)\" },\n\t\t{\n\t\t\tcomponent: \"textarea\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"textarea\",\n\t\t\tlabel: \"Textarea (multi-line)\",\n\t\t},\n\t\t{ component: \"richtext\", valueType: \"string\", name: \"richtext\", value: \"\", label: \"Rich text\" },\n\t\t{ component: \"number\", valueType: \"number\", name: \"number\", label: \"Number\" },\n\t\t{ component: \"boolean\", valueType: \"boolean\", name: \"boolean\", value: false, label: \"Boolean\" },\n\t\t{ component: \"date-time\", valueType: \"date\", name: \"date\", label: \"Date / time\" },\n\t\t{ component: \"tab\", name: \"selection\", label: \"Selection\" },\n\t\t{\n\t\t\tcomponent: \"select\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"select\",\n\t\t\tlabel: \"Select\",\n\t\t\tvalue: \"a\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"Option A\", value: \"a\" },\n\t\t\t\t{ name: \"Option B\", value: \"b\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tcomponent: \"radio-group\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"radio\",\n\t\t\tlabel: \"Radio group\",\n\t\t\tvalue: \"x\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"X\", value: \"x\" },\n\t\t\t\t{ name: \"Y\", value: \"y\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tcomponent: \"multiselect\",\n\t\t\tvalueType: \"string\",\n\t\t\tname: \"classes\",\n\t\t\tlabel: \"Multiselect (CSS classes)\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"Highlight\", value: \"highlight\" },\n\t\t\t\t{ name: \"Dark\", value: \"dark\" },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tcomponent: \"checkbox-group\",\n\t\t\tvalueType: \"string[]\",\n\t\t\tname: \"toggles\",\n\t\t\tlabel: \"Checkbox group\",\n\t\t\toptions: [\n\t\t\t\t{ name: \"Show title\", value: \"show-title\" },\n\t\t\t\t{ name: \"Show image\", value: \"show-image\" },\n\t\t\t],\n\t\t},\n\t\t{ component: \"tab\", name: \"media\", label: \"Media & content\" },\n\t\t{ component: \"reference\", valueType: \"string\", name: \"image\", label: \"Image (DAM asset)\" },\n\t\t{ component: \"text\", valueType: \"string\", name: \"imageAlt\", label: \"Image alt\" },\n\t\t{ component: \"aem-content\", name: \"link\", label: \"Link (page / URL)\" },\n\t\t{ component: \"aem-content-fragment\", name: \"contentFragment\", label: \"Content Fragment\" },\n\t\t{\n\t\t\tcomponent: \"aem-experience-fragment\",\n\t\t\tname: \"experienceFragment\",\n\t\t\tlabel: \"Experience Fragment\",\n\t\t},\n\t\t{ component: \"aem-tag\", valueType: \"string\", name: \"tags\", label: \"Tags\" },\n\t\t{ component: \"tab\", name: \"repeatable\", label: \"Multifield\" },\n\t\t{\n\t\t\tcomponent: \"container\",\n\t\t\tname: \"items\",\n\t\t\tlabel: \"Items (repeatable)\",\n\t\t\tmulti: true,\n\t\t\tcollapsible: true,\n\t\t\tfields: [\n\t\t\t\t{ component: \"text\", valueType: \"string\", name: \"itemTitle\", label: \"Title\" },\n\t\t\t\t{ component: \"richtext\", valueType: \"string\", name: \"itemText\", value: \"\", label: \"Text\" },\n\t\t\t\t{ component: \"aem-content\", name: \"itemLink\", label: \"Link\" },\n\t\t\t],\n\t\t},\n\t];\n}\n\nexport const FIELD_REFERENCE_JS = `// Block: field-reference\n// A living reference of every Universal Editor field type (see _field-reference.json).\n// Authors use it to see what's available; delete it before launch.\nexport default function decorate(block) {\n // Default/document authoring hands the field values in as rows - nothing to\n // enhance here beyond a scoping class. In Universal Editor the fields above\n // are what you drop and edit.\n block.classList.add('field-reference');\n}\n`;\n\nexport const FIELD_REFERENCE_CSS = `/* Block: field-reference */\n.field-reference {\n display: grid;\n gap: var(--spacing-m, 16px);\n padding: var(--spacing-l, 32px) 0;\n}\n`;\n\nexport function fieldReferenceModelFile(): string {\n\tconst model = {\n\t\tdefinitions: [\n\t\t\t{\n\t\t\t\ttitle: \"Field Reference\",\n\t\t\t\tid: \"field-reference\",\n\t\t\t\tplugins: {\n\t\t\t\t\txwalk: {\n\t\t\t\t\t\tpage: {\n\t\t\t\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\t\t\t\ttemplate: { name: \"Field Reference\", model: \"field-reference\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmodels: [{ id: \"field-reference\", fields: fieldReferenceFields() }],\n\t\tfilters: [],\n\t};\n\treturn `${JSON.stringify(model, null, 2)}\\n`;\n}\n\n// ── Merge helpers (add-by-id, never clobber) ───────────────────\n\ninterface Identified {\n\tid: string;\n}\n\nexport function mergeById<T extends Identified>(existing: T[], additions: T[]): T[] {\n\tconst seen = new Set(existing.map((e) => e.id));\n\treturn [...existing, ...additions.filter((a) => !seen.has(a.id))];\n}\n\ninterface DefinitionGroup {\n\ttitle: string;\n\tid: string;\n\tcomponents: Identified[];\n}\ninterface Definitions {\n\tgroups: DefinitionGroup[];\n}\n\n/** Merge component definitions into groups (Default Content + Blocks). */\nexport function mergeDefinitions(\n\texisting: Definitions | null,\n\tdefaultContent: Identified[],\n\tblockDefs: Identified[],\n): Definitions {\n\tconst groups = existing?.groups ? [...existing.groups] : [];\n\tconst ensure = (id: string, title: string, comps: Identified[]) => {\n\t\tlet g = groups.find((x) => x.id === id);\n\t\tif (!g) {\n\t\t\tg = { id, title, components: [] };\n\t\t\tgroups.push(g);\n\t\t}\n\t\tg.components = mergeById(g.components, comps);\n\t};\n\tensure(\"default\", \"Default Content\", defaultContent);\n\tensure(\"blocks\", \"Blocks\", blockDefs);\n\treturn { groups };\n}\n\ninterface Filter {\n\tid: string;\n\tcomponents: string[];\n}\n\n/** Add component ids to the `section` filter (union). */\nexport function mergeSectionFilter(existing: Filter[] | null, ids: string[]): Filter[] {\n\tconst filters = existing ? [...existing] : [];\n\tlet section = filters.find((f) => f.id === \"section\");\n\tif (!section) {\n\t\tsection = { id: \"section\", components: [\"text\", \"image\", \"button\", \"title\"] };\n\t\tfilters.push(section);\n\t}\n\tsection.components = [...new Set([...section.components, ...ids])];\n\treturn filters;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { type BlockTemplate, STANDARD_BLOCKS, blockById } from \"../lib/scaffold/blocks.js\";\nimport { writeCiWorkflow } from \"../lib/scaffold/ci.js\";\nimport {\n\tDEFAULT_CONTENT_DEFINITIONS,\n\tDEFAULT_CONTENT_MODELS,\n\tFIELD_REFERENCE_CSS,\n\tFIELD_REFERENCE_JS,\n\tfieldReferenceModelFile,\n\tmergeById,\n\tmergeDefinitions,\n\tmergeSectionFilter,\n} from \"../lib/scaffold/ue.js\";\nimport * as ui from \"../lib/ui.js\";\n\n// biome-ignore lint/suspicious/noExplicitAny: config JSON is free-form\ntype Json = any;\n\nasync function readJson(file: string): Promise<Json | null> {\n\tif (!existsSync(file)) return null;\n\ttry {\n\t\treturn JSON.parse(await readFile(file, \"utf-8\"));\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function writeJson(file: string, data: Json): Promise<void> {\n\tawait writeFile(file, `${JSON.stringify(data, null, 2)}\\n`);\n}\n\n/**\n * `eds scaffold ue` - write the default-content UE components and a\n * field-reference block (every field type + a multifield), merging into any\n * existing component-definition/models/filters.\n */\nexport async function scaffoldUe(): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Scaffold - Universal Editor\"));\n\n\tconst created: string[] = [];\n\n\t// 1. field-reference block\n\tconst blockDir = path.join(projectRoot, \"blocks\", \"field-reference\");\n\tawait mkdir(blockDir, { recursive: true });\n\tawait writeFile(path.join(blockDir, \"field-reference.js\"), FIELD_REFERENCE_JS);\n\tawait writeFile(path.join(blockDir, \"field-reference.css\"), FIELD_REFERENCE_CSS);\n\tawait writeFile(path.join(blockDir, \"_field-reference.json\"), fieldReferenceModelFile());\n\tcreated.push(\"blocks/field-reference/ (all 17 fields + multifield)\");\n\n\t// 2. merge the three UE config files\n\tconst defFile = path.join(projectRoot, \"component-definition.json\");\n\tconst modelsFile = path.join(projectRoot, \"component-models.json\");\n\tconst filtersFile = path.join(projectRoot, \"component-filters.json\");\n\n\tconst blockDefs = [\n\t\t{\n\t\t\ttitle: \"Field Reference\",\n\t\t\tid: \"field-reference\",\n\t\t\tplugins: {\n\t\t\t\txwalk: {\n\t\t\t\t\tpage: {\n\t\t\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\t\t\ttemplate: { name: \"Field Reference\", model: \"field-reference\" },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t];\n\n\tconst definitions = mergeDefinitions(\n\t\tawait readJson(defFile),\n\t\tDEFAULT_CONTENT_DEFINITIONS,\n\t\tblockDefs,\n\t);\n\tawait writeJson(defFile, definitions);\n\tcreated.push(\"component-definition.json (default content + field-reference)\");\n\n\tconst existingModels: Json[] = (await readJson(modelsFile)) ?? [];\n\tconst fieldRefModel = JSON.parse(fieldReferenceModelFile()).models[0];\n\tconst models = mergeById(existingModels, [...DEFAULT_CONTENT_MODELS, fieldRefModel]);\n\tawait writeJson(modelsFile, models);\n\tcreated.push(\"component-models.json (title / image / button / field-reference)\");\n\n\tconst filters = mergeSectionFilter(await readJson(filtersFile), [\"field-reference\"]);\n\tawait writeJson(filtersFile, filters);\n\tcreated.push(\"component-filters.json (section filter)\");\n\n\tlogger.info(ui.heading(\"Created / merged\"));\n\tconst names = created.map((c) => c.split(\" \")[0]);\n\tconst w = ui.columnWidth(names);\n\tfor (const c of created) {\n\t\tconst [name, ...rest] = c.split(\" \");\n\t\tlogger.info(ui.accentLine(name, rest.join(\" \").replace(/^\\((.*)\\)$/, \"$1\"), w));\n\t}\n\tlogger.info(\"\");\n\tlogger.info(ui.box([\"Universal Editor scaffold ready\"]));\n}\n\n/**\n * `eds scaffold blocks [names...]` - scaffold standard Block Collection blocks\n * (hero, cards, columns, accordion, embed), each with JS/CSS + a distributed\n * `_<name>.json` UE model, and register them in the central `section` filter.\n */\nexport async function scaffoldBlocks(names?: string[]): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Scaffold — standard blocks\"));\n\n\tlet selected: BlockTemplate[];\n\tif (names?.length) {\n\t\tselected = names.map((n) => blockById(n.trim())).filter((b): b is BlockTemplate => !!b);\n\t\tconst unknown = names.filter((n) => !blockById(n.trim()));\n\t\tif (unknown.length) {\n\t\t\tlogger.warn(\n\t\t\t\t`Unknown block(s): ${unknown.join(\", \")}. Available: ${STANDARD_BLOCKS.map((b) => b.id).join(\", \")}`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\tselected = STANDARD_BLOCKS;\n\t}\n\n\tconst createdIds: string[] = [];\n\tconst skipped: string[] = [];\n\tfor (const b of selected) {\n\t\tconst dir = path.join(projectRoot, \"blocks\", b.id);\n\t\tif (existsSync(dir)) {\n\t\t\tskipped.push(b.id);\n\t\t\tcontinue;\n\t\t}\n\t\tawait mkdir(dir, { recursive: true });\n\t\tawait writeFile(path.join(dir, `${b.id}.js`), b.js);\n\t\tawait writeFile(path.join(dir, `${b.id}.css`), b.css);\n\t\tawait writeFile(path.join(dir, `_${b.id}.json`), b.model);\n\t\tcreatedIds.push(b.id);\n\t}\n\n\tconst filtersFile = path.join(projectRoot, \"component-filters.json\");\n\tconst filters = mergeSectionFilter(\n\t\tawait readJson(filtersFile),\n\t\tselected.map((b) => b.id),\n\t);\n\tawait writeJson(filtersFile, filters);\n\n\tlogger.info(ui.heading(\"Blocks\"));\n\tconst w = ui.columnWidth([...createdIds, ...skipped, \"component-filters\"]);\n\tfor (const id of createdIds) logger.info(ui.accentLine(id, \"created\", w));\n\tfor (const id of skipped) logger.info(ui.statusLine(\"warn\", id, \"already exists — skipped\", w));\n\tlogger.info(\"\");\n\tlogger.info(ui.box([`${createdIds.length} block(s) scaffolded + registered`]));\n}\n\n/**\n * `eds scaffold ci` - drop a GitHub Actions workflow that runs the project's\n * own lint/build plus the eds audits (doctor, loading, security) as a PR\n * gatekeeper. Deterministic, no agent.\n */\nexport async function scaffoldCi(): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Scaffold - CI workflow\"));\n\n\tconst res = await writeCiWorkflow(projectRoot);\n\tlogger.info(ui.heading(\"GitHub Actions\"));\n\tif (res.created) {\n\t\tlogger.info(ui.accentLine(res.path, \"doctor + audit loading + audit security + lint/build\"));\n\t} else {\n\t\tlogger.info(ui.statusLine(\"warn\", res.path, \"already exists - skipped\"));\n\t}\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tui.box([\n\t\t\tres.created\n\t\t\t\t? \"CI workflow scaffolded - commit it and it runs on every PR\"\n\t\t\t\t: \"CI workflow left untouched\",\n\t\t]),\n\t);\n}\n\n/** Interactive scaffold picker (`eds scaffold` with no subcommand). */\nexport async function scaffoldInteractive(): Promise<void> {\n\tconst { select, checkbox } = await import(\"@inquirer/prompts\");\n\tlogger.logoOnce(ui.logo(\"Scaffold\"));\n\tconst what = await select({\n\t\tmessage: \"What do you want to scaffold?\",\n\t\tchoices: [\n\t\t\t{ name: \"Universal Editor config + field-reference (all 17 field types)\", value: \"ue\" },\n\t\t\t{ name: \"Standard blocks (hero, cards, columns, accordion, embed)\", value: \"blocks\" },\n\t\t\t{ name: \"GitHub Actions CI (doctor + audits + lint/build)\", value: \"ci\" },\n\t\t\t{ name: \"UE config + standard blocks\", value: \"both\" },\n\t\t],\n\t});\n\tif (what === \"ue\" || what === \"both\") await scaffoldUe();\n\tif (what === \"blocks\" || what === \"both\") {\n\t\tconst picked = await checkbox({\n\t\t\tmessage: \"Which blocks?\",\n\t\t\tchoices: STANDARD_BLOCKS.map((b) => ({ name: b.title, value: b.id, checked: true })),\n\t\t});\n\t\tawait scaffoldBlocks(picked);\n\t}\n\tif (what === \"ci\") await scaffoldCi();\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { writeCiWorkflow } from \"../lib/scaffold/ci.js\";\nimport {\n\tAUTHORING_NAMES,\n\ttype Authoring,\n\tdaMountpoint,\n\tneedsFstab,\n\twriteFstab,\n\twritePaths,\n} from \"../lib/scaffold/fstab.js\";\nimport * as ui from \"../lib/ui.js\";\nimport { scaffoldUe } from \"./scaffold.js\";\n\nexport interface InitOptions {\n\tname?: string;\n\tauthoring?: Authoring;\n\tmountpoint?: string;\n\torg?: string;\n\tsite?: string;\n\t/** Scaffold the CI workflow. Defaults to true. */\n\tci?: boolean;\n\t/** Skip prompts; apply with provided flags/defaults. */\n\tyes?: boolean;\n}\n\nconst slug = (s: string): string =>\n\ts\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9-]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\nasync function setPackageName(root: string, name: string): Promise<boolean> {\n\tconst file = path.join(root, \"package.json\");\n\tif (!existsSync(file)) return false;\n\ttry {\n\t\tconst pkg = JSON.parse(await readFile(file, \"utf-8\"));\n\t\tpkg.name = name;\n\t\tawait writeFile(file, `${JSON.stringify(pkg, null, 2)}\\n`);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Swap the boilerplate's name token in a few human-facing files. */\nasync function replacePlaceholders(root: string, name: string): Promise<string[]> {\n\tconst touched: string[] = [];\n\tfor (const rel of [\"README.md\", \"index.html\", \"head.html\"]) {\n\t\tconst file = path.join(root, rel);\n\t\tif (!existsSync(file)) continue;\n\t\ttry {\n\t\t\tconst before = await readFile(file, \"utf-8\");\n\t\t\tconst after = before.replace(/aem-boilerplate/gi, name);\n\t\t\tif (after !== before) {\n\t\t\t\tawait writeFile(file, after);\n\t\t\t\ttouched.push(rel);\n\t\t\t}\n\t\t} catch {\n\t\t\t// ignore unreadable files\n\t\t}\n\t}\n\treturn touched;\n}\n\n/** Interactive checklist of the steps only the developer can do (outside the repo). */\nasync function externalSteps(authoring: Authoring): Promise<void> {\n\tconst { confirm } = await import(\"@inquirer/prompts\");\n\tconst steps: { title: string; url?: string; note: string }[] = [\n\t\t{\n\t\t\ttitle: \"Install the AEM Code Sync GitHub app\",\n\t\t\turl: \"https://github.com/apps/aem-code-sync/installations/new\",\n\t\t\tnote: \"Connects your repo to the Edge Delivery pipeline (preview/publish).\",\n\t\t},\n\t];\n\tif (authoring === \"gdrive\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Share your content folder\",\n\t\t\tnote: \"Share the Google Drive folder with the AEM service and set it as the mountpoint.\",\n\t\t});\n\t}\n\tif (authoring === \"sharepoint\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Share your content folder\",\n\t\t\tnote: \"Grant the SharePoint/OneDrive folder to the AEM service account.\",\n\t\t});\n\t}\n\tif (authoring === \"da\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Author in DA\",\n\t\t\turl: \"https://da.live\",\n\t\t\tnote: \"Create documents at da.live.\",\n\t\t});\n\t}\n\tif (authoring === \"ue\") {\n\t\tsteps.push({\n\t\t\ttitle: \"Open the Universal Editor\",\n\t\t\turl: \"https://experience.adobe.com\",\n\t\t\tnote: \"Author in-context once the repo is connected to AEM.\",\n\t\t});\n\t}\n\tsteps.push({\n\t\ttitle: \"Install the AEM Sidekick extension\",\n\t\turl: \"https://chromewebstore.google.com/detail/aem-sidekick/igkmdomcgoebiipaifhmpfjhbjccggml\",\n\t\tnote: \"Preview and publish from the browser.\",\n\t});\n\tsteps.push({\n\t\ttitle: \"Run the local dev server\",\n\t\tnote: \"npm install, then `aem up` (from @adobe/aem-cli).\",\n\t});\n\n\tlogger.info(ui.heading(\"Next steps (outside the repo)\"));\n\tfor (let i = 0; i < steps.length; i++) {\n\t\tconst s = steps[i];\n\t\tlogger.info(` ${ui.brand.accent(String(i + 1))} ${chalk.bold(s.title)}`);\n\t\tif (s.url) logger.info(` ${chalk.cyan(s.url)}`);\n\t\tlogger.info(` ${chalk.dim(s.note)}`);\n\t\tawait confirm({ message: \" Done / skip?\", default: true });\n\t}\n}\n\n/**\n * `eds init` - adapt a freshly cloned EDS boilerplate to a chosen authoring\n * model (Universal Editor / DA / Google Drive / SharePoint). Interactive\n * wizard when flags are omitted. Writes fstab only when the model needs it.\n */\nexport async function initProject(options: InitOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\n\t\t\t\"Not inside an EDS project (no EDS project markers found). Clone an EDS boilerplate first, then run this from its root.\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tawait logger.logoOnceAnimated(\"Project setup\");\n\n\tconst { input, select, confirm } = await import(\"@inquirer/prompts\");\n\tconst interactive = !options.yes;\n\n\t// 1/4 - project name (default from package.json or the folder).\n\tlet defaultName = path.basename(projectRoot);\n\tconst pkgFile = path.join(projectRoot, \"package.json\");\n\tif (existsSync(pkgFile)) {\n\t\ttry {\n\t\t\tdefaultName = JSON.parse(await readFile(pkgFile, \"utf-8\")).name || defaultName;\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\tconst name =\n\t\t(options.name && slug(options.name)) ||\n\t\tslug(\n\t\t\tawait input({\n\t\t\t\tmessage: \"1/4 Project name\",\n\t\t\t\tdefault: slug(defaultName),\n\t\t\t\tvalidate: (v) => !!slug(v) || \"Use letters, numbers and dashes\",\n\t\t\t}),\n\t\t);\n\n\t// 2/4 - authoring model.\n\tconst authoring =\n\t\toptions.authoring ??\n\t\t((await select({\n\t\t\tmessage: \"2/4 Authoring model\",\n\t\t\tchoices: [\n\t\t\t\t{ name: AUTHORING_NAMES.ue, value: \"ue\" },\n\t\t\t\t{ name: AUTHORING_NAMES.da, value: \"da\" },\n\t\t\t\t{ name: AUTHORING_NAMES.gdrive, value: \"gdrive\" },\n\t\t\t\t{ name: AUTHORING_NAMES.sharepoint, value: \"sharepoint\" },\n\t\t\t],\n\t\t})) as Authoring);\n\n\t// 3/4 - content mountpoint, only when the model needs an fstab. Build it from\n\t// flags when given (so --yes works), otherwise prompt.\n\tlet mountpoint = options.mountpoint;\n\tif (needsFstab(authoring) && !mountpoint) {\n\t\tif (authoring === \"da\" && (options.org || interactive)) {\n\t\t\tconst org =\n\t\t\t\toptions.org ??\n\t\t\t\t(await input({ message: \" DA org\", validate: (v) => !!v.trim() || \"Required\" }));\n\t\t\tconst site =\n\t\t\t\toptions.site ??\n\t\t\t\t(interactive ? await input({ message: \" DA site\", default: name }) : name);\n\t\t\tmountpoint = daMountpoint(org.trim(), slug(site));\n\t\t} else if (authoring !== \"da\" && interactive) {\n\t\t\tconst label = authoring === \"gdrive\" ? \"Google Drive folder URL\" : \"SharePoint folder URL\";\n\t\t\tmountpoint = (\n\t\t\t\tawait input({\n\t\t\t\t\tmessage: ` ${label}`,\n\t\t\t\t\tvalidate: (v) => /^https?:\\/\\//.test(v.trim()) || \"Paste the folder URL\",\n\t\t\t\t})\n\t\t\t).trim();\n\t\t}\n\t}\n\n\t// 4/4 - CI gatekeeper.\n\tconst withCi =\n\t\toptions.ci ??\n\t\t(interactive\n\t\t\t? await confirm({ message: \"4/4 Add GitHub Actions CI (audits gatekeeper)?\", default: true })\n\t\t\t: true);\n\n\t// Summary + confirm.\n\tlogger.info(ui.heading(\"Summary\"));\n\tconst w = ui.columnWidth([\"name\", \"authoring\", \"mountpoint\", \"ci\"]);\n\tlogger.info(ui.accentLine(\"name\", name, w));\n\tlogger.info(ui.accentLine(\"authoring\", AUTHORING_NAMES[authoring], w));\n\tif (mountpoint) logger.info(ui.accentLine(\"mountpoint\", mountpoint, w));\n\telse if (needsFstab(authoring))\n\t\tlogger.info(ui.accentLine(\"mountpoint\", \"(skipped - set it in fstab.yaml later)\", w));\n\tlogger.info(ui.accentLine(\"ci\", withCi ? \"yes\" : \"no\", w));\n\tlogger.info(\"\");\n\tif (interactive) {\n\t\tconst go = await confirm({ message: \"Apply this setup?\", default: true });\n\t\tif (!go) {\n\t\t\tlogger.info(\"Cancelled.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Apply.\n\tconst done: string[] = [];\n\tif (await setPackageName(projectRoot, name)) done.push(\"package.json (name)\");\n\tfor (const t of await replacePlaceholders(projectRoot, name)) done.push(`${t} (renamed)`);\n\tif (needsFstab(authoring) && mountpoint) done.push(await writeFstab(projectRoot, mountpoint));\n\tif (authoring === \"ue\") {\n\t\tawait scaffoldUe();\n\t\tdone.push(await writePaths(projectRoot, name));\n\t}\n\tif (withCi) {\n\t\tconst ci = await writeCiWorkflow(projectRoot);\n\t\tdone.push(ci.created ? ci.path : `${ci.path} (exists, skipped)`);\n\t}\n\n\tlogger.info(ui.heading(\"Configured\"));\n\tconst dw = ui.columnWidth(done.map((d) => d.split(\" \")[0]));\n\tfor (const d of done) {\n\t\tconst [n, ...rest] = d.split(\" \");\n\t\tlogger.info(ui.accentLine(n, rest.join(\" \").replace(/^\\((.*)\\)$/, \"$1\"), dw));\n\t}\n\tlogger.info(\"\");\n\n\tif (interactive) await externalSteps(authoring);\n\n\tlogger.info(ui.box([`\"${name}\" set up for ${AUTHORING_NAMES[authoring]}`]));\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/**\n * Pull a classic component's **CSS** off disk from its clientlib. This is the\n * authored source (may include LESS), so it's a starting point - the most\n * faithful CSS actually comes from the rendered page (a later phase). We find\n * the clientlib folder, honour `css.txt` ordering when present, concatenate the\n * `.css` files, and flag any `.less` that would need a build.\n */\n\nexport interface ClientlibCss {\n\t/** Concatenated CSS from the clientlib. */\n\tcss: string;\n\t/** Files that contributed, relative to the search root. */\n\tfiles: string[];\n\t/** LESS/SCSS sources found (need compilation - not concatenated). */\n\tpreprocessed: string[];\n}\n\nasync function listFiles(dir: string): Promise<string[]> {\n\tconst out: string[] = [];\n\tconst walk = async (d: string) => {\n\t\tfor (const e of await readdir(d, { withFileTypes: true })) {\n\t\t\tconst p = path.join(d, e.name);\n\t\t\tif (e.isDirectory()) await walk(p);\n\t\t\telse out.push(p);\n\t\t}\n\t};\n\tif (existsSync(dir)) await walk(dir);\n\treturn out;\n}\n\n/** Find a clientlib folder in or under a component directory. */\nexport async function findClientlibDir(componentDir: string): Promise<string | null> {\n\tif (!existsSync(componentDir)) return null;\n\tconst entries = await readdir(componentDir, { withFileTypes: true });\n\tconst match = entries.find((e) => e.isDirectory() && /clientlib/i.test(e.name));\n\tif (match) return path.join(componentDir, match.name);\n\t// Some projects keep the CSS directly in the component folder.\n\tconst hasCss = entries.some((e) => e.isFile() && e.name.endsWith(\".css\"));\n\treturn hasCss ? componentDir : null;\n}\n\n/**\n * Read and concatenate CSS from a clientlib directory. Honours `css.txt`\n * (base/#base + listed files) when present; otherwise takes every `.css`.\n */\nexport async function readClientlibCss(clientlibDir: string): Promise<ClientlibCss> {\n\tconst all = await listFiles(clientlibDir);\n\tconst preprocessed = all\n\t\t.filter((f) => /\\.(less|scss|sass)$/i.test(f))\n\t\t.map((f) => path.relative(clientlibDir, f));\n\n\tlet cssFiles: string[];\n\tconst cssTxt = path.join(clientlibDir, \"css.txt\");\n\tif (existsSync(cssTxt)) {\n\t\t// `css.txt` lists files in order; `#base=<dir>` sets the folder they\n\t\t// resolve against. Other `#...` lines are comments/directives.\n\t\tconst lines = (await readFile(cssTxt, \"utf-8\")).split(\"\\n\").map((l) => l.trim());\n\t\tlet base = clientlibDir;\n\t\tconst listed: string[] = [];\n\t\tfor (const l of lines) {\n\t\t\tif (!l) continue;\n\t\t\tconst baseMatch = l.match(/^#base\\s*=\\s*(.+)$/);\n\t\t\tif (baseMatch) base = path.join(clientlibDir, baseMatch[1].trim());\n\t\t\telse if (!l.startsWith(\"#\")) listed.push(l);\n\t\t}\n\t\tcssFiles = listed\n\t\t\t.map((rel) => path.join(base, rel))\n\t\t\t.filter((f) => existsSync(f) && f.endsWith(\".css\"));\n\t} else {\n\t\tcssFiles = all.filter((f) => f.endsWith(\".css\"));\n\t}\n\n\tconst parts: string[] = [];\n\tfor (const f of cssFiles) parts.push(await readFile(f, \"utf-8\"));\n\treturn {\n\t\tcss: parts.join(\"\\n\\n\"),\n\t\tfiles: cssFiles.map((f) => path.relative(clientlibDir, f)),\n\t\tpreprocessed,\n\t};\n}\n","import { XMLParser } from \"fast-xml-parser\";\n\n/**\n * Parse a classic-AEM Touch UI dialog (`_cq_dialog/.content.xml`, a FileVault\n * docview) and map its Granite/Coral fields onto Universal Editor fields - the\n * same 17-type catalog `eds scaffold ue` emits. Deterministic, no agent: the\n * set of Granite `sling:resourceType`s is finite, so the mapping is a table.\n */\n\nexport type UEComponent =\n\t| \"text\"\n\t| \"textarea\"\n\t| \"richtext\"\n\t| \"number\"\n\t| \"boolean\"\n\t| \"date-time\"\n\t| \"select\"\n\t| \"radio-group\"\n\t| \"multiselect\"\n\t| \"checkbox-group\"\n\t| \"reference\"\n\t| \"aem-content\"\n\t| \"aem-content-fragment\"\n\t| \"aem-experience-fragment\"\n\t| \"aem-tag\"\n\t| \"container\"\n\t| \"tab\";\n\nexport interface UEField {\n\tcomponent: UEComponent;\n\tname: string;\n\tlabel?: string;\n\tvalueType?: string;\n\tvalue?: unknown;\n\toptions?: { name: string; value: string }[];\n\tmulti?: boolean;\n\tcollapsible?: boolean;\n\tfields?: UEField[];\n}\n\nexport interface ParsedDialog {\n\tfields: UEField[];\n\t/** Granite resourceTypes we didn't recognise (skipped), for reporting. */\n\tunmapped: string[];\n}\n\n// ── preserveOrder node helpers ─────────────────────────────────\n\ntype PNode = Record<string, unknown>;\n\nfunction tagOf(n: PNode): string {\n\treturn Object.keys(n).find((k) => k !== \":@\") ?? \"\";\n}\nfunction childrenOf(n: PNode): PNode[] {\n\tconst t = tagOf(n);\n\tconst v = n[t];\n\treturn Array.isArray(v) ? (v as PNode[]) : [];\n}\nfunction attrsOf(n: PNode): Record<string, string> {\n\treturn (n[\":@\"] as Record<string, string>) ?? {};\n}\n/** FileVault values are prefixed with their type, e.g. `{Boolean}true`. */\nfunction stripType(v: string | undefined): string | undefined {\n\treturn typeof v === \"string\" ? v.replace(/^\\{[^}]+\\}/, \"\") : v;\n}\nfunction attr(n: PNode, name: string): string | undefined {\n\treturn stripType(attrsOf(n)[`@_${name}`]);\n}\n\n// ── resourceType → UE field mapping ────────────────────────────\n\nfunction leafComponent(rt: string, n: PNode): UEComponent | null {\n\tconst multiple = attr(n, \"multiple\") === \"true\" || attr(n, \"multiple\") === \"{Boolean}true\";\n\tif (rt.endsWith(\"/form/textfield\")) return \"text\";\n\tif (rt.endsWith(\"/form/textarea\")) return \"textarea\";\n\tif (rt.includes(\"/richtext\")) return \"richtext\";\n\tif (rt.endsWith(\"/form/numberfield\")) return \"number\";\n\tif (rt.endsWith(\"/form/checkbox\")) return \"boolean\";\n\tif (rt.endsWith(\"/form/radiogroup\")) return \"radio-group\";\n\tif (rt.endsWith(\"/form/select\")) return multiple ? \"multiselect\" : \"select\";\n\tif (rt.endsWith(\"/form/datepicker\")) return \"date-time\";\n\tif (rt.endsWith(\"/form/pathfield\") || rt.endsWith(\"/form/pathbrowser\")) return \"aem-content\";\n\tif (rt.includes(\"/fileupload\") || rt.endsWith(\"/form/fileupload\")) return \"reference\";\n\tif (rt.includes(\"tagfield\") || rt.includes(\"tagpicker\") || rt.includes(\"tagbrowser\"))\n\t\treturn \"aem-tag\";\n\tif (rt.includes(\"contentfragment\")) return \"aem-content-fragment\";\n\tif (rt.includes(\"experiencefragment\")) return \"aem-experience-fragment\";\n\treturn null;\n}\n\n/** Granite layout containers that only hold other fields - never a UE field. */\nfunction isWrapper(rt: string): boolean {\n\treturn (\n\t\trt.includes(\"/foundation/container\") ||\n\t\trt.includes(\"/foundation/fixedcolumns\") ||\n\t\trt.includes(\"/foundation/well\") ||\n\t\trt.includes(\"/foundation/tabs\") ||\n\t\trt.includes(\"/foundation/form/fieldset\") ||\n\t\trt.includes(\"/foundation/accordion\")\n\t);\n}\n\nfunction valueTypeFor(c: UEComponent): string | undefined {\n\tswitch (c) {\n\t\tcase \"number\":\n\t\t\treturn \"number\";\n\t\tcase \"boolean\":\n\t\t\treturn \"boolean\";\n\t\tcase \"date-time\":\n\t\t\treturn \"date\";\n\t\tcase \"checkbox-group\":\n\t\t\treturn \"string[]\";\n\t\tcase \"aem-content\":\n\t\tcase \"aem-content-fragment\":\n\t\tcase \"aem-experience-fragment\":\n\t\t\treturn undefined;\n\t\tdefault:\n\t\t\treturn \"string\";\n\t}\n}\n\nfunction cleanName(raw: string | undefined, fallback: string): string {\n\tconst n = (raw ?? \"\").replace(/^\\.\\//, \"\").trim();\n\treturn n || fallback;\n}\n\n/** Collect `{ name, value }` options from a field's `items` children. */\nfunction readOptions(fieldNode: PNode): { name: string; value: string }[] {\n\tconst items = childrenOf(fieldNode).find((c) => tagOf(c) === \"items\");\n\tif (!items) return [];\n\treturn childrenOf(items).map((opt) => {\n\t\tconst value = attr(opt, \"value\") ?? \"\";\n\t\tconst name = attr(opt, \"text\") ?? attr(opt, \"jcr:title\") ?? value;\n\t\treturn { name, value };\n\t});\n}\n\n// ── recursive walk ─────────────────────────────────────────────\n\nfunction walk(nodes: PNode[], out: UEField[], unmapped: Set<string>, counter: { i: number }): void {\n\tfor (const node of nodes) {\n\t\tconst rt = attr(node, \"sling:resourceType\") ?? \"\";\n\n\t\t// Tabs: emit a `tab` marker per child tab, then recurse into each tab.\n\t\tif (rt.endsWith(\"/foundation/tabs\")) {\n\t\t\tconst items = childrenOf(node).find((c) => tagOf(c) === \"items\");\n\t\t\tfor (const tab of items ? childrenOf(items) : []) {\n\t\t\t\tconst label = attr(tab, \"jcr:title\");\n\t\t\t\tout.push({ component: \"tab\", name: cleanName(undefined, tagOf(tab)), label });\n\t\t\t\twalk(childrenOf(tab), out, unmapped, counter);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Multifield: a repeatable container. Collect its template sub-fields.\n\t\tif (rt.endsWith(\"/form/multifield\")) {\n\t\t\tconst sub: UEField[] = [];\n\t\t\twalk(childrenOf(node), sub, unmapped, counter);\n\t\t\tconst name = cleanName(attr(node, \"name\"), `items${counter.i++}`);\n\t\t\tout.push({\n\t\t\t\tcomponent: \"container\",\n\t\t\t\tname,\n\t\t\t\tlabel: attr(node, \"fieldLabel\") ?? \"Items\",\n\t\t\t\tmulti: true,\n\t\t\t\tcollapsible: true,\n\t\t\t\tfields: sub,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst comp = rt ? leafComponent(rt, node) : null;\n\t\tif (comp) {\n\t\t\tconst name = cleanName(attr(node, \"name\"), `field${counter.i++}`);\n\t\t\tconst field: UEField = { component: comp, name };\n\t\t\tconst vt = valueTypeFor(comp);\n\t\t\tif (vt) field.valueType = vt;\n\t\t\tconst label = attr(node, \"fieldLabel\") ?? attr(node, \"text\");\n\t\t\tif (label) field.label = label;\n\t\t\tif (comp === \"select\" || comp === \"radio-group\" || comp === \"multiselect\") {\n\t\t\t\tconst options = readOptions(node);\n\t\t\t\tif (options.length) field.options = options;\n\t\t\t}\n\t\t\tconst def = attr(node, \"value\") ?? (comp === \"boolean\" ? attr(node, \"checked\") : undefined);\n\t\t\tif (def !== undefined && def !== \"\") field.value = comp === \"boolean\" ? def === \"true\" : def;\n\t\t\tout.push(field);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Unknown field (has a resourceType + a name but no mapping) - record it,\n\t\t// unless it's a layout wrapper (container/columns/well/fieldset).\n\t\tif (rt && attr(node, \"name\") && !isWrapper(rt)) unmapped.add(rt);\n\n\t\t// Layout wrapper (container / fixedcolumns / column / items / well): recurse.\n\t\twalk(childrenOf(node), out, unmapped, counter);\n\t}\n}\n\n/** Parse a Touch UI dialog XML into Universal Editor fields. */\nexport function parseDialog(xml: string): ParsedDialog {\n\tconst parser = new XMLParser({\n\t\tignoreAttributes: false,\n\t\tattributeNamePrefix: \"@_\",\n\t\tpreserveOrder: true,\n\t\tremoveNSPrefix: false,\n\t\ttrimValues: true,\n\t});\n\tconst tree = parser.parse(xml) as PNode[];\n\tconst root = tree.find((n) => tagOf(n) === \"jcr:root\");\n\tconst fields: UEField[] = [];\n\tconst unmapped = new Set<string>();\n\tif (root) walk(childrenOf(root), fields, unmapped, { i: 1 });\n\treturn { fields, unmapped: [...unmapped] };\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { type ParsedDialog, type UEField, parseDialog } from \"./dialog.js\";\n\n/** Locate the Touch UI dialog inside a classic component folder. */\nexport function findDialogFile(componentDir: string): string | null {\n\tconst candidates = [\n\t\tpath.join(componentDir, \"_cq_dialog\", \".content.xml\"),\n\t\tpath.join(componentDir, \"_cq_dialog.xml\"),\n\t\tpath.join(componentDir, \"cq:dialog\", \".content.xml\"),\n\t];\n\treturn candidates.find((c) => existsSync(c)) ?? null;\n}\n\n/** Read the component's `jcr:title` from its `.content.xml`, if present. */\nexport async function readComponentTitle(componentDir: string): Promise<string | undefined> {\n\tconst file = path.join(componentDir, \".content.xml\");\n\tif (!existsSync(file)) return undefined;\n\ttry {\n\t\tconst parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: \"@_\" });\n\t\tconst parsed = parser.parse(await readFile(file, \"utf-8\"));\n\t\tconst root = parsed[\"jcr:root\"] ?? {};\n\t\tconst title = root[\"@_jcr:title\"];\n\t\treturn typeof title === \"string\" ? title.replace(/^\\{[^}]+\\}/, \"\") : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** Read and map a component's dialog fields. Returns null if no dialog found. */\nexport async function readDialogFields(componentDir: string): Promise<ParsedDialog | null> {\n\tconst dialog = findDialogFile(componentDir);\n\tif (!dialog) return null;\n\treturn parseDialog(await readFile(dialog, \"utf-8\"));\n}\n\n/** The `_<name>.json` Universal Editor model for a migrated block. */\nexport function migratedModelFile(blockName: string, title: string, fields: UEField[]): string {\n\tconst model = {\n\t\tdefinitions: [\n\t\t\t{\n\t\t\t\ttitle,\n\t\t\t\tid: blockName,\n\t\t\t\tplugins: {\n\t\t\t\t\txwalk: {\n\t\t\t\t\t\tpage: {\n\t\t\t\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\t\t\t\ttemplate: { name: title, model: blockName },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmodels: [{ id: blockName, fields }],\n\t\tfilters: [],\n\t};\n\treturn `${JSON.stringify(model, null, 2)}\\n`;\n}\n\n/** A starter `decorate()` for a migrated block. Iterates rows; if the dialog had\n * a multifield, it iterates the repeated children. HTL logic is left as a TODO. */\nexport function migratedBlockJs(blockName: string, fields: UEField[]): string {\n\tconst hasContainer = fields.some((f) => f.component === \"container\" && f.multi);\n\tconst body = hasContainer\n\t\t? ` // This block was migrated from a classic AEM component with a multifield.\n // Each child row is one repeated item - enhance them here.\n [...block.children].forEach((row) => {\n row.classList.add('${blockName}-item');\n });`\n\t\t: ` // Migrated from a classic AEM component. The authored fields arrive as\n // rows; read and enhance them here (port the old HTL logic as needed).`;\n\treturn `// Block: ${blockName}\n// Migrated from a classic AEM component by \\`eds migrate component\\`.\n// TODO: port the component's HTL/JS behaviour into this decorator.\nexport default function decorate(block) {\n block.classList.add('${blockName}');\n${body}\n}\n`;\n}\n\n/** An empty, scoped CSS file for a migrated block (fill from the clientlib / rendered CSS). */\nexport function migratedBlockCss(blockName: string): string {\n\treturn `/* Block: ${blockName} */\n/* Migrated from a classic AEM component. Bring the component's styles here */\n/* (from its clientlib or the rendered page) and keep them scoped to the block. */\n.${blockName} {\n}\n`;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { logger } from \"../lib/logger.js\";\nimport { findClientlibDir, readClientlibCss } from \"../lib/migrate/clientlib.js\";\nimport {\n\tfindDialogFile,\n\tmigratedBlockCss,\n\tmigratedBlockJs,\n\tmigratedModelFile,\n\treadComponentTitle,\n\treadDialogFields,\n} from \"../lib/migrate/component.js\";\nimport type { UEField } from \"../lib/migrate/dialog.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\nexport interface MigrateOptions {\n\tname?: string;\n\tyes?: boolean;\n\t/** Path to the component's clientlib (otherwise auto-detected). */\n\tclientlib?: string;\n}\n\n/** Build the block CSS from clientlib sources, with a header telling the dev to scope it. */\nfunction clientlibBlockCss(blockName: string, css: string, files: string[]): string {\n\treturn `/* Block: ${blockName} */\n/* Migrated from the component clientlib: ${files.join(\", \")}. */\n/* TODO: review selectors and scope them under .${blockName} (and port any LESS/SCSS). */\n\n${css.trim()}\n`;\n}\n\nconst slug = (s: string): string =>\n\ts\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9-]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\");\n\n/** Flatten the field tree into aligned preview lines (tabs/containers indented). */\nfunction previewFields(fields: UEField[], depth = 0): string[] {\n\tconst lines: string[] = [];\n\tfor (const f of fields) {\n\t\tconst indent = \" \".repeat(depth);\n\t\tif (f.component === \"tab\") {\n\t\t\tlines.push(`${indent}${ui.brand.blue(\"▸\")} ${f.label ?? f.name}`);\n\t\t} else {\n\t\t\tconst opts = f.options?.length ? ` (${f.options.length} options)` : \"\";\n\t\t\tconst multi = f.multi ? \" ·multi\" : \"\";\n\t\t\tconst label = f.label ? `- ${f.label}` : \"\";\n\t\t\tlines.push(`${indent}${ui.brand.accent(f.component)}${multi} ${f.name}${opts} ${label}`);\n\t\t\tif (f.fields?.length) lines.push(...previewFields(f.fields, depth + 1));\n\t\t}\n\t}\n\treturn lines;\n}\n\nfunction countLeaves(fields: UEField[]): number {\n\tlet n = 0;\n\tfor (const f of fields) {\n\t\tif (f.component === \"tab\") continue;\n\t\tn += 1;\n\t\tif (f.fields) n += countLeaves(f.fields);\n\t}\n\treturn n;\n}\n\n/**\n * `eds migrate component <dir>` - migrate a classic AEM component's Touch UI\n * dialog into an EDS block skeleton + Universal Editor model. Phase 1:\n * deterministic (dialog → fields), no network, no agent. CSS/HTML come later.\n */\nexport async function migrateComponent(\n\tdirArg: string | undefined,\n\toptions: MigrateOptions = {},\n): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tawait logger.logoOnceAnimated(\"Migrate component\");\n\n\tconst { input, confirm } = await import(\"@inquirer/prompts\");\n\tconst interactive = !options.yes;\n\n\tlet componentDir = dirArg;\n\tif (!componentDir && interactive) {\n\t\tcomponentDir = await input({\n\t\t\tmessage: \"Path to the classic component folder\",\n\t\t\tvalidate: (v) => existsSync(v.trim()) || \"Folder not found\",\n\t\t});\n\t}\n\tif (!componentDir) {\n\t\tlogger.error(\"Provide the path to the classic component folder.\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tcomponentDir = path.resolve(componentDir.trim());\n\n\tif (!findDialogFile(componentDir)) {\n\t\tlogger.error(`No Touch UI dialog (_cq_dialog/.content.xml) found in ${componentDir}.`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst parsed = await readDialogFields(componentDir);\n\tif (!parsed || parsed.fields.length === 0) {\n\t\tlogger.warn(\"Dialog found but no mappable fields were detected.\");\n\t\tif (parsed?.unmapped.length)\n\t\t\tlogger.info(`Unmapped resourceTypes: ${parsed.unmapped.join(\", \")}`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst title = (await readComponentTitle(componentDir)) ?? path.basename(componentDir);\n\tconst blockName =\n\t\t(options.name && slug(options.name)) ||\n\t\t(interactive\n\t\t\t? slug(await input({ message: \"Block name\", default: slug(title) }))\n\t\t\t: slug(title));\n\n\t// Preview.\n\tlogger.info(ui.heading(\"Mapped fields\", `${countLeaves(parsed.fields)} from dialog`));\n\tfor (const line of previewFields(parsed.fields)) logger.info(` ${line}`);\n\tif (parsed.unmapped.length) {\n\t\tlogger.info(\"\");\n\t\tlogger.warn(`Skipped (unrecognised): ${parsed.unmapped.join(\", \")}`);\n\t}\n\tlogger.info(\"\");\n\n\tif (interactive) {\n\t\tconst go = await confirm({ message: `Generate block \"${blockName}\"?`, default: true });\n\t\tif (!go) {\n\t\t\tlogger.info(\"Cancelled.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst blockDir = path.join(projectRoot, \"blocks\", blockName);\n\tif (existsSync(blockDir)) {\n\t\tlogger.error(\n\t\t\t`Block \"${blockName}\" already exists at blocks/${blockName}. Use --name to pick another.`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\t// CSS: pull it off the component's clientlib if we can find one, else an\n\t// empty scoped stub.\n\tconst clibDir = options.clientlib\n\t\t? path.resolve(options.clientlib.trim())\n\t\t: await findClientlibDir(componentDir);\n\tlet cssContent = migratedBlockCss(blockName);\n\tlet cssMessage = \"empty - add styles from clientlib / rendered CSS\";\n\tlet preprocessedNote: string[] = [];\n\tif (clibDir && existsSync(clibDir)) {\n\t\tconst lib = await readClientlibCss(clibDir);\n\t\tif (lib.css.trim()) {\n\t\t\tcssContent = clientlibBlockCss(blockName, lib.css, lib.files);\n\t\t\tcssMessage = `from clientlib (${lib.files.length} file(s)) - review & scope`;\n\t\t}\n\t\tpreprocessedNote = lib.preprocessed;\n\t}\n\n\tawait mkdir(blockDir, { recursive: true });\n\tawait writeFile(\n\t\tpath.join(blockDir, `${blockName}.js`),\n\t\tmigratedBlockJs(blockName, parsed.fields),\n\t);\n\tawait writeFile(path.join(blockDir, `${blockName}.css`), cssContent);\n\tawait writeFile(\n\t\tpath.join(blockDir, `_${blockName}.json`),\n\t\tmigratedModelFile(blockName, title, parsed.fields),\n\t);\n\n\tlogger.info(ui.heading(\"Created\"));\n\tconst files = [`${blockName}.js`, `${blockName}.css`, `_${blockName}.json`];\n\tconst w = ui.columnWidth(files);\n\tlogger.info(ui.accentLine(`${blockName}.js`, \"decorator stub (port HTL logic)\", w));\n\tlogger.info(ui.accentLine(`${blockName}.css`, cssMessage, w));\n\tlogger.info(ui.accentLine(`_${blockName}.json`, \"Universal Editor model\", w));\n\tif (preprocessedNote.length) {\n\t\tlogger.info(\"\");\n\t\tlogger.warn(`LESS/SCSS found (needs a build, not copied): ${preprocessedNote.join(\", \")}`);\n\t}\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tui.box([`\"${blockName}\" migrated. Next: add CSS, then \\`eds block preview ${blockName}\\``]),\n\t);\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../../lib/logger.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport { kebabCaseRegex } from \"../../lib/schemas.js\";\n\ninterface CreateBlockOptions {\n\t/** Generate the Universal Editor model. Defaults to true. */\n\tueModel?: boolean;\n}\n\n/** `hero-banner` → `Hero Banner` */\nfunction titleCase(name: string): string {\n\treturn name\n\t\t.split(\"-\")\n\t\t.map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n\t\t.join(\" \");\n}\n\n/**\n * The Universal Editor block config (`_<name>.json`): the `definitions`,\n * `models` and `filters` that let an author drop and edit this block in UE.\n * A single rich-text field is a safe starting point authors can extend.\n */\nexport function ueModelFor(name: string): string {\n\tconst title = titleCase(name);\n\tconst model = {\n\t\tdefinitions: [\n\t\t\t{\n\t\t\t\ttitle,\n\t\t\t\tid: name,\n\t\t\t\tplugins: {\n\t\t\t\t\txwalk: {\n\t\t\t\t\t\tpage: {\n\t\t\t\t\t\t\tresourceType: \"core/franklin/components/block/v1/block\",\n\t\t\t\t\t\t\ttemplate: { name: title, model: name },\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: name,\n\t\t\t\t// Starter fields showcasing good patterns (title+titleType collapse\n\t\t\t\t// into a heading; richtext for body). Extend from the full catalog —\n\t\t\t\t// see docs/universal-editor-fields.md.\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponent: \"text\",\n\t\t\t\t\t\tname: \"title\",\n\t\t\t\t\t\tlabel: \"Title\",\n\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponent: \"select\",\n\t\t\t\t\t\tname: \"titleType\",\n\t\t\t\t\t\tlabel: \"Title Type\",\n\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t\tvalue: \"h2\",\n\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t{ name: \"H1\", value: \"h1\" },\n\t\t\t\t\t\t\t{ name: \"H2\", value: \"h2\" },\n\t\t\t\t\t\t\t{ name: \"H3\", value: \"h3\" },\n\t\t\t\t\t\t\t{ name: \"H4\", value: \"h4\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponent: \"richtext\",\n\t\t\t\t\t\tname: \"text\",\n\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\tlabel: \"Text\",\n\t\t\t\t\t\tvalueType: \"string\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\tfilters: [],\n\t};\n\treturn `${JSON.stringify(model, null, 2)}\\n`;\n}\n\nexport async function createBlock(name: string, options: CreateBlockOptions = {}): Promise<void> {\n\tif (!kebabCaseRegex.test(name)) {\n\t\tlogger.error(\n\t\t\t`Invalid block name \"${name}\". Use kebab-case (e.g., \"hero-banner\", \"card-list\").`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\n\t\t\t\"Not inside an EDS project (no EDS project markers found). Run this from your project root.\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst blocksDir = path.join(projectRoot, \"blocks\", name);\n\tif (existsSync(blocksDir)) {\n\t\tlogger.error(`Block \"${name}\" already exists at ${blocksDir}`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tawait mkdir(blocksDir, { recursive: true });\n\n\tconst jsContent = `export default function decorate(block) {\n // TODO: implement ${name} block\n}\n`;\n\n\tconst cssContent = `.${name} {\n /* TODO: style ${name} block */\n}\n`;\n\n\tawait writeFile(path.join(blocksDir, `${name}.js`), jsContent);\n\tawait writeFile(path.join(blocksDir, `${name}.css`), cssContent);\n\n\t// Universal Editor authoring is a first-class output — generated by default.\n\tconst withUe = options.ueModel !== false;\n\tif (withUe) {\n\t\tawait writeFile(path.join(blocksDir, `_${name}.json`), ueModelFor(name));\n\t}\n\n\tlogger.success(\n\t\t`Block \"${name}\" created at ${chalk.cyan(path.relative(projectRoot, blocksDir))}${\n\t\t\twithUe ? chalk.dim(\" (+ Universal Editor model)\") : \"\"\n\t\t}`,\n\t);\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentInfo, AgentType } from \"../../types/index.js\";\nimport { logger } from \"../logger.js\";\n\ninterface AgentDef {\n\ttype: AgentType;\n\tbinary: string;\n\tconfigDir: string;\n\tmcpConfigPaths: string[];\n}\n\nconst AGENT_DEFS: AgentDef[] = [\n\t{\n\t\ttype: \"claude\",\n\t\tbinary: \"claude\",\n\t\tconfigDir: path.join(homedir(), \".claude\"),\n\t\tmcpConfigPaths: [\n\t\t\tpath.join(homedir(), \".claude\", \"plugins.json\"),\n\t\t\tpath.join(homedir(), \".claude.json\"),\n\t\t],\n\t},\n\t{\n\t\ttype: \"cursor\",\n\t\tbinary: \"cursor\",\n\t\tconfigDir: path.join(homedir(), \".cursor\"),\n\t\tmcpConfigPaths: [path.join(homedir(), \".cursor\", \"mcp.json\")],\n\t},\n\t{\n\t\ttype: \"codex\",\n\t\tbinary: \"codex\",\n\t\tconfigDir: path.join(homedir(), \".codex\"),\n\t\tmcpConfigPaths: [],\n\t},\n];\n\nasync function whichBinary(name: string): Promise<string | undefined> {\n\tconst { execaCommand } = await import(\"execa\");\n\ttry {\n\t\tconst result = await execaCommand(`which ${name}`);\n\t\treturn result.stdout.trim() || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Walk a config object looking for `mcpServers` maps (at any depth — Claude\n * stores them both at the root and per-project) and return the first server\n * key that mentions Figma. That key is the exact name we must grant tools for.\n */\nfunction findFigmaServerKey(node: unknown): string | undefined {\n\tif (!node || typeof node !== \"object\") return undefined;\n\tconst obj = node as Record<string, unknown>;\n\n\tconst servers = obj.mcpServers;\n\tif (servers && typeof servers === \"object\") {\n\t\tfor (const key of Object.keys(servers as Record<string, unknown>)) {\n\t\t\tif (key.toLowerCase().includes(\"figma\")) return key;\n\t\t}\n\t}\n\n\tfor (const value of Object.values(obj)) {\n\t\tconst found = findFigmaServerKey(value);\n\t\tif (found) return found;\n\t}\n\treturn undefined;\n}\n\n/**\n * Find the configured Figma MCP server name across an agent's config files.\n * Falls back to a loose text match (returns \"figma\" as a sentinel) so older\n * configs still report as \"configured\" even if we can't parse the exact key.\n */\nasync function findFigmaMcpServer(configPaths: string[]): Promise<string | undefined> {\n\tfor (const configPath of configPaths) {\n\t\ttry {\n\t\t\tif (!existsSync(configPath)) continue;\n\t\t\tconst content = await readFile(configPath, \"utf-8\");\n\t\t\ttry {\n\t\t\t\tconst key = findFigmaServerKey(JSON.parse(content));\n\t\t\t\tif (key) return key;\n\t\t\t} catch {\n\t\t\t\t// Not JSON (or malformed) — fall back to a text match below.\n\t\t\t}\n\t\t\tif (content.toLowerCase().includes(\"figma\")) return \"figma\";\n\t\t} catch {\n\t\t\t// Unreadable config — skip to the next path.\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport async function detectAgent(preferred?: AgentType): Promise<AgentInfo | undefined> {\n\t// If user specified a preferred agent, try that first\n\tif (preferred) {\n\t\tconst def = AGENT_DEFS.find((d) => d.type === preferred);\n\t\tif (def) {\n\t\t\tconst binPath = await whichBinary(def.binary);\n\t\t\tif (binPath) {\n\t\t\t\tconst figmaMcpServerName = await findFigmaMcpServer(def.mcpConfigPaths);\n\t\t\t\treturn {\n\t\t\t\t\ttype: def.type,\n\t\t\t\t\tpath: binPath,\n\t\t\t\t\tconfigDir: existsSync(def.configDir) ? def.configDir : undefined,\n\t\t\t\t\thasFigmaMcp: !!figmaMcpServerName,\n\t\t\t\t\tfigmaMcpServerName,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlogger.warn(`Preferred agent \"${preferred}\" not found in PATH`);\n\t\t}\n\t}\n\n\t// Auto-detect: try each agent in order\n\tfor (const def of AGENT_DEFS) {\n\t\tconst binPath = await whichBinary(def.binary);\n\t\tif (binPath) {\n\t\t\tconst figmaMcpServerName = await findFigmaMcpServer(def.mcpConfigPaths);\n\t\t\treturn {\n\t\t\t\ttype: def.type,\n\t\t\t\tpath: binPath,\n\t\t\t\tconfigDir: existsSync(def.configDir) ? def.configDir : undefined,\n\t\t\t\thasFigmaMcp: !!figmaMcpServerName,\n\t\t\t\tfigmaMcpServerName,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nexport async function detectAllAgents(): Promise<AgentInfo[]> {\n\tconst agents: AgentInfo[] = [];\n\tfor (const def of AGENT_DEFS) {\n\t\tconst binPath = await whichBinary(def.binary);\n\t\tif (binPath) {\n\t\t\tconst figmaMcpServerName = await findFigmaMcpServer(def.mcpConfigPaths);\n\t\t\tagents.push({\n\t\t\t\ttype: def.type,\n\t\t\t\tpath: binPath,\n\t\t\t\tconfigDir: existsSync(def.configDir) ? def.configDir : undefined,\n\t\t\t\thasFigmaMcp: !!figmaMcpServerName,\n\t\t\t\tfigmaMcpServerName,\n\t\t\t});\n\t\t}\n\t}\n\treturn agents;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline\";\nimport chalk from \"chalk\";\nimport type { ResultPromise } from \"execa\";\nimport type { AgentInfo } from \"../../types/index.js\";\nimport { logger } from \"../logger.js\";\nimport * as ui from \"../ui.js\";\n\n/**\n * Save a prompt to a temp file and return its path.\n */\nexport async function savePromptToFile(prompt: string, projectRoot?: string): Promise<string> {\n\t// Prefer a project-local `tmp/` (gitignored) over the system temp dir, so\n\t// generated prompts land somewhere visible next to the project.\n\tconst base = projectRoot ? path.join(projectRoot, \"tmp\") : tmpdir();\n\tconst dir = path.join(base, \"eds-cli\");\n\tawait mkdir(dir, { recursive: true });\n\tconst filename = `from-design-${Date.now()}.md`;\n\tconst filePath = path.join(dir, filename);\n\tawait writeFile(filePath, prompt, \"utf-8\");\n\treturn filePath;\n}\n\n/**\n * Invoke an AI agent with the given prompt file.\n * Returns true if the agent ran successfully.\n */\nexport async function invokeAgent(\n\tagent: AgentInfo,\n\tpromptFile: string,\n\tcwd: string,\n): Promise<boolean> {\n\tconst { execa } = await import(\"execa\");\n\tconst prompt = await readFile(promptFile, \"utf-8\");\n\n\ttry {\n\t\tswitch (agent.type) {\n\t\t\tcase \"claude\": {\n\t\t\t\tlogger.info(`Running Claude Code ${chalk.dim(\"- live log:\")}`);\n\t\t\t\t// Grant Figma MCP at the server level (`mcp__<server>` allows all of\n\t\t\t\t// its tools). We grant a *superset*, not just the detected server:\n\t\t\t\t// a user may have several Figma servers configured where the first\n\t\t\t\t// one found is stale/disconnected (e.g. a dead `figma-sse` alongside\n\t\t\t\t// a live plugin). Granting every known variant lets the agent fall\n\t\t\t\t// through to whichever one actually responds. Granting a server that\n\t\t\t\t// doesn't exist is harmless.\n\t\t\t\tconst figmaServers = [\n\t\t\t\t\t...(agent.figmaMcpServerName ? [agent.figmaMcpServerName] : []),\n\t\t\t\t\t\"figma-sse\",\n\t\t\t\t\t\"figma-desktop\",\n\t\t\t\t\t\"figma\",\n\t\t\t\t\t\"Figma\",\n\t\t\t\t\t\"plugin_figma_figma\", // Claude Code plugin: plugin:figma:figma\n\t\t\t\t];\n\t\t\t\tconst allowedTools = [\n\t\t\t\t\t...new Set(figmaServers.map((s) => `mcp__${s}`)),\n\t\t\t\t\t\"Edit\",\n\t\t\t\t\t\"Write\",\n\t\t\t\t\t\"Read\",\n\t\t\t\t].join(\",\");\n\t\t\t\t// Stream JSON events so we can render a live, colour-coded log of\n\t\t\t\t// what the agent is doing (tool calls, Figma MCP reads, file writes)\n\t\t\t\t// instead of a silent \"this may take a minute\".\n\t\t\t\tconst sub = execa(\n\t\t\t\t\t\"claude\",\n\t\t\t\t\t[\n\t\t\t\t\t\t\"-p\",\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\"--output-format\",\n\t\t\t\t\t\t\"stream-json\",\n\t\t\t\t\t\t\"--verbose\",\n\t\t\t\t\t\t\"--allowedTools\",\n\t\t\t\t\t\tallowedTools,\n\t\t\t\t\t],\n\t\t\t\t\t{ cwd, buffer: false, stdio: [\"ignore\", \"pipe\", \"inherit\"] },\n\t\t\t\t);\n\t\t\t\tawait renderClaudeStream(sub, cwd);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"cursor\": {\n\t\t\t\tlogger.info(\"Running Cursor agent...\");\n\t\t\t\tawait execa(\"cursor\", [\"--prompt\", prompt], {\n\t\t\t\t\tcwd,\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"codex\": {\n\t\t\t\tlogger.info(\"Running Codex...\");\n\t\t\t\tawait execa(\"codex\", [prompt], {\n\t\t\t\t\tcwd,\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t} catch (err) {\n\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\tlogger.error(`Agent ${agent.type} failed: ${msg}`);\n\t\treturn false;\n\t}\n}\n\n// ── Live stream renderer for Claude Code (`--output-format stream-json`) ──\n\ninterface ToolUseBlock {\n\ttype: \"tool_use\";\n\tid?: string;\n\tname: string;\n\tinput?: Record<string, unknown>;\n}\ninterface TextBlock {\n\ttype: \"text\";\n\ttext: string;\n}\ninterface ToolResultBlock {\n\ttype: \"tool_result\";\n\ttool_use_id?: string;\n\tis_error?: boolean;\n}\ntype ContentBlock = ToolUseBlock | TextBlock | ToolResultBlock | { type: string };\n\ninterface StreamEvent {\n\ttype?: string;\n\tmessage?: { content?: ContentBlock[] };\n\tduration_ms?: number;\n\ttotal_cost_usd?: number;\n}\n\nfunction shortName(name: string): string {\n\treturn name.includes(\"figma\") ? (name.split(\"__\").pop() ?? name) : name.toLowerCase();\n}\n\n/**\n * Read the agent's JSON event stream and render a live, animated log: an `ora`\n * spinner shows the current activity + elapsed time at the bottom while\n * colour-coded lines scroll above it. Each tool is timed from its `tool_use`\n * to its matching `tool_result` and printed with that per-phase duration.\n */\nasync function renderClaudeStream(sub: ResultPromise, cwd: string): Promise<void> {\n\tconst ora = (await import(\"ora\")).default;\n\tconst start = Date.now();\n\tconst elapsed = () => `${Math.round((Date.now() - start) / 1000)}s`;\n\tconst spinner = ora({ text: `thinking ${chalk.dim(elapsed())}`, color: \"yellow\" }).start();\n\tlet activity = \"thinking\";\n\tconst timer = setInterval(() => {\n\t\tspinner.text = `${activity} ${chalk.dim(elapsed())}`;\n\t}, 300);\n\n\t// Pending tool calls keyed by id, so we can print each with its own timing\n\t// once its result arrives.\n\tconst pending = new Map<string, { label: string; start: number }>();\n\tconst emit = (line: string) => {\n\t\tspinner.stop();\n\t\tlogger.info(` ${line}`);\n\t\tspinner.start();\n\t};\n\n\tlet result: string | undefined;\n\ttry {\n\t\tif (sub.stdout) {\n\t\t\tconst rl = readline.createInterface({ input: sub.stdout });\n\t\t\tfor await (const line of rl) {\n\t\t\t\tconst trimmed = line.trim();\n\t\t\t\tif (!trimmed) continue;\n\t\t\t\tlet evt: StreamEvent;\n\t\t\t\ttry {\n\t\t\t\t\tevt = JSON.parse(trimmed) as StreamEvent;\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst content = Array.isArray(evt.message?.content) ? evt.message.content : [];\n\n\t\t\t\tif (evt.type === \"assistant\") {\n\t\t\t\t\tfor (const block of content) {\n\t\t\t\t\t\tif (block.type === \"text\" && \"text\" in block) {\n\t\t\t\t\t\t\tconst first = block.text.trim().split(\"\\n\")[0].slice(0, 100);\n\t\t\t\t\t\t\tif (first) emit(chalk.dim(first));\n\t\t\t\t\t\t} else if (block.type === \"tool_use\" && \"name\" in block) {\n\t\t\t\t\t\t\tconst id = \"id\" in block && block.id ? block.id : `${Math.random()}`;\n\t\t\t\t\t\t\tpending.set(id, {\n\t\t\t\t\t\t\t\tlabel: toolLabel(block.name, block.input, cwd),\n\t\t\t\t\t\t\t\tstart: Date.now(),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tactivity = shortName(block.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (evt.type === \"user\") {\n\t\t\t\t\tfor (const block of content) {\n\t\t\t\t\t\tif (block.type === \"tool_result\" && \"tool_use_id\" in block && block.tool_use_id) {\n\t\t\t\t\t\t\tconst p = pending.get(block.tool_use_id);\n\t\t\t\t\t\t\tif (p) {\n\t\t\t\t\t\t\t\tconst dur = `${((Date.now() - p.start) / 1000).toFixed(1)}s`;\n\t\t\t\t\t\t\t\tconst failed =\n\t\t\t\t\t\t\t\t\t\"is_error\" in block && block.is_error ? ` ${chalk.red(\"failed\")}` : \"\";\n\t\t\t\t\t\t\t\temit(`${p.label} ${chalk.dim(dur)}${failed}`);\n\t\t\t\t\t\t\t\tpending.delete(block.tool_use_id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (evt.type === \"result\") {\n\t\t\t\t\tconst dur =\n\t\t\t\t\t\ttypeof evt.duration_ms === \"number\" ? `${(evt.duration_ms / 1000).toFixed(1)}s` : \"\";\n\t\t\t\t\tconst cost =\n\t\t\t\t\t\ttypeof evt.total_cost_usd === \"number\" ? `$${evt.total_cost_usd.toFixed(3)}` : \"\";\n\t\t\t\t\tresult = [dur, cost].filter(Boolean).join(\" · \") || \"done\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Flush any tool that never reported a result.\n\t\tfor (const p of pending.values()) emit(`${p.label} ${chalk.dim(\"…\")}`);\n\t\tclearInterval(timer);\n\t\tif (result) spinner.succeed(`${ui.brand.accent(\"agent finished\")} ${chalk.dim(result)}`);\n\t\telse spinner.stop();\n\t} catch (err) {\n\t\tclearInterval(timer);\n\t\tspinner.stop();\n\t\tthrow err;\n\t}\n\tawait sub; // propagate a non-zero exit as a throw\n}\n\nfunction toolLabel(name: string, input: Record<string, unknown> | undefined, cwd: string): string {\n\tconst rel = (key: string): string => {\n\t\tconst p = input?.[key];\n\t\tif (typeof p !== \"string\") return \"\";\n\t\treturn p.startsWith(cwd) ? path.relative(cwd, p) : path.basename(p);\n\t};\n\tif (name.includes(\"figma\")) {\n\t\tconst short = name.split(\"__\").pop() ?? name;\n\t\treturn `${ui.icon.figma} ${chalk.bold(short)} ${chalk.dim(\"Figma MCP\")}`;\n\t}\n\tswitch (name) {\n\t\tcase \"Write\":\n\t\tcase \"Edit\":\n\t\tcase \"NotebookEdit\":\n\t\t\treturn `${ui.brand.accent(\"✎\")} ${chalk.cyan(rel(\"file_path\"))}`;\n\t\tcase \"Read\":\n\t\t\treturn chalk.dim(`· read ${rel(\"file_path\")}`);\n\t\tcase \"Bash\": {\n\t\t\tconst cmd =\n\t\t\t\ttypeof input?.command === \"string\" ? input.command.split(\"\\n\")[0].slice(0, 70) : \"\";\n\t\t\treturn chalk.dim(`$ ${cmd}`);\n\t\t}\n\t\tdefault:\n\t\t\treturn `${ui.brand.blue(\"→\")} ${name}`;\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { logger } from \"./logger.js\";\nimport { type EdsConfig, edsConfigSchema } from \"./schemas.js\";\n\nconst GLOBAL_CONFIG_DIR = path.join(homedir(), \".eds\");\nconst GLOBAL_CONFIG_PATH = path.join(GLOBAL_CONFIG_DIR, \"config.json\");\nconst PROJECT_CONFIG_NAME = \".edsrc.json\";\n\nasync function loadJsonFile(filePath: string): Promise<unknown> {\n\ttry {\n\t\tconst content = await readFile(filePath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport async function loadConfig(projectRoot?: string): Promise<EdsConfig> {\n\tconst globalRaw = await loadJsonFile(GLOBAL_CONFIG_PATH);\n\tconst projectRaw = projectRoot\n\t\t? await loadJsonFile(path.join(projectRoot, PROJECT_CONFIG_NAME))\n\t\t: undefined;\n\n\tconst merged = {\n\t\t...(typeof globalRaw === \"object\" && globalRaw !== null ? globalRaw : {}),\n\t\t...(typeof projectRaw === \"object\" && projectRaw !== null ? projectRaw : {}),\n\t};\n\n\tconst result = edsConfigSchema.safeParse(merged);\n\tif (!result.success) {\n\t\tlogger.debug(\"Config validation issues:\", result.error.flatten());\n\t\treturn edsConfigSchema.parse({});\n\t}\n\n\treturn result.data;\n}\n\nexport function globalConfigDir(): string {\n\treturn GLOBAL_CONFIG_DIR;\n}\n\nexport function globalConfigPath(): string {\n\treturn GLOBAL_CONFIG_PATH;\n}\n\nexport function globalConfigExists(): boolean {\n\treturn existsSync(GLOBAL_CONFIG_PATH);\n}\n","import type { FigmaUrlParts } from \"../schemas.js\";\n\n/**\n * Parse a Figma URL into its components: fileKey, nodeId, fileName.\n *\n * Supported URL formats:\n * - figma.com/design/:fileKey/:fileName?node-id=:nodeId\n * - figma.com/design/:fileKey/branch/:branchKey/:fileName?node-id=:nodeId\n * - figma.com/file/:fileKey/:fileName?node-id=:nodeId\n * - figma.com/board/:fileKey/:fileName?node-id=:nodeId\n * - figma.com/make/:fileKey/:fileName\n * - figma.com/slides/:fileKey/:fileName?node-id=:nodeId\n *\n * nodeId in URL uses \"-\" as separator, converted to \":\" for API calls.\n */\nexport function parseFigmaUrl(input: string): FigmaUrlParts {\n\t// If input looks like a raw node-id (e.g., \"42:100\" or \"42-100\"), reject — need at least a fileKey\n\tif (/^\\d+[-:]\\d+$/.test(input.trim())) {\n\t\tthrow new Error(\n\t\t\t`Input \"${input}\" looks like a node-id but not a full URL. Provide a Figma URL or use --file-key.`,\n\t\t);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(input.trim());\n\t} catch {\n\t\tthrow new Error(`Invalid Figma URL: \"${input}\"`);\n\t}\n\n\tif (!url.hostname.endsWith(\"figma.com\")) {\n\t\tthrow new Error(`Not a Figma URL: \"${input}\"`);\n\t}\n\n\tconst segments = url.pathname.split(\"/\").filter(Boolean);\n\t// segments[0] = type (design|file|board|make|slides)\n\t// segments[1] = fileKey (or branchKey scenario below)\n\n\tif (segments.length < 2) {\n\t\tthrow new Error(`Cannot extract fileKey from URL: \"${input}\"`);\n\t}\n\n\tconst type = segments[0];\n\tlet fileKey: string;\n\tlet fileName: string | undefined;\n\n\t// Branch URLs: /design/:fileKey/branch/:branchKey/:fileName\n\tif (segments[2] === \"branch\" && segments[3]) {\n\t\tfileKey = segments[3]; // use branchKey as fileKey\n\t\tfileName = segments[4] ? decodeURIComponent(segments[4]) : undefined;\n\t} else {\n\t\tfileKey = segments[1];\n\t\tfileName = segments[2] ? decodeURIComponent(segments[2]) : undefined;\n\t}\n\n\t// Parse node-id from query params\n\tconst rawNodeId = url.searchParams.get(\"node-id\");\n\tconst nodeId = rawNodeId ? normalizeNodeId(rawNodeId) : undefined;\n\n\treturn { fileKey, nodeId, fileName };\n}\n\n/**\n * Convert node-id from URL format (42-100) to API format (42:100).\n */\nexport function normalizeNodeId(nodeId: string): string {\n\treturn decodeURIComponent(nodeId).replace(/-/g, \":\");\n}\n\n/**\n * Convert node-id from API format (42:100) to URL format (42-100).\n */\nexport function nodeIdToUrlFormat(nodeId: string): string {\n\treturn nodeId.replace(/:/g, \"-\");\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { FigmaUrlParts } from \"../schemas.js\";\n\nconst PROMPT_VERSION = \"0.5.0\";\n\nexport { PROMPT_VERSION };\n\nexport type ContentSource = \"document\" | \"ue\" | \"cf\" | \"mixed\";\n\n/** Design source. Figma is fully wired; the others read via their own MCP. */\nexport type DesignProvider = \"figma\" | \"stitch\" | \"canva\" | \"sketch\";\n\nexport const PROVIDER_NAMES: Record<DesignProvider, string> = {\n\tfigma: \"Figma\",\n\tstitch: \"Google Stitch\",\n\tcanva: \"Canva\",\n\tsketch: \"Sketch\",\n};\n\nexport interface PromptContext {\n\t/** Design source. Defaults to \"figma\". */\n\tprovider?: DesignProvider;\n\t/** Figma URL parts (for the Figma provider). */\n\tfigma?: FigmaUrlParts | null;\n\t/** Generic design reference / link (for non-Figma providers). */\n\tdesignRef?: string;\n\tblockName: string;\n\tprojectRoot: string;\n\twithUeModel: boolean;\n\t/** Where the block's content comes from. Defaults to document authoring. */\n\tcontentSource?: ContentSource;\n\t/** Optional CF model / GraphQL persisted-query hint (for cf/mixed). */\n\tcfHint?: string;\n\t/** Fetch a screenshot for pixel verification. Defaults to true. Off = fewer input tokens. */\n\tscreenshot?: boolean;\n\texistingTokens?: string;\n}\n\n/** Guidance for Content-Fragment-backed and mixed (UE + CF) blocks. */\nfunction contentSourceGuidance(\n\tsource: ContentSource | undefined,\n\tcfHint: string | undefined,\n\tblockName: string,\n): string {\n\tif (!source || source === \"document\" || source === \"ue\") return \"\";\n\tconst q = cfHint ? ` (model / persisted query: \\`${cfHint}\\`)` : \"\";\n\tconst gql = \"`${window.location.origin}/graphql/execute.json/<project>/<query>;path=<cfPath>`\";\n\tif (source === \"cf\") {\n\t\treturn `\n## Content source: Content Fragment\nThis block renders an AEM **Content Fragment**${q} - not inline-authored copy.\n- UE model: use an \\`aem-content-fragment\\` field (e.g. \\`name: \"fragment\"\\`) for the CF reference.\n- \\`decorate(block)\\` must be **async**: read the CF reference from the authored DOM (a link to \\`/content/dam/...\\`), fetch its fields through an AEM GraphQL **persisted query** (${gql}), then build the DOM from the returned fields.\n- Handle loading / empty / error states. Do not hardcode copy that the CF owns.\n- \\`.${blockName}\\` styling still follows the EDS conventions below.\n`;\n\t}\n\t// mixed\n\treturn `\n## Content source: Mixed (Universal Editor + Content Fragment)\nThis block mixes **two sources in one model and one \\`decorate(block)\\`**:\n- **Inline (UE-authored)** parts → normal fields (text / richtext / image / select) read straight from the authored DOM cells, with semantic collapsing.\n- **Content Fragment** part${q} → an \\`aem-content-fragment\\` field; \\`decorate()\\` is **async** and also fetches that CF via a GraphQL persisted query (${gql}) and renders its fields.\n- Field order in the model = cell order in the authored DOM. Read the inline cells by position; detect the CF reference by its \\`/content/dam/\\` link. Merge both into the final markup, and handle the CF loading/empty/error states.\n`;\n}\n\nexport async function buildPrompt(ctx: PromptContext): Promise<string> {\n\tconst tokensHint = await getTokensHint(ctx.projectRoot);\n\tconst contentSourceSection = contentSourceGuidance(ctx.contentSource, ctx.cfHint, ctx.blockName);\n\tconst withScreenshot = ctx.screenshot !== false;\n\tconst verifyStep = withScreenshot\n\t\t? `## Step 5 — Pixel-Perfect Self-Verification (do not skip)\nAfter writing the files, **verify against the screenshot from Step 1**:\n1. Re-open the \\`get_screenshot\\` image and compare it to your implementation region by region.\n2. Check each axis: spacing, font sizes/weights/line-heights, colors, border-radius, shadows, alignment, and overall proportions.\n3. For every mismatch, adjust the CSS and re-check. Repeat until the rendered block is indistinguishable from the screenshot.\n4. Briefly state what you verified and any value you had to infer.`\n\t\t: `## Step 5 — Structural Self-Verification (do not skip)\nNo screenshot was fetched (token-lean mode). Verify against the **exact values from \\`get_design_context\\`**:\n1. Re-check every extracted value (spacing, fonts, colors, radius, shadows, alignment) against your CSS.\n2. Fix any mismatch.\n3. Briefly state what you verified and any value you had to infer.`;\n\n\tconst provider = ctx.provider ?? \"figma\";\n\tconst providerName = PROVIDER_NAMES[provider];\n\tconst fetchSection =\n\t\tprovider === \"figma\"\n\t\t\t? `## Step 1 — Fetch the Design\nCall the Figma MCP tools for this selection:\n- \\`get_design_context\\` — structure, layout, measurements, text content\n- \\`get_variable_defs\\` — design tokens (variables) to map to CSS custom properties\n${withScreenshot ? \"- `get_screenshot` — the ground-truth visual reference for Step 5. Request it at `maxDimension: 1024` (enough to verify; do not request larger).\" : \"- (screenshot skipped to save tokens — pass `excludeScreenshot: true` to `get_design_context`)\"}\n\n**Token efficiency:** call each tool **once** for the target node only — don't re-fetch and don't walk sibling/parent nodes you don't need.${withScreenshot ? \"\" : \" You will verify structurally against the `get_design_context` measurements, not a picture.\"}\n\nTarget:\n- fileKey: \\`${ctx.figma?.fileKey}\\`\n${ctx.figma?.nodeId ? `- node: \\`${ctx.figma.nodeId}\\`` : \"- (no node selected — use the full page)\"}\n\n${\n\tctx.figma?.nodeId\n\t\t? `Use node ID \\`${ctx.figma.nodeId}\\` in file \\`${ctx.figma.fileKey}\\`.`\n\t\t: `Use file key \\`${ctx.figma?.fileKey}\\` (no specific node selected — analyze the full page or ask the user to select a frame).`\n}`\n\t\t\t: `## Step 1 — Fetch the Design\nRead the design from **${providerName}** through your ${providerName} MCP connection (use its design-context / inspect / screenshot tools). Design reference: \\`${ctx.designRef ?? \"(the selected design)\"}\\`.\nExtract the **exact** structure, layout, colours, typography, spacing, radius and effects — do not approximate.${withScreenshot ? \" Capture a screenshot for the Step 5 pixel check.\" : \" No screenshot (token-lean) — verify structurally against the extracted values.\"}\n\n**Token efficiency:** fetch once for the target only.`;\n\n\tconst ueModelSection = ctx.withUeModel\n\t\t? `\n## Step 4b — Universal Editor Authoring (REQUIRED, not optional)\nAuthors must be able to drop and edit this block in the Universal Editor, so generate its UE configuration **in the same pass** as the code.\n\nCreate \\`blocks/${ctx.blockName}/_${ctx.blockName}.json\\` using the EDS block-plugin (xwalk) format with three top-level arrays:\n\n\\`\\`\\`json\n{\n \"definitions\": [\n {\n \"title\": \"<Human Title>\",\n \"id\": \"${ctx.blockName}\",\n \"plugins\": {\n \"xwalk\": {\n \"page\": {\n \"resourceType\": \"core/franklin/components/block/v1/block\",\n \"template\": { \"name\": \"<Human Title>\", \"model\": \"${ctx.blockName}\" }\n }\n }\n }\n }\n ],\n \"models\": [\n { \"id\": \"${ctx.blockName}\", \"fields\": [ /* one field per authorable piece of content */ ] }\n ],\n \"filters\": []\n}\n\\`\\`\\`\n\nDerive the **model fields from the Figma design**, not boilerplate. Pick the correct field \\`component\\` for each authorable element from the **full Universal Editor field catalog** (17 types) — do not default everything to text:\n\n| component | valueType | Use for |\n|---|---|---|\n| \\`text\\` | string | Single-line: titles, labels, alt text, short strings |\n| \\`textarea\\` | string | Multi-line plain text: descriptions, notes |\n| \\`richtext\\` | string | Formatted copy: body with bold/italic/lists/links |\n| \\`reference\\` | string | AEM asset (image/video/doc) from DAM. \\`multi:true\\` for many |\n| \\`aem-content\\` | any | Page link / URL / content path (content picker) |\n| \\`aem-content-fragment\\` | any | Content Fragment reference |\n| \\`aem-experience-fragment\\` | any | Experience Fragment reference |\n| \\`aem-tag\\` | string | Tag picker for categorization |\n| \\`select\\` | string | Single choice dropdown — **requires \\`options\\`** |\n| \\`multiselect\\` | string | Multiple choice (often \\`name:\"classes\"\\` → CSS variants) — **requires \\`options\\`** |\n| \\`checkbox-group\\` | string[] | Multiple independent toggles — **requires \\`options\\`** |\n| \\`radio-group\\` | string | Mutually exclusive choice — **requires \\`options\\`** |\n| \\`boolean\\` | boolean | Single on/off toggle |\n| \\`number\\` | number | Counts, limits (validation: \\`numberMin\\`/\\`numberMax\\`) |\n| \\`date-time\\` | date | Date/time picker |\n| \\`container\\` | any | Group nested \\`fields\\`; \\`multi:true\\` = repeatable items (cards/slides) |\n| \\`tab\\` | any | Organize the property panel into tabs (UI only, not data) |\n\nRules:\n- Every field needs \\`component\\`, \\`name\\`, \\`label\\`. Include the enforced \\`valueType\\` from the table. Add \\`value\\` (default), \\`description\\`, \\`required\\`, \\`condition\\` (JSON Logic) where useful.\n- \\`options\\` format for select/multiselect/checkbox-group/radio-group: \\`[{ \"name\": \"Display\", \"value\": \"stored\" }]\\` (multiselect also supports grouped \\`children\\`).\n- **Semantic collapsing** — name paired fields so EDS collapses them into one element:\n - \\`image\\` (reference) + \\`imageAlt\\` (text) → \\`<picture><img alt=\"…\">\\`\n - \\`link\\` (aem-content) + \\`linkText\\` (text) + \\`linkTitle\\` (text) + \\`linkType\\` (text) → \\`<a href title>text</a>\\`\n - \\`title\\` (text) + \\`titleType\\` (select h1–h6) → \\`<h2>title</h2>\\` at the chosen level\n - \\`classes\\` (multiselect) → values become CSS classes on the block root\n - fields prefixed \\`group_\\` share one cell\n- Map Figma **text layers**: headings → \\`title\\`+\\`titleType\\`; body → \\`richtext\\`; short labels → \\`text\\`.\n- Map **image/media layers** → \\`reference\\` (+ \\`imageAlt\\`). **Links/CTAs** → \\`link\\`/\\`linkText\\`.\n- Map **component variants** → a \\`multiselect\\` named \\`classes\\` (or a \\`select\\`) whose options are the variant values (e.g. Theme dark/light, Layout centered) → CSS modifier classes on the block root. Keep JS/CSS variant handling in sync.\n- **Repeatable groups** (card lists, carousels, tabs): either a \\`container\\` field with \\`multi:true\\` and nested \\`fields\\`, or — for true child blocks — a container definition (\\`template.filter\\`) + an item definition (resourceType \\`core/franklin/components/block/v1/block/item\\`) + a matching \\`filters\\` entry.\n- Field \\`name\\`s must match what \\`decorate()\\` reads from the authored DOM. No underscores in names when using xwalk (except the \\`group_\\` grouping prefix).\n\n**Make multifields and dropdowns actually work — the config is only half; \\`decorate()\\` MUST consume every field:**\n- **Repeatable items** (cards, slides, accordion, list rows) → model them as a **container block**, not a flat model: (a) a container definition whose \\`template\\` has a \\`\"filter\"\\` (not \\`\"model\"\\`), (b) an **item** definition with \\`\"resourceType\": \"core/franklin/components/block/v1/block/item\"\\` and its own \\`model\\`, (c) a \\`filters\\` entry \\`{ \"id\": \"${ctx.blockName}\", \"components\": [\"${ctx.blockName}-item\"] }\\`. The authored block renders **one row per item** — \\`decorate()\\` MUST iterate them: \\`[...block.children].forEach((row) => { /* build one card */ })\\`. A flat model with no iteration = a block that only ever shows one item.\n- **Inline repeatable group** (e.g. 2–3 CTAs inside a hero) → a \\`container\\` field with \\`\"multi\": true\\` and nested \\`fields\\` (no child-block needed).\n- **Dropdowns**: a \\`select\\`/\\`radio-group\\` value arrives as a cell in the authored DOM — read it in \\`decorate()\\` and act on it (e.g. read \\`titleType\\` and swap the heading tag to \\`h1..h6\\`). A \\`multiselect\\` named \\`classes\\` is applied as CSS classes on the block root automatically — just write \\`.${ctx.blockName}.<value>\\` styles; any other \\`multiselect\\`/\\`checkbox-group\\` arrives as a CSV cell you parse.\n- **Self-check before finishing:** every field \\`name\\` in the model must be read by \\`decorate()\\` (or applied via \\`classes\\`). List each field and where the JS/CSS consumes it. Unconsumed fields = broken authoring.\n\nIf the project uses a **single aggregated model file** (\\`component-definition.json\\` + \\`component-models.json\\` + \\`component-filters.json\\`) instead of per-block \\`_${ctx.blockName}.json\\`, detect that convention and add the block's definition/model/filter to those files instead (and register the block in the \\`section\\` filter). Prefer the per-block \\`_${ctx.blockName}.json\\` when neither exists. Full field reference and a repeatable-cards round-trip example: \\`docs/universal-editor-fields.md\\`.\n`\n\t\t: \"\";\n\n\treturn `# Pixel-Perfect EDS Block from ${providerName}\n\n## Task\nGenerate an AEM Edge Delivery Services block named **\\`${ctx.blockName}\\`** that reproduces the ${providerName} design **1:1 — pixel perfect**. Exact spacing, colors, typography, and layout. Not \"close enough\" — identical.\n\n${fetchSection}\n\n## Step 2 — Extract Exact Values\nFrom the design data you fetched, record the **precise** values — do not approximate:\n1. **Layout**: Auto Layout direction, gap, padding, alignment → Flexbox/Grid with exact \\`gap\\`/\\`padding\\`\n2. **Spacing**: every margin/padding in px — convert to \\`rem\\` (÷16) or reuse a matching project token\n3. **Colors**: exact hex / token for every fill, stroke, shadow — prefer bound variables over raw hex\n4. **Typography**: font-family, font-size, font-weight, line-height, letter-spacing per text layer. If the design uses a font **not already loaded by the project**, add it to the project's font pipeline (\\`styles/fonts.css\\` / \\`loadFonts\\` in \\`scripts/scripts.js\\`, or a \\`<link>\\` managed by EDS) — **never** \\`@import\\` or a third-party \\`<link>\\` inside the block CSS (it is render-blocking and fails the loading audit). Always declare a sensible fallback stack.\n5. **Dimensions**: fixed vs. fluid (\\`Fill\\`→fluid, \\`Hug\\`→auto, fixed px→fixed) and border-radius\n6. **Effects**: box-shadow, blur, opacity, gradients — replicate exactly\n\n## Step 3 — Map to Semantic EDS Structure\n- Map layer names/roles to semantic HTML (\\`<h1>\\`/\\`<h2>\\` by text-style level, \\`<p>\\`, \\`<a class=\"button\">\\`, \\`<picture>\\`, \\`<figure>\\`, \\`<nav>\\`…)\n- A \\`decorate(block)\\` function receives a \\`<div class=\"${ctx.blockName}\">\\` whose children are the **authored content** coming from the document (EDS block table rows → nested divs). Your job is to read that existing DOM and enhance/restructure it — **not** to hardcode copy.\n- Assume one row per logical content group; the first cell of each row holds the content. Normalize whatever markup EDS hands you.\n- Map Figma component **variant properties** to modifier classes on the block root (e.g. \\`Theme=dark\\` → \\`.${ctx.blockName}.dark\\`, \\`Layout=centered\\` → \\`.${ctx.blockName}.centered\\`). Read variants via metadata; handle each in CSS.\n- Follow any Figma **annotations** for behavior (autoplay, collapsed-by-default, load eagerly, truncation, tab order).\n\n## Step 4 — Generate Block Files\n\nCreate these files in \\`blocks/${ctx.blockName}/\\`:\n\n### \\`${ctx.blockName}.js\\`\n\\`\\`\\`javascript\n// EDS block: ${ctx.blockName}\n// Generated from Figma design\nexport default function decorate(block) {\n // - Vanilla JS only (no frameworks)\n // - Read the authored children already inside \\`block\\`; restructure into semantic HTML\n // - Add class names prefixed with \"${ctx.blockName}-\"\n // - Wire interactions from Figma annotations (if any)\n // - Eager-load above-fold images, lazy-load below-fold\n}\n\\`\\`\\`\n\n### \\`${ctx.blockName}.css\\`\n\\`\\`\\`css\n/* EDS block: ${ctx.blockName} */\n/* Map Figma design tokens to CSS custom properties; reuse project tokens below where they match */\n/* Mobile-first; exact values from Step 2 */\n\\`\\`\\`\n${ueModelSection}${contentSourceSection}\n## Placeholders & assets — be visible before Universal Editor takes over\nContent images and copy come from **authoring** (the document / DAM via UE), not the repo. Do **not** ship design-tool CDN URLs (Figma / Google Stitch links are short-lived) and do **not** bundle content photos into the repo.\n- In \\`decorate()\\`, read the image/text from the authored DOM. When none is present yet, render a lightweight **placeholder** so the block is visible *before* an author sets the real content: an inline SVG data-URI grey box (or a CSS placeholder) at the correct \\`aspect-ratio\\`, and sensible placeholder copy.\n- Provide the mock for the preview in \\`blocks/${ctx.blockName}/_${ctx.blockName}.preview.html\\` (used by \\`eds block preview\\`). Keep placeholder copy there, not hardcoded in the block.\n- Only bundle genuinely **static, decorative** assets (e.g. a small icon) as an optimized inline/\\`icons/\\` **SVG**, referenced by project-relative path. Never bundle authorable content images.\n- Always set \\`width\\`/\\`height\\` or \\`aspect-ratio\\` to avoid CLS.\n\n${verifyStep}\n\n## EDS Block Conventions\n- **Full-width by default**: the block/section spans the **full viewport width** (full-bleed) — never a fixed or centered fixed-width box. Constrain only the *inner content* to a sensible \\`max-width\\` (centered) for line-length/readability, with fluid horizontal padding. The design frame's width (e.g. 1280px) is the content cap, not the section width.\n- **Mobile-first & fluid**: base styles target the smallest screen; layer breakpoints upward. The section must look right at any width, not only the design frame's.\n- **No frameworks**: vanilla JS and CSS only\n- **\\`decorate(block)\\`**: enhance the authored DOM; never inject hardcoded copy that should be authored\n- **Semantic HTML**: correct elements and heading hierarchy\n- **Class naming**: prefix all classes with the block name: \\`.${ctx.blockName}-item\\`, \\`.${ctx.blockName}-title\\`\n- **Loading strategy**: eager (above-fold/hero), lazy (below-fold/carousels), delayed (analytics)\n- **Images**: always \\`alt\\` (empty for decorative), \\`<picture>\\` with WebP where applicable\n- **Accessibility**: ARIA where needed, keyboard navigation, focus states matching the design\n- **Performance**: no heavy dependencies, minimal DOM work, CSS for animations\n${tokensHint}\n\n## Output Requirements\n1. All files in \\`blocks/${ctx.blockName}/\\`${ctx.withUeModel ? ` — JS, CSS **and** the Universal Editor model (\\`_${ctx.blockName}.json\\`)` : \"\"}\n2. Production-ready, Lighthouse-friendly (aim for 100), no \\`console.log\\`\n3. Brief inline comments only for non-obvious logic\n4. **Minimise chat output (save tokens):** write the files directly with your editing tools — do **not** paste the generated code back into the chat, and skip step-by-step narration. End with a **≤3-line** summary: files created + any value you had to infer.\n5. Mobile-first CSS with breakpoints at 600px and 900px\n6. Prefer existing project tokens over new hardcoded values${ctx.withUeModel ? \"\\n7. UE model field `name`s must match what `decorate()` reads, and every Figma variant must appear as a select option wired to a CSS modifier\" : \"\"}\n\n---\n*Prompt version: ${PROMPT_VERSION}*\n`;\n}\n\nasync function getTokensHint(projectRoot: string): Promise<string> {\n\tconst stylesPath = path.join(projectRoot, \"styles\", \"styles.css\");\n\tif (!existsSync(stylesPath)) return \"\";\n\n\ttry {\n\t\tconst css = await readFile(stylesPath, \"utf-8\");\n\t\t// Extract CSS custom properties from :root\n\t\tconst rootMatch = css.match(/:root\\s*\\{([^}]+)\\}/);\n\t\tif (!rootMatch) return \"\";\n\n\t\tconst props = rootMatch[1]\n\t\t\t.split(\"\\n\")\n\t\t\t.filter((line) => line.trim().startsWith(\"--\"))\n\t\t\t.map((line) => line.trim())\n\t\t\t.join(\"\\n \");\n\n\t\tif (!props) return \"\";\n\n\t\treturn `\n## Existing Project Tokens\nThe project already defines these CSS custom properties in \\`styles/styles.css\\`.\nReuse them instead of hardcoding values:\n\n\\`\\`\\`css\n:root {\n ${props}\n}\n\\`\\`\\`\n`;\n\t} catch {\n\t\treturn \"\";\n\t}\n}\n","/**\n * Generates the in-memory HTML for `eds block preview`.\n *\n * Two documents are produced:\n * - `inner` — renders ONLY the block (authored content + its CSS + decorate).\n * Loaded inside an <iframe> whose width is the chosen breakpoint, so the\n * block's media queries fire against that width, not the real monitor.\n * - `outer` — neutral grayscale chrome: a breakpoint dropdown and an optional\n * \"Open in Figma\" link. Deliberately colourless so it never tints the\n * perception of the design being previewed.\n *\n * Asset paths are root-absolute (`/blocks/<name>/...`) so they resolve no\n * matter which route serves the HTML.\n */\n\nexport interface Breakpoint {\n\twidth: number;\n\tlabel: string;\n\t/** True if this width has a real Figma frame behind it (pixel-perfect). */\n\tfigma: boolean;\n}\n\nexport interface HarnessOptions {\n\tblockName: string;\n\tbreakpoints: Breakpoint[];\n\t/** Authored block markup (`<div class=\"<name> block\">…</div>`). */\n\tsampleContent: string;\n\tfigmaUrl?: string;\n\t/** Route the outer page points its iframe at. */\n\tframeRoute: string;\n\t/** True when sampleContent is a generated placeholder (shows a hint). */\n\tplaceholder?: boolean;\n}\n\nfunction esc(s: string): string {\n\treturn s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nexport function buildInner(opts: HarnessOptions): string {\n\tconst { blockName, sampleContent } = opts;\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<link rel=\"stylesheet\" href=\"/blocks/${blockName}/${blockName}.css\" />\n<style>*{box-sizing:border-box}html,body{margin:0;padding:0}</style>\n</head>\n<body>\n${sampleContent}\n<script type=\"module\">\n import decorate from '/blocks/${blockName}/${blockName}.js';\n const block = document.querySelector('.${blockName}');\n if (block) { try { decorate(block); } catch (e) { console.error('decorate() failed:', e); } }\n</script>\n<script>\n // Live reload: refresh when eds detects a change to the block.\n try { new EventSource('/__eds_events').onmessage = () => location.reload(); } catch (e) { /* no SSE */ }\n</script>\n</body>\n</html>`;\n}\n\nexport function buildOuter(opts: HarnessOptions): string {\n\tconst { blockName, breakpoints, figmaUrl, frameRoute, placeholder } = opts;\n\n\t// Default to the widest Figma-referenced breakpoint, else the widest overall.\n\tconst figmaBps = breakpoints.filter((b) => b.figma);\n\tconst def = (figmaBps.length ? figmaBps : breakpoints).reduce(\n\t\t(m, b) => (b.width > m.width ? b : m),\n\t\tbreakpoints[0],\n\t);\n\n\tconst options = breakpoints\n\t\t.map(\n\t\t\t(b) =>\n\t\t\t\t`<option value=\"${b.width}\"${b.width === def.width ? \" selected\" : \"\"}>${esc(b.label)}</option>`,\n\t\t)\n\t\t.join(\"\\n \");\n\n\tconst figmaLink = figmaUrl\n\t\t? `<a class=\"figma-link\" href=\"${esc(figmaUrl)}\" target=\"_blank\" rel=\"noopener\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 3h6v6\"/><path d=\"M10 14 21 3\"/><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/></svg>\n Open in Figma\n </a>`\n\t\t: \"\";\n\n\tconst hint = placeholder\n\t\t? `<span class=\"hint\">placeholder content — add <code>blocks/${blockName}/_${blockName}.preview.html</code></span>`\n\t\t: \"\";\n\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<title>eds preview — ${esc(blockName)}</title>\n<style>\n *{box-sizing:border-box}\n html,body{margin:0;padding:0;background:#1f1f1f;color:#eaeaea;font-family:ui-sans-serif,-apple-system,\"Segoe UI\",sans-serif}\n .bar{position:sticky;top:0;z-index:10;display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:12px 18px;font-size:13px;background:#141414;border-bottom:1px solid #333}\n .bar .label{color:#8a8a8a;font-weight:600}\n .bar .block{color:#e6e6e6;font-weight:700}\n select#bp{appearance:none;cursor:pointer;color:#eaeaea;background:#232323;border:1px solid #3a3a3a;border-radius:8px;padding:7px 34px 7px 13px;font:inherit;font-size:12.5px;font-weight:600;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238a8a8a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:14px}\n select#bp:hover{border-color:#6a6a6a;background-color:#2e2e2e}\n .hint{color:#8a8a8a;font-size:12px}\n .hint code{color:#bdbdbd}\n .figma-link{margin-left:auto;display:inline-flex;align-items:center;gap:7px;color:#cfcfcf;text-decoration:none;font-weight:600;font-size:12.5px;padding:7px 13px;border:1px solid #3a3a3a;border-radius:8px;background:#232323}\n .figma-link svg{width:15px;height:15px}\n .figma-link:hover{border-color:#6a6a6a;background:#2e2e2e;color:#fff}\n .stage{padding:30px 28px;display:flex;justify-content:center;overflow-x:auto}\n .device{position:relative;background:#fff;border:1px solid #000;transition:width .2s ease}\n .device::before{content:attr(data-w) \"px\";position:absolute;top:-20px;left:0;font-size:11px;color:#8a8a8a;font-family:ui-monospace,Menlo,monospace}\n iframe{display:block;width:100%;height:820px;border:0}\n</style>\n</head>\n<body>\n <div class=\"bar\">\n <span class=\"label\">Block</span><span class=\"block\">${esc(blockName)}</span>\n <label class=\"label\" for=\"bp\" style=\"margin-left:8px\">Breakpoint</label>\n <select id=\"bp\">\n ${options}\n <option value=\"full\">Full cała szerokość</option>\n </select>\n ${hint}\n ${figmaLink}\n </div>\n <div class=\"stage\">\n <div class=\"device\" id=\"device\" data-w=\"${def.width}\" style=\"width:${def.width}px\">\n <iframe id=\"frame\" src=\"${frameRoute}\" title=\"${esc(blockName)} preview\"></iframe>\n </div>\n </div>\n <script>\n const device = document.getElementById('device');\n const bp = document.getElementById('bp');\n function setWidth(w){\n if(w==='full'){device.style.width='100%';device.dataset.w=Math.round(device.getBoundingClientRect().width);}\n else{device.style.width=w+'px';device.dataset.w=w;}\n }\n bp.addEventListener('change',()=>setWidth(bp.value==='full'?'full':Number(bp.value)));\n setWidth(Number(bp.value));\n </script>\n</body>\n</html>`;\n}\n","import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport http from \"node:http\";\nimport path from \"node:path\";\n\nconst MIME: Record<string, string> = {\n\t\".html\": \"text/html; charset=utf-8\",\n\t\".js\": \"text/javascript; charset=utf-8\",\n\t\".mjs\": \"text/javascript; charset=utf-8\",\n\t\".css\": \"text/css; charset=utf-8\",\n\t\".json\": \"application/json; charset=utf-8\",\n\t\".svg\": \"image/svg+xml\",\n\t\".png\": \"image/png\",\n\t\".jpg\": \"image/jpeg\",\n\t\".jpeg\": \"image/jpeg\",\n\t\".webp\": \"image/webp\",\n\t\".gif\": \"image/gif\",\n\t\".avif\": \"image/avif\",\n\t\".woff\": \"font/woff\",\n\t\".woff2\": \"font/woff2\",\n\t\".ico\": \"image/x-icon\",\n};\n\nexport interface VirtualRoute {\n\tbody: string;\n\ttype: string;\n}\n\nexport interface PreviewServer {\n\turl: string;\n\tport: number;\n\t/** Push a reload to all connected browsers (live reload). */\n\treload: () => void;\n\tclose: () => Promise<void>;\n}\n\n/** Signature route so another `eds` run can detect a live preview server. */\nexport const PING_ROUTE = \"/__eds_ping\";\n/** Server-Sent Events route the harness subscribes to for live reload. */\nexport const EVENTS_ROUTE = \"/__eds_events\";\n\n/**\n * Serve `root` as static files, plus a set of in-memory virtual routes (the\n * generated harness HTML — no files are written to the user's project).\n * Tries `port`, falling back to the next few ports if taken.\n */\nexport function startServer(\n\troot: string,\n\troutes: Record<string, VirtualRoute>,\n\tport: number,\n\thost = \"127.0.0.1\",\n): Promise<PreviewServer> {\n\tconst resolvedRoot = path.resolve(root);\n\tconst clients = new Set<http.ServerResponse>();\n\n\tconst server = http.createServer((req, res) => {\n\t\tconst urlPath = decodeURIComponent((req.url ?? \"/\").split(\"?\")[0]);\n\n\t\t// Ping: lets another `eds` run detect an already-running preview server.\n\t\tif (urlPath === PING_ROUTE) {\n\t\t\tres.writeHead(200, { \"content-type\": \"application/json\" });\n\t\t\tres.end(JSON.stringify({ eds: true }));\n\t\t\treturn;\n\t\t}\n\n\t\t// Live-reload event stream (SSE).\n\t\tif (urlPath === EVENTS_ROUTE) {\n\t\t\tres.writeHead(200, {\n\t\t\t\t\"content-type\": \"text/event-stream\",\n\t\t\t\t\"cache-control\": \"no-cache\",\n\t\t\t\tconnection: \"keep-alive\",\n\t\t\t});\n\t\t\tres.write(\": connected\\n\\n\");\n\t\t\tclients.add(res);\n\t\t\treq.on(\"close\", () => clients.delete(res));\n\t\t\treturn;\n\t\t}\n\n\t\tconst route = routes[urlPath];\n\t\tif (route) {\n\t\t\tres.writeHead(200, { \"content-type\": route.type });\n\t\t\tres.end(route.body);\n\t\t\treturn;\n\t\t}\n\n\t\t// Static file from the project root (with path-traversal protection).\n\t\tconst filePath = path.join(resolvedRoot, urlPath);\n\t\tif (!filePath.startsWith(resolvedRoot)) {\n\t\t\tres.writeHead(403);\n\t\t\tres.end(\"Forbidden\");\n\t\t\treturn;\n\t\t}\n\t\tif (!existsSync(filePath) || !statSync(filePath).isFile()) {\n\t\t\tres.writeHead(404, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(`Not found: ${urlPath}`);\n\t\t\treturn;\n\t\t}\n\t\tres.writeHead(200, {\n\t\t\t\"content-type\": MIME[path.extname(filePath).toLowerCase()] ?? \"application/octet-stream\",\n\t\t});\n\t\tcreateReadStream(filePath).pipe(res);\n\t});\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet attempts = 0;\n\t\tconst tryListen = (p: number) => {\n\t\t\tserver.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tif (err.code === \"EADDRINUSE\" && attempts < 10) {\n\t\t\t\t\tattempts++;\n\t\t\t\t\ttryListen(p + 1);\n\t\t\t\t} else {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t});\n\t\t\tserver.listen(p, host, () => {\n\t\t\t\tresolve({\n\t\t\t\t\turl: `http://${host}:${p}/`,\n\t\t\t\t\tport: p,\n\t\t\t\t\treload: () => {\n\t\t\t\t\t\tfor (const c of clients) c.write(\"data: reload\\n\\n\");\n\t\t\t\t\t},\n\t\t\t\t\tclose: () =>\n\t\t\t\t\t\tnew Promise<void>((res) => {\n\t\t\t\t\t\t\tfor (const c of clients) c.end();\n\t\t\t\t\t\t\tserver.close(() => res());\n\t\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t});\n\t\t};\n\t\ttryListen(port);\n\t});\n}\n","import { existsSync, watch } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../../lib/logger.js\";\nimport { type Breakpoint, buildInner, buildOuter } from \"../../lib/preview/harness.js\";\nimport { startServer } from \"../../lib/preview/server.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport * as ui from \"../../lib/ui.js\";\n\ninterface PreviewOptions {\n\tport?: string;\n\twidths?: string;\n\topen?: boolean; // commander sets open=false for --no-open\n}\n\nconst DEFAULT_WIDTHS = [375, 768, 1280];\n\nfunction labelFor(width: number): string {\n\tif (width <= 480) return `${width} mobile`;\n\tif (width <= 1024) return `${width} tablet`;\n\treturn `${width} desktop`;\n}\n\n/** Build breakpoints from --widths, else .eds-meta.json, else sane defaults. */\nfunction resolveBreakpoints(\n\twidthsFlag: string | undefined,\n\tmeta: Record<string, unknown> | null,\n): Breakpoint[] {\n\tif (widthsFlag) {\n\t\tconst widths = widthsFlag\n\t\t\t.split(\",\")\n\t\t\t.map((w) => Number.parseInt(w.trim(), 10))\n\t\t\t.filter((w) => Number.isFinite(w) && w > 0);\n\t\tif (widths.length) return widths.map((w) => ({ width: w, label: labelFor(w), figma: false }));\n\t}\n\n\tconst metaBps = meta?.breakpoints;\n\tif (Array.isArray(metaBps) && metaBps.length) {\n\t\treturn metaBps\n\t\t\t.map((b) => ({\n\t\t\t\twidth: Number(b.width),\n\t\t\t\tlabel: typeof b.label === \"string\" ? b.label : labelFor(Number(b.width)),\n\t\t\t\tfigma: b.source === \"figma\",\n\t\t\t}))\n\t\t\t.filter((b) => Number.isFinite(b.width) && b.width > 0);\n\t}\n\n\treturn DEFAULT_WIDTHS.map((w) => ({ width: w, label: labelFor(w), figma: false }));\n}\n\nfunction figmaUrlFromMeta(meta: Record<string, unknown> | null): string | undefined {\n\tif (!meta?.figmaFileKey || typeof meta.figmaFileKey !== \"string\") return undefined;\n\tconst node =\n\t\ttypeof meta.figmaNodeId === \"string\" ? meta.figmaNodeId.replace(\":\", \"-\") : undefined;\n\tconst base = `https://www.figma.com/design/${meta.figmaFileKey}/preview`;\n\treturn node ? `${base}?node-id=${node}` : base;\n}\n\nfunction defaultSample(blockName: string): string {\n\treturn `<div class=\"${blockName} block\">\n <div><div>\n <h2>${blockName} heading</h2>\n <p>Sample body copy for the preview. Replace with real authored content.</p>\n <p><a href=\"#\">Primary action</a></p>\n <p><a href=\"#\">Secondary action</a></p>\n </div></div>\n</div>`;\n}\n\nasync function openInBrowser(url: string): Promise<void> {\n\tconst cmd =\n\t\tprocess.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n\ttry {\n\t\tconst { execa } = await import(\"execa\");\n\t\tawait execa(cmd, [url], { stdio: \"ignore\", shell: process.platform === \"win32\" });\n\t} catch {\n\t\t// Non-fatal — the URL is printed anyway.\n\t}\n}\n\nexport async function previewBlock(name: string, options: PreviewOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst blockDir = path.join(projectRoot, \"blocks\", name);\n\tif (!existsSync(blockDir)) {\n\t\tlogger.error(`Block \"${name}\" not found at blocks/${name}/.`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tif (\n\t\t!existsSync(path.join(blockDir, `${name}.css`)) &&\n\t\t!existsSync(path.join(blockDir, `${name}.js`))\n\t) {\n\t\tlogger.error(`Block \"${name}\" has no ${name}.css / ${name}.js to preview.`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Load metadata (breakpoints, Figma source) if present.\n\tlet meta: Record<string, unknown> | null = null;\n\tconst metaPath = path.join(blockDir, \".eds-meta.json\");\n\tif (existsSync(metaPath)) {\n\t\ttry {\n\t\t\tmeta = JSON.parse(await readFile(metaPath, \"utf-8\"));\n\t\t} catch {\n\t\t\t// ignore malformed meta\n\t\t}\n\t}\n\n\t// Sample authored content: _<name>.preview.html if provided, else a placeholder.\n\tconst samplePath = path.join(blockDir, `_${name}.preview.html`);\n\tlet sampleContent: string;\n\tlet placeholder = false;\n\tif (existsSync(samplePath)) {\n\t\tsampleContent = await readFile(samplePath, \"utf-8\");\n\t} else {\n\t\tsampleContent = defaultSample(name);\n\t\tplaceholder = true;\n\t}\n\n\tconst breakpoints = resolveBreakpoints(options.widths, meta);\n\tconst figmaUrl = figmaUrlFromMeta(meta);\n\tconst frameRoute = \"/__eds_preview_frame\";\n\n\tconst inner = buildInner({ blockName: name, breakpoints, sampleContent, frameRoute });\n\tconst outer = buildOuter({\n\t\tblockName: name,\n\t\tbreakpoints,\n\t\tsampleContent,\n\t\tfigmaUrl,\n\t\tframeRoute,\n\t\tplaceholder,\n\t});\n\n\tconst port = Number.parseInt(options.port ?? \"8777\", 10);\n\tconst server = await startServer(\n\t\tprojectRoot,\n\t\t{\n\t\t\t\"/\": { body: outer, type: \"text/html; charset=utf-8\" },\n\t\t\t[frameRoute]: { body: inner, type: \"text/html; charset=utf-8\" },\n\t\t},\n\t\tNumber.isFinite(port) ? port : 8777,\n\t);\n\n\tlogger.logoOnce(ui.logo(`Preview — ${name}`));\n\tlogger.info(ui.heading(\"Live preview\", server.url));\n\tlogger.info(\n\t\tui.statusLine(\n\t\t\t\"pass\",\n\t\t\t\"breakpoints\",\n\t\t\t`${breakpoints.map((b) => `${b.width}${b.figma ? \"✓\" : \"\"}`).join(\", \")}, Full`,\n\t\t),\n\t);\n\tif (placeholder) {\n\t\tlogger.info(\n\t\t\tui.statusLine(\n\t\t\t\t\"warn\",\n\t\t\t\t\"content\",\n\t\t\t\t`placeholder — add blocks/${name}/_${name}.preview.html for real content`,\n\t\t\t),\n\t\t);\n\t}\n\t// Live reload: watch the block folder and push a browser refresh on change.\n\tlet reloadTimer: NodeJS.Timeout | undefined;\n\tconst watcher = watch(blockDir, { recursive: true }, () => {\n\t\tclearTimeout(reloadTimer);\n\t\treloadTimer = setTimeout(() => server.reload(), 150);\n\t});\n\n\tlogger.info(\"\");\n\tlogger.info(` ${chalk.bold(\"➜\")} ${chalk.cyan(server.url)}`);\n\tlogger.info(ui.statusLine(\"pass\", \"live reload\", \"edits to the block refresh the browser\"));\n\tlogger.info(chalk.dim(\" Press Ctrl+C to stop.\\n\"));\n\n\tif (options.open !== false) await openInBrowser(server.url);\n\n\t// Keep running until interrupted.\n\tconst stop = async () => {\n\t\twatcher.close();\n\t\tawait server.close();\n\t\tprocess.exit(0);\n\t};\n\tprocess.on(\"SIGINT\", stop);\n\tprocess.on(\"SIGTERM\", stop);\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { detectAgent, detectAllAgents } from \"../../lib/agents/detect.js\";\nimport { invokeAgent, savePromptToFile } from \"../../lib/agents/invoke.js\";\nimport { loadConfig } from \"../../lib/config.js\";\nimport { parseFigmaUrl } from \"../../lib/figma/node-id.js\";\nimport {\n\ttype ContentSource,\n\ttype DesignProvider,\n\tPROMPT_VERSION,\n\tPROVIDER_NAMES,\n\tbuildPrompt,\n} from \"../../lib/figma/prompt-builder.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport { kebabCaseRegex } from \"../../lib/schemas.js\";\nimport * as ui from \"../../lib/ui.js\";\nimport type { AgentType, FigmaUrlParts } from \"../../types/index.js\";\n\ninterface FromDesignOptions {\n\tname?: string;\n\tagent?: string;\n\tdryRun?: boolean;\n\t/** Generate the Universal Editor model. Defaults to true (`--no-ue-model` disables). */\n\tueModel?: boolean;\n\tyes?: boolean;\n\t/** Where the block's content comes from (default: document). */\n\tsource?: ContentSource;\n\t/** Optional CF model / GraphQL persisted-query hint (cf/mixed). */\n\tcfHint?: string;\n\t/** Fetch a screenshot for pixel verification. Default true; `--no-screenshot` saves tokens. */\n\tscreenshot?: boolean;\n\t/** Auto-start the preview after generating. Default true; `--no-serve` disables. */\n\tserve?: boolean;\n\t/** Design source. Defaults to figma. */\n\tprovider?: DesignProvider;\n}\n\n/** Is an eds preview server already answering on this port? */\nasync function previewRunning(port = 8777): Promise<boolean> {\n\ttry {\n\t\tconst ctrl = new AbortController();\n\t\tconst t = setTimeout(() => ctrl.abort(), 400);\n\t\tconst res = await fetch(`http://127.0.0.1:${port}/__eds_ping`, { signal: ctrl.signal });\n\t\tclearTimeout(t);\n\t\tif (!res.ok) return false;\n\t\tconst data = (await res.json()) as { eds?: boolean };\n\t\treturn data?.eds === true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Interactive, step-by-step wizard used when `eds block from-design` is run\n * without a URL. Collects everything the flags would, including the content\n * source (document / UE / Content Fragment / mixed), then hands control back\n * to the normal flow. Returns null if the user cancels at the summary.\n */\nasync function runWizard(\n\tfigmaUrl: string | undefined,\n): Promise<(FromDesignOptions & { figmaUrl: string }) | null> {\n\tconst { input, select, confirm } = await import(\"@inquirer/prompts\");\n\n\tconst provider = (await select({\n\t\tmessage: \"1/7 Design source\",\n\t\tchoices: [\n\t\t\t{ name: \"Figma\", value: \"figma\" },\n\t\t\t{ name: \"Google Stitch\", value: \"stitch\" },\n\t\t\t{ name: \"Canva\", value: \"canva\" },\n\t\t\t{ name: \"Sketch\", value: \"sketch\" },\n\t\t],\n\t\tdefault: \"figma\",\n\t})) as DesignProvider;\n\n\tconst name = await input({\n\t\tmessage: \"2/7 Component name\",\n\t\tvalidate: (v) => kebabCaseRegex.test(v.trim()) || \"Use kebab-case, e.g. hero-banner\",\n\t});\n\n\tconst url =\n\t\tfigmaUrl ??\n\t\t(await input({\n\t\t\tmessage: `3/7 ${PROVIDER_NAMES[provider]} link`,\n\t\t\tvalidate: (v) => {\n\t\t\t\tif (!v.trim()) return \"Paste the design link\";\n\t\t\t\tif (provider !== \"figma\") return true;\n\t\t\t\ttry {\n\t\t\t\t\tparseFigmaUrl(v.trim());\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (err) {\n\t\t\t\t\treturn (err as Error).message;\n\t\t\t\t}\n\t\t\t},\n\t\t}));\n\n\tconst source = (await select({\n\t\tmessage: \"4/7 Where does the content come from?\",\n\t\tchoices: [\n\t\t\t{ name: \"Document authoring (default EDS)\", value: \"document\" },\n\t\t\t{ name: \"Universal Editor\", value: \"ue\" },\n\t\t\t{ name: \"Content Fragment\", value: \"cf\" },\n\t\t\t{ name: \"Mixed - Universal Editor + Content Fragment\", value: \"mixed\" },\n\t\t],\n\t\tdefault: \"document\",\n\t})) as ContentSource;\n\n\tlet cfHint: string | undefined;\n\tif (source === \"cf\" || source === \"mixed\") {\n\t\tconst hint = await input({\n\t\t\tmessage: \" CF model / GraphQL persisted-query name (optional)\",\n\t\t});\n\t\tcfHint = hint.trim() || undefined;\n\t}\n\n\tconst ueModel = await confirm({\n\t\tmessage: \"5/7 Generate the Universal Editor model?\",\n\t\tdefault: true,\n\t});\n\n\tconst screenshot = await confirm({\n\t\tmessage: \"6/7 Fetch a screenshot for a pixel-perfect check? (off = fewer tokens)\",\n\t\tdefault: true,\n\t});\n\n\tconst agents = await detectAllAgents();\n\tconst runMode = await select({\n\t\tmessage: \"7/7 Run with\",\n\t\tchoices: [\n\t\t\t...agents.map((a) => ({\n\t\t\t\tname: `${a.type}${provider === \"figma\" && !a.hasFigmaMcp ? \" (Figma MCP not detected)\" : \"\"}`,\n\t\t\t\tvalue: `agent:${a.type}`,\n\t\t\t})),\n\t\t\t{ name: \"Preview the prompt only (--dry-run)\", value: \"dry-run\" },\n\t\t\t{ name: \"Save the prompt, run it later (--agent none)\", value: \"none\" },\n\t\t],\n\t\tdefault: agents[0] ? `agent:${agents[0].type}` : \"dry-run\",\n\t});\n\n\tconst sourceLabel = PROVIDER_NAMES[provider].toLowerCase();\n\tlogger.info(ui.heading(\"Summary\"));\n\tconst w = ui.columnWidth([\"component\", sourceLabel, \"content\", \"ue model\", \"screenshot\", \"run\"]);\n\tlogger.info(ui.accentLine(\"component\", name, w));\n\tconst designRef =\n\t\tprovider === \"figma\"\n\t\t\t? (() => {\n\t\t\t\t\tconst parsed = parseFigmaUrl(url.trim());\n\t\t\t\t\treturn parsed.nodeId ? `node ${parsed.nodeId}` : parsed.fileKey;\n\t\t\t\t})()\n\t\t\t: url.trim();\n\tlogger.info(ui.accentLine(sourceLabel, designRef, w));\n\tlogger.info(ui.accentLine(\"content\", source + (cfHint ? ` (${cfHint})` : \"\"), w));\n\tlogger.info(ui.accentLine(\"ue model\", ueModel ? \"yes\" : \"no\", w));\n\tlogger.info(ui.accentLine(\"screenshot\", screenshot ? \"yes\" : \"no (token-lean)\", w));\n\tlogger.info(ui.accentLine(\"run\", runMode.replace(\"agent:\", \"\"), w));\n\tlogger.info(\"\");\n\n\tconst go = await confirm({ message: \"Generate this block?\", default: true });\n\tif (!go) return null;\n\n\tconst opts: FromDesignOptions & { figmaUrl: string } = {\n\t\tfigmaUrl: url.trim(),\n\t\tname,\n\t\tprovider,\n\t\tsource,\n\t\tcfHint,\n\t\tueModel,\n\t\tscreenshot,\n\t};\n\tif (runMode === \"dry-run\") opts.dryRun = true;\n\telse if (runMode === \"none\") opts.agent = \"none\";\n\telse {\n\t\topts.agent = runMode.replace(\"agent:\", \"\");\n\t\topts.yes = true;\n\t}\n\treturn opts;\n}\n\nfunction inferBlockName(fileName?: string): string {\n\tif (!fileName) return \"design-block\";\n\treturn (\n\t\tfileName\n\t\t\t.replace(/[-_\\s]+/g, \"-\")\n\t\t\t.replace(/[^a-z0-9-]/gi, \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/^-+|-+$/g, \"\") || \"design-block\"\n\t);\n}\n\nexport async function blockFromDesign(\n\tfigmaUrlArg: string | undefined,\n\toptionsArg: FromDesignOptions,\n): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\n\t\t\t\"Not inside an EDS project (no EDS project markers found). Run this from your project root.\",\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tawait logger.logoOnceAnimated(\"Design → EDS block\");\n\n\tlet designUrl = figmaUrlArg;\n\tlet options = optionsArg;\n\t// No URL given → run the interactive, step-by-step wizard.\n\tif (!designUrl) {\n\t\tconst wiz = await runWizard(designUrl);\n\t\tif (!wiz) {\n\t\t\tlogger.info(\"Cancelled.\");\n\t\t\treturn;\n\t\t}\n\t\tdesignUrl = wiz.figmaUrl;\n\t\toptions = { ...options, ...wiz };\n\t}\n\n\tconst provider = options.provider ?? \"figma\";\n\tconst providerName = PROVIDER_NAMES[provider];\n\n\t// Resolve the design reference. Figma links are parsed into file/node parts\n\t// (which feed the Figma MCP tools); every other provider passes its raw link\n\t// through as a reference the agent reads via that provider's own MCP.\n\tlet figma: FigmaUrlParts | null = null;\n\tconst designRef = designUrl;\n\tif (provider === \"figma\") {\n\t\tconst spinner = ora(\"Parsing Figma URL...\").start();\n\t\ttry {\n\t\t\tfigma = parseFigmaUrl(designUrl);\n\t\t\tspinner.succeed(\n\t\t\t\t`Parsed Figma URL ${chalk.dim(figma.nodeId ? `node ${figma.nodeId}` : `file ${figma.fileKey}`)}`,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tspinner.fail((err as Error).message);\n\t\t\tprocess.exitCode = 1;\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\tlogger.info(` ${ui.icon.pass} ${providerName} design ${chalk.dim(designRef)}`);\n\t}\n\n\t// Determine block name. Non-Figma providers can't infer one from a file name,\n\t// so a name is required there.\n\tconst blockName = options.name || (figma ? inferBlockName(figma.fileName) : \"\");\n\tif (!kebabCaseRegex.test(blockName)) {\n\t\tlogger.error(\n\t\t\t`Invalid block name \"${blockName}\". Use --name with a kebab-case name (e.g., --name hero-banner).`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Build prompt (reads project design tokens from styles/styles.css)\n\tconst promptSpinner = ora(\"Reading design tokens & building prompt...\").start();\n\tconst prompt = await buildPrompt({\n\t\tprovider,\n\t\tfigma,\n\t\tdesignRef,\n\t\tblockName,\n\t\tprojectRoot,\n\t\twithUeModel: options.ueModel !== false,\n\t\tcontentSource: options.source ?? \"document\",\n\t\tcfHint: options.cfHint,\n\t\tscreenshot: options.screenshot !== false,\n\t});\n\tconst promptFile = await savePromptToFile(prompt, projectRoot);\n\tconst hasTokens = existsSync(path.join(projectRoot, \"styles\", \"styles.css\"));\n\tpromptSpinner.succeed(\n\t\thasTokens\n\t\t\t? `Loaded design tokens ${chalk.dim(\"styles/styles.css\")}`\n\t\t\t: `Built prompt ${chalk.dim(\"no project tokens found\")}`,\n\t);\n\tlogger.info(chalk.dim(` prompt → ${promptFile}`));\n\n\t// Dry run — stop here\n\tif (options.dryRun) {\n\t\tlogger.info(\"\");\n\t\tlogger.info(chalk.yellow(\"Dry run mode — prompt generated but agent not invoked.\"));\n\t\tlogger.info(`Prompt file: ${chalk.cyan(promptFile)}`);\n\t\tlogger.info(`Block name: ${chalk.cyan(blockName)}`);\n\t\tlogger.info(`Prompt version: ${PROMPT_VERSION}`);\n\t\tlogger.info(\"\");\n\t\tlogger.info(\"Preview:\");\n\t\tlogger.info(chalk.dim(\"─\".repeat(60)));\n\t\tconsole.log(prompt);\n\t\treturn;\n\t}\n\n\t// Detect agent\n\tconst config = await loadConfig(projectRoot);\n\tconst preferredAgent = (options.agent as AgentType) || config.agent;\n\n\tif (options.agent === \"none\") {\n\t\tlogger.info(\"Agent skipped (--agent none). Use the prompt file manually:\");\n\t\tlogger.info(` ${chalk.cyan(promptFile)}`);\n\t\treturn;\n\t}\n\n\tconst agentSpinner = ora(\"Detecting AI agent...\").start();\n\tconst agent = await detectAgent(preferredAgent);\n\n\tif (!agent) {\n\t\tagentSpinner.fail(\"No AI agent found (claude, cursor, or codex).\");\n\t\tlogger.info(`Install Claude Code: ${chalk.cyan(\"npm install -g @anthropic-ai/claude-code\")}`);\n\t\tlogger.info(`Or use the prompt file manually: ${chalk.cyan(promptFile)}`);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tagentSpinner.succeed(`Agent ready ${chalk.cyan(agent.type)} ${chalk.dim(agent.path)}`);\n\n\tif (provider === \"figma\" && !agent.hasFigmaMcp) {\n\t\tlogger.warn(`Figma MCP may not be configured for ${agent.type}.`);\n\t\tlogger.info(`Run ${chalk.cyan(\"eds figma setup\")} to configure it.`);\n\t}\n\n\t// Confirm with user unless --yes\n\tif (!options.yes) {\n\t\tconst { confirm } = await import(\"@inquirer/prompts\");\n\t\tconst proceed = await confirm({\n\t\t\tmessage: `Run ${agent.type} with the generated prompt?`,\n\t\t\tdefault: true,\n\t\t});\n\t\tif (!proceed) {\n\t\t\tlogger.info(`Prompt saved to: ${chalk.cyan(promptFile)}`);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Hand off to the agent (mirrors the flow shown on the landing page).\n\tlogger.info(\n\t\t` ${chalk.dim(\"→\")} Handing off to ${chalk.cyan(agent.type)} ${chalk.dim(`via ${providerName} MCP`)}`,\n\t);\n\tif (provider === \"figma\") {\n\t\tlogger.info(chalk.dim(\" get_design_context · get_variable_defs · get_screenshot\"));\n\t}\n\n\t// Invoke agent\n\tconst success = await invokeAgent(agent, promptFile, projectRoot);\n\n\tif (!success) {\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Verify what the agent actually produced before declaring success.\n\tconst blockDir = path.join(projectRoot, \"blocks\", blockName);\n\tconst ok = await verifyGeneratedBlock(blockDir, blockName, options.ueModel !== false);\n\n\t// Post-process: save .eds-meta.json\n\tif (existsSync(blockDir)) {\n\t\tconst meta = {\n\t\t\tprovider,\n\t\t\tdesignRef,\n\t\t\tfigmaFileKey: figma?.fileKey ?? null,\n\t\t\tfigmaNodeId: figma?.nodeId ?? null,\n\t\t\tlastSyncedAt: new Date().toISOString(),\n\t\t\tpromptVersion: PROMPT_VERSION,\n\t\t\tagentUsed: agent.type,\n\t\t};\n\t\tawait writeFile(path.join(blockDir, \".eds-meta.json\"), `${JSON.stringify(meta, null, 2)}\\n`);\n\t}\n\n\tif (!ok) {\n\t\tlogger.warn(\n\t\t\t`Block \"${blockName}\" generated with issues — review the output above before publishing.`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\tlogger.success(`Block \"${blockName}\" generation complete.`);\n\n\t// Auto-start the live preview. If one is already running, leave it — its\n\t// file watcher refreshes the browser when the generated files change.\n\tif (options.serve !== false) {\n\t\tif (await previewRunning()) {\n\t\t\tlogger.info(\n\t\t\t\tchalk.dim(\n\t\t\t\t\t\" A preview server is already running at http://127.0.0.1:8777 — your change will refresh there.\",\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tlogger.info(\"\");\n\t\t\tconst { previewBlock } = await import(\"./preview.js\");\n\t\t\tawait previewBlock(blockName, {});\n\t\t}\n\t} else {\n\t\tlogger.info(` ${chalk.dim(\"→\")} Next: ${chalk.cyan(`eds block preview ${blockName}`)}`);\n\t}\n}\n\n/**\n * Sanity-check the files the agent wrote: core files present, JS exports a\n * decorator, CSS is scoped to the block, no stray debug logging. Prints an\n * aligned report and returns false if any hard check fails.\n */\nasync function verifyGeneratedBlock(\n\tblockDir: string,\n\tblockName: string,\n\twithUeModel: boolean,\n): Promise<boolean> {\n\tconst checks: { status: ui.Status; name: string; message: string }[] = [];\n\tconst jsPath = path.join(blockDir, `${blockName}.js`);\n\tconst cssPath = path.join(blockDir, `${blockName}.css`);\n\n\tconst hasJs = existsSync(jsPath);\n\tconst hasCss = existsSync(cssPath);\n\tchecks.push({\n\t\tstatus: hasJs ? \"pass\" : \"fail\",\n\t\tname: `${blockName}.js`,\n\t\tmessage: hasJs ? \"created\" : \"missing — agent did not write the JS file\",\n\t});\n\tchecks.push({\n\t\tstatus: hasCss ? \"pass\" : \"fail\",\n\t\tname: `${blockName}.css`,\n\t\tmessage: hasCss ? \"created\" : \"missing — agent did not write the CSS file\",\n\t});\n\n\tif (hasJs) {\n\t\tconst js = await readFile(jsPath, \"utf-8\");\n\t\tchecks.push({\n\t\t\tstatus: /export\\s+default/.test(js) ? \"pass\" : \"fail\",\n\t\t\tname: \"decorate export\",\n\t\t\tmessage: /export\\s+default/.test(js) ? \"found\" : \"no default export — block won't load\",\n\t\t});\n\t\tif (js.includes(\"console.log\")) {\n\t\t\tchecks.push({\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tname: \"no console.log\",\n\t\t\t\tmessage: \"found console.log — remove before production\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (hasCss) {\n\t\tconst css = await readFile(cssPath, \"utf-8\");\n\t\tchecks.push({\n\t\t\tstatus: css.includes(`.${blockName}`) ? \"pass\" : \"warn\",\n\t\t\tname: \"scoped CSS\",\n\t\t\tmessage: css.includes(`.${blockName}`)\n\t\t\t\t? `scoped to .${blockName}`\n\t\t\t\t: `no .${blockName} selector — styles may leak`,\n\t\t});\n\t}\n\n\tif (withUeModel) {\n\t\tconst hasPerBlock = existsSync(path.join(blockDir, `_${blockName}.json`));\n\t\t// Accept an aggregated model file that references this block, too.\n\t\tconst modelsFile = path.join(blockDir, \"..\", \"..\", \"component-models.json\");\n\t\tlet hasAggregated = false;\n\t\tif (!hasPerBlock && existsSync(modelsFile)) {\n\t\t\ttry {\n\t\t\t\thasAggregated = (await readFile(modelsFile, \"utf-8\")).includes(`\"${blockName}\"`);\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\t\tconst hasModel = hasPerBlock || hasAggregated;\n\t\tchecks.push({\n\t\t\tstatus: hasModel ? \"pass\" : \"warn\",\n\t\t\tname: \"Universal Editor model\",\n\t\t\tmessage: hasModel\n\t\t\t\t? hasPerBlock\n\t\t\t\t\t? `_${blockName}.json created`\n\t\t\t\t\t: \"added to component-models.json\"\n\t\t\t\t: `missing — no _${blockName}.json (run with default UE generation, or --no-ue-model to skip)`,\n\t\t});\n\n\t\t// Multifield guardrail: a repeatable (container) model whose decorate()\n\t\t// doesn't iterate block.children will only ever render one item.\n\t\tif (hasPerBlock && hasJs) {\n\t\t\ttry {\n\t\t\t\tconst modelRaw = await readFile(path.join(blockDir, `_${blockName}.json`), \"utf-8\");\n\t\t\t\tconst js = await readFile(jsPath, \"utf-8\");\n\t\t\t\tconst isRepeatable =\n\t\t\t\t\t/\"resourceType\"\\s*:\\s*\"[^\"]*\\/item\"/.test(modelRaw) ||\n\t\t\t\t\t/\"filter\"\\s*:/.test(modelRaw) ||\n\t\t\t\t\t/\"multi\"\\s*:\\s*true/.test(modelRaw);\n\t\t\t\tconst iterates =\n\t\t\t\t\t/\\.children/.test(js) || /\\bfor\\s*\\(/.test(js) || /\\.forEach\\s*\\(/.test(js);\n\t\t\t\tif (isRepeatable) {\n\t\t\t\t\tchecks.push({\n\t\t\t\t\t\tstatus: iterates ? \"pass\" : \"warn\",\n\t\t\t\t\t\tname: \"multifield wired\",\n\t\t\t\t\t\tmessage: iterates\n\t\t\t\t\t\t\t? \"decorate() iterates items\"\n\t\t\t\t\t\t\t: \"repeatable model but decorate() never iterates block.children — only one item will render\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\t}\n\n\tlogger.info(ui.heading(\"Verification\"));\n\tconst nameWidth = ui.columnWidth(checks.map((c) => c.name));\n\tfor (const c of checks) {\n\t\tlogger.info(ui.statusLine(c.status, c.name, c.message, nameWidth));\n\t}\n\tlogger.info(\"\");\n\n\treturn !checks.some((c) => c.status === \"fail\");\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../../lib/logger.js\";\nimport { findProjectRoot } from \"../../lib/project.js\";\nimport * as ui from \"../../lib/ui.js\";\n\ninterface BlockInfo {\n\tname: string;\n\thasJs: boolean;\n\thasCss: boolean;\n\thasUeModel: boolean;\n\tfigmaSource?: {\n\t\tfileKey: string;\n\t\tnodeId?: string;\n\t\tlastSyncedAt: string;\n\t};\n}\n\ninterface ListOptions {\n\tjson?: boolean;\n}\n\nexport async function listBlocks(options: ListOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst blocksDir = path.join(projectRoot, \"blocks\");\n\tif (!existsSync(blocksDir)) {\n\t\tlogger.info(\"No blocks/ directory found.\");\n\t\treturn;\n\t}\n\n\tconst entries = await readdir(blocksDir, { withFileTypes: true });\n\tconst blocks: BlockInfo[] = [];\n\n\tfor (const entry of entries) {\n\t\tif (!entry.isDirectory()) continue;\n\t\tconst name = entry.name;\n\t\tconst blockDir = path.join(blocksDir, name);\n\n\t\tconst info: BlockInfo = {\n\t\t\tname,\n\t\t\thasJs: existsSync(path.join(blockDir, `${name}.js`)),\n\t\t\thasCss: existsSync(path.join(blockDir, `${name}.css`)),\n\t\t\thasUeModel: existsSync(path.join(blockDir, `_${name}.json`)),\n\t\t};\n\n\t\tconst metaFile = path.join(blockDir, \".eds-meta.json\");\n\t\tif (existsSync(metaFile)) {\n\t\t\ttry {\n\t\t\t\tconst meta = JSON.parse(await readFile(metaFile, \"utf-8\"));\n\t\t\t\tinfo.figmaSource = {\n\t\t\t\t\tfileKey: meta.figmaFileKey,\n\t\t\t\t\tnodeId: meta.figmaNodeId,\n\t\t\t\t\tlastSyncedAt: meta.lastSyncedAt,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\t// skip invalid meta\n\t\t\t}\n\t\t}\n\n\t\tblocks.push(info);\n\t}\n\n\tif (options.json) {\n\t\tconsole.log(JSON.stringify(blocks, null, 2));\n\t\treturn;\n\t}\n\n\tif (blocks.length === 0) {\n\t\tlogger.info(\"No blocks found.\");\n\t\treturn;\n\t}\n\n\tlogger.info(ui.heading(\"Blocks\", `${blocks.length} in project`));\n\n\tconst nameWidth = ui.columnWidth(blocks.map((b) => b.name));\n\tfor (const b of blocks) {\n\t\tconst badges = [\n\t\t\tb.hasJs ? ui.brand.ok(\"js\") : chalk.dim.strikethrough(\"js\"),\n\t\t\tb.hasCss ? ui.brand.ok(\"css\") : chalk.dim.strikethrough(\"css\"),\n\t\t];\n\t\tif (b.hasUeModel) badges.push(ui.brand.blue(\"ue-model\"));\n\t\tif (b.figmaSource) badges.push(`${ui.icon.figma} ${ui.brand.dotPurple(\"figma\")}`);\n\n\t\tconst name = ui.padEndVisible(chalk.bold(b.name), nameWidth);\n\t\tlogger.info(` ${name} ${chalk.dim(\"[\")}${badges.join(\" \")}${chalk.dim(\"]\")}`);\n\n\t\tif (b.figmaSource) {\n\t\t\tconst synced = new Date(b.figmaSource.lastSyncedAt).toLocaleDateString();\n\t\t\tlogger.info(\n\t\t\t\t` ${\" \".repeat(nameWidth)} ${ui.icon.arrow} ${chalk.dim(\n\t\t\t\t\t`figma:${b.figmaSource.fileKey} · synced ${synced}`,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tlogger.info(\"\");\n}\n","/**\n * Third-party integration templates for EDS. Everything here is appended to\n * `scripts/delayed.js` so it loads in the delayed phase (after LCP, non-blocking)\n * per EDS performance best practices. Heavy widgets (chat) use the facade\n * pattern — a lightweight trigger that loads the real script on first interaction.\n */\n\nexport interface IntegrationField {\n\tname: string;\n\tmessage: string;\n\tplaceholder?: string;\n}\n\nexport interface Integration {\n\tid: string;\n\tname: string;\n\tfields: IntegrationField[];\n\tcode: (v: Record<string, string>) => string;\n}\n\nexport const INTEGRATIONS: Integration[] = [\n\t{\n\t\tid: \"gtm\",\n\t\tname: \"Google Tag Manager\",\n\t\tfields: [{ name: \"id\", message: \"GTM container ID\", placeholder: \"GTM-XXXXXXX\" }],\n\t\tcode: (v) => `// Google Tag Manager (${v.id}) — delayed phase, after LCP.\n(function (w, d, s, l, i) {\n w[l] = w[l] || [];\n w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });\n const f = d.getElementsByTagName(s)[0];\n const j = d.createElement(s);\n j.async = true;\n j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i;\n f.parentNode.insertBefore(j, f);\n})(window, document, 'script', 'dataLayer', '${v.id}');`,\n\t},\n\t{\n\t\tid: \"ga4\",\n\t\tname: \"Google Analytics 4\",\n\t\tfields: [{ name: \"id\", message: \"Measurement ID\", placeholder: \"G-XXXXXXXXXX\" }],\n\t\tcode: (v) => `// Google Analytics 4 (${v.id}) — delayed phase.\nconst gaScript = document.createElement('script');\ngaScript.async = true;\ngaScript.src = 'https://www.googletagmanager.com/gtag/js?id=${v.id}';\ndocument.head.appendChild(gaScript);\nwindow.dataLayer = window.dataLayer || [];\nfunction gtag() { window.dataLayer.push(arguments); }\ngtag('js', new Date());\ngtag('config', '${v.id}');`,\n\t},\n\t{\n\t\tid: \"chat\",\n\t\tname: \"Chat widget (facade)\",\n\t\tfields: [\n\t\t\t{ name: \"label\", message: \"Button label\", placeholder: \"Chat with us\" },\n\t\t\t{ name: \"src\", message: \"Chat widget script URL\" },\n\t\t],\n\t\tcode: (v) => `// Chat widget — facade pattern: load the heavy script only on first interaction.\nconst chatBtn = document.createElement('button');\nchatBtn.type = 'button';\nchatBtn.className = 'chat-facade';\nchatBtn.textContent = ${JSON.stringify(v.label || \"Chat\")};\nchatBtn.addEventListener('click', () => {\n const s = document.createElement('script');\n s.async = true;\n s.src = ${JSON.stringify(v.src || \"\")};\n document.body.appendChild(s);\n chatBtn.remove();\n}, { once: true });\ndocument.body.appendChild(chatBtn);`,\n\t},\n\t{\n\t\tid: \"cookiebot\",\n\t\tname: \"Cookie consent (Cookiebot)\",\n\t\tfields: [{ name: \"id\", message: \"Cookiebot domain group ID (CBID)\" }],\n\t\tcode: (\n\t\t\tv,\n\t\t) => `// Cookiebot consent — load early in delayed; configure GTM consent mode to respect it.\nconst cb = document.createElement('script');\ncb.id = 'Cookiebot';\ncb.src = 'https://consent.cookiebot.com/uc.js';\ncb.setAttribute('data-cbid', '${v.id}');\ncb.async = true;\ndocument.head.appendChild(cb);`,\n\t},\n\t{\n\t\tid: \"custom\",\n\t\tname: \"Custom third-party script\",\n\t\tfields: [{ name: \"url\", message: \"Script URL\" }],\n\t\tcode: (v) => `// Custom third-party script — delayed phase.\nconst s = document.createElement('script');\ns.async = true;\ns.src = ${JSON.stringify(v.url || \"\")};\ndocument.head.appendChild(s);`,\n\t},\n];\n\nexport function integrationById(id: string): Integration | undefined {\n\treturn INTEGRATIONS.find((i) => i.id === id);\n}\n\n/** Wrap generated code in a marked block for `scripts/delayed.js`. */\nexport function wrapBlock(name: string, code: string): string {\n\treturn `\\n// ── ${name} (eds integrate) ──────────────────────────────\\n{\\n${code\n\t\t.split(\"\\n\")\n\t\t.map((l) => (l ? ` ${l}` : l))\n\t\t.join(\"\\n\")}\\n}\\n`;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { INTEGRATIONS, integrationById, wrapBlock } from \"../lib/integrations.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\nconst DELAYED_HEADER = `// delayed.js — third-party / non-critical scripts.\n// Loaded in the EDS delayed phase (after LCP), so nothing here blocks the page.\n`;\n\n/**\n * `eds integrate [type]` — interactively add a third-party service (GTM, GA4,\n * chat facade, consent, custom) to scripts/delayed.js, the EDS-correct place\n * for non-critical third-party code.\n */\nexport async function integrate(type: string | undefined): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Integrate — third-party service\"));\n\n\tconst { select, input } = await import(\"@inquirer/prompts\");\n\n\tconst chosenId =\n\t\ttype ||\n\t\t(await select({\n\t\t\tmessage: \"Which service do you want to add?\",\n\t\t\tchoices: INTEGRATIONS.map((i) => ({ name: i.name, value: i.id })),\n\t\t}));\n\n\tconst integration = integrationById(chosenId);\n\tif (!integration) {\n\t\tlogger.error(\n\t\t\t`Unknown integration \"${chosenId}\". Options: ${INTEGRATIONS.map((i) => i.id).join(\", \")}`,\n\t\t);\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst values: Record<string, string> = {};\n\tfor (const f of integration.fields) {\n\t\tconst answer = await input({ message: ` ${f.message}`, default: f.placeholder });\n\t\tvalues[f.name] = answer.trim();\n\t}\n\n\tconst block = wrapBlock(integration.name, integration.code(values));\n\n\tconst delayedPath = path.join(projectRoot, \"scripts\", \"delayed.js\");\n\tawait mkdir(path.dirname(delayedPath), { recursive: true });\n\tconst existing = existsSync(delayedPath) ? await readFile(delayedPath, \"utf-8\") : DELAYED_HEADER;\n\tawait writeFile(delayedPath, `${existing.replace(/\\s*$/, \"\")}\\n${block}`);\n\n\tlogger.info(ui.heading(\"Added\"));\n\tlogger.info(ui.accentLine(integration.name, \"→ scripts/delayed.js\"));\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tchalk.dim(\" Loads after LCP (delayed phase) — zero impact on your Core Web Vitals.\"),\n\t);\n\tif (integration.id === \"gtm\" || integration.id === \"ga4\") {\n\t\tlogger.info(\n\t\t\tchalk.dim(\" Tip: gate analytics behind user consent (add the Cookiebot integration).\"),\n\t\t);\n\t}\n\tif (integration.id === \"chat\") {\n\t\tlogger.info(\n\t\t\tchalk.dim(\" The widget loads only when the visitor clicks the button (facade pattern).\"),\n\t\t);\n\t}\n\tlogger.info(\"\");\n\tlogger.info(ui.box([\"Integration added\"]));\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport { detectAgent, detectAllAgents } from \"../../lib/agents/detect.js\";\nimport { globalConfigDir, globalConfigPath, loadConfig } from \"../../lib/config.js\";\nimport { logger } from \"../../lib/logger.js\";\nimport * as ui from \"../../lib/ui.js\";\n\nexport async function figmaSetup(): Promise<void> {\n\tconst { select, confirm } = await import(\"@inquirer/prompts\");\n\n\tlogger.logoOnce(ui.logo());\n\tlogger.info(ui.heading(\"Figma MCP Setup Wizard\"));\n\n\t// Step 1: Detect agents\n\tlogger.info(\"Detecting installed AI agents...\");\n\tconst agents = await detectAllAgents();\n\n\tlet selectedAgent: string;\n\n\tif (agents.length === 0) {\n\t\tlogger.warn(\"No AI agents found (claude, cursor, codex).\");\n\t\tlogger.info(`Install Claude Code: ${chalk.cyan(\"npm install -g @anthropic-ai/claude-code\")}`);\n\t\tselectedAgent = \"none\";\n\t} else {\n\t\tlogger.success(`Found: ${agents.map((a) => chalk.cyan(a.type)).join(\", \")}`);\n\n\t\tselectedAgent = await select({\n\t\t\tmessage: \"Which agent do you want to use with eds-cli?\",\n\t\t\tchoices: [\n\t\t\t\t...agents.map((a) => ({\n\t\t\t\t\tname: `${a.type}${a.hasFigmaMcp ? chalk.green(\" (Figma MCP detected)\") : \"\"}`,\n\t\t\t\t\tvalue: a.type,\n\t\t\t\t})),\n\t\t\t\t{ name: \"None (manual mode)\", value: \"none\" },\n\t\t\t],\n\t\t});\n\t}\n\n\t// Step 2: Check Figma MCP\n\tif (selectedAgent !== \"none\") {\n\t\tconst agent = agents.find((a) => a.type === selectedAgent);\n\t\tif (agent && !agent.hasFigmaMcp) {\n\t\t\tlogger.warn(`Figma MCP is not configured for ${selectedAgent}.\\n`);\n\t\t\tlogger.info(\"Install it with one of these methods:\\n\");\n\n\t\t\tswitch (selectedAgent) {\n\t\t\t\tcase \"claude\":\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t` ${chalk.cyan(\"claude mcp add --transport sse figma-sse https://mcp.figma.com/sse\")}`,\n\t\t\t\t\t);\n\t\t\t\t\tlogger.info(\" or for Figma Desktop app:\");\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t` ${chalk.cyan(\"claude mcp add --transport http figma-desktop http://127.0.0.1:3845/mcp\")}`,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"cursor\":\n\t\t\t\t\tlogger.info(` Add to ${chalk.cyan(\"~/.cursor/mcp.json\")}:`);\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\tchalk.dim(\n\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmcpServers: {\n\t\t\t\t\t\t\t\t\t\tfigma: { url: \"https://mcp.figma.com/sse\" },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"codex\":\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\" See Figma MCP docs: https://help.figma.com/hc/en-us/articles/32132100833559\",\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlogger.info(\"\");\n\t\t} else if (agent?.hasFigmaMcp) {\n\t\t\tlogger.success(`Figma MCP is already configured for ${selectedAgent}!`);\n\t\t}\n\t}\n\n\t// Step 3: Figma seat info\n\tlogger.info(\n\t\tchalk.dim(\n\t\t\t\"\\nNote: Figma MCP requires a Figma seat (Dev or Full on paid plans for desktop server).\",\n\t\t),\n\t);\n\n\t// Step 4: Save config\n\tconst shouldSave = await confirm({\n\t\tmessage: \"Save preferences to ~/.eds/config.json?\",\n\t\tdefault: true,\n\t});\n\n\tif (shouldSave) {\n\t\tconst configDir = globalConfigDir();\n\t\tif (!existsSync(configDir)) {\n\t\t\tawait mkdir(configDir, { recursive: true });\n\t\t}\n\n\t\tconst config: Record<string, unknown> = {};\n\t\tif (selectedAgent !== \"none\") {\n\t\t\tconfig.agent = selectedAgent;\n\t\t}\n\n\t\tawait writeFile(globalConfigPath(), `${JSON.stringify(config, null, 2)}\\n`, {\n\t\t\tmode: 0o600,\n\t\t});\n\t\tlogger.success(`Config saved to ${chalk.cyan(globalConfigPath())}`);\n\t}\n\n\tlogger.info(chalk.bold(\"\\nSetup complete!\"));\n\tif (selectedAgent !== \"none\") {\n\t\tlogger.info(`Try: ${chalk.cyan('eds block from-design \"<figma-url>\" --dry-run')}`);\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { globalConfigExists } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { detectProject, findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\nimport type { DoctorCheckResult } from \"../types/index.js\";\n\ninterface DoctorOptions {\n\tjson?: boolean;\n}\n\nexport async function doctor(options: DoctorOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tconst project = detectProject(projectRoot);\n\tif (!options.json) {\n\t\tlogger.logoOnce(ui.logo(\"Doctor\"));\n\t\tlogger.info(ui.heading(\"Doctor\", projectRoot));\n\t}\n\n\tconst results: DoctorCheckResult[] = [];\n\n\t// Check fstab.yaml. Not a hard failure: Universal Editor / crosswalk and\n\t// Document Authoring projects legitimately have no fstab, so missing is a\n\t// warning, not a fail (which would otherwise break CI for those projects).\n\tresults.push({\n\t\tname: \"fstab.yaml exists\",\n\t\tstatus: project.hasFstab ? \"pass\" : \"warn\",\n\t\tmessage: project.hasFstab\n\t\t\t? \"Found\"\n\t\t\t: \"Missing - fine for Universal Editor / DA; required for document-mounted setups\",\n\t});\n\n\t// Check fstab.yaml is valid YAML\n\tif (project.hasFstab) {\n\t\ttry {\n\t\t\tconst content = await readFile(path.join(projectRoot, \"fstab.yaml\"), \"utf-8\");\n\t\t\tparseYaml(content);\n\t\t\tresults.push({ name: \"fstab.yaml valid YAML\", status: \"pass\", message: \"Valid\" });\n\t\t} catch {\n\t\t\tresults.push({\n\t\t\t\tname: \"fstab.yaml valid YAML\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"Invalid YAML syntax\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check head.html\n\tresults.push({\n\t\tname: \"head.html exists\",\n\t\tstatus: project.hasHeadHtml ? \"pass\" : \"warn\",\n\t\tmessage: project.hasHeadHtml ? \"Found\" : \"Missing - recommended for metadata/scripts\",\n\t});\n\n\t// Check blocks directory\n\tresults.push({\n\t\tname: \"blocks/ directory\",\n\t\tstatus: project.hasBlocks ? \"pass\" : \"warn\",\n\t\tmessage: project.hasBlocks ? \"Found\" : \"Missing - no blocks yet\",\n\t});\n\n\t// Check each block has a JS file\n\tif (project.hasBlocks) {\n\t\tconst blocksDir = path.join(projectRoot, \"blocks\");\n\t\tconst entries = await readdir(blocksDir, { withFileTypes: true });\n\n\t\t// An aggregated UE model file (if the project uses one) can hold models\n\t\t// for many blocks - read it once so per-block checks can look inside.\n\t\tlet aggregatedModels = \"\";\n\t\tconst aggregatedPath = path.join(projectRoot, \"component-models.json\");\n\t\tif (existsSync(aggregatedPath)) {\n\t\t\ttry {\n\t\t\t\taggregatedModels = await readFile(aggregatedPath, \"utf-8\");\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\n\t\tfor (const entry of entries) {\n\t\t\tif (!entry.isDirectory()) continue;\n\t\t\tconst blockName = entry.name;\n\t\t\tconst jsFile = path.join(blocksDir, blockName, `${blockName}.js`);\n\t\t\tconst hasJs = existsSync(jsFile);\n\t\t\tresults.push({\n\t\t\t\tname: `blocks/${blockName} has JS`,\n\t\t\t\tstatus: hasJs ? \"pass\" : \"warn\",\n\t\t\t\tmessage: hasJs ? \"Found\" : `Missing ${blockName}.js`,\n\t\t\t});\n\n\t\t\t// Check for console.log in block JS\n\t\t\tif (hasJs) {\n\t\t\t\tconst jsContent = await readFile(jsFile, \"utf-8\");\n\t\t\t\tif (jsContent.includes(\"console.log\")) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tname: `blocks/${blockName} no console.log`,\n\t\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\t\tmessage: \"Found console.log - remove before production\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for a Universal Editor model (per-block or aggregated).\n\t\t\tconst hasPerBlockModel = existsSync(path.join(blocksDir, blockName, `_${blockName}.json`));\n\t\t\tconst hasAggregatedModel = aggregatedModels.includes(`\"${blockName}\"`);\n\t\t\tresults.push({\n\t\t\t\tname: `blocks/${blockName} UE model`,\n\t\t\t\tstatus: hasPerBlockModel || hasAggregatedModel ? \"pass\" : \"warn\",\n\t\t\t\tmessage:\n\t\t\t\t\thasPerBlockModel || hasAggregatedModel\n\t\t\t\t\t\t? hasPerBlockModel\n\t\t\t\t\t\t\t? `_${blockName}.json`\n\t\t\t\t\t\t\t: \"in component-models.json\"\n\t\t\t\t\t\t: \"no Universal Editor model - authors can't edit this block in UE\",\n\t\t\t});\n\n\t\t\t// Check .eds-meta.json freshness\n\t\t\tconst metaFile = path.join(blocksDir, blockName, \".eds-meta.json\");\n\t\t\tif (existsSync(metaFile)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst meta = JSON.parse(await readFile(metaFile, \"utf-8\"));\n\t\t\t\t\tconst syncDate = new Date(meta.lastSyncedAt);\n\t\t\t\t\tconst daysSinceSync = Math.floor(\n\t\t\t\t\t\t(Date.now() - syncDate.getTime()) / (1000 * 60 * 60 * 24),\n\t\t\t\t\t);\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tname: `blocks/${blockName} Figma sync`,\n\t\t\t\t\t\tstatus: daysSinceSync > 30 ? \"warn\" : \"pass\",\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\tdaysSinceSync > 30\n\t\t\t\t\t\t\t\t? `Last synced ${daysSinceSync} days ago - design may have changed`\n\t\t\t\t\t\t\t\t: `Synced ${daysSinceSync} days ago`,\n\t\t\t\t\t});\n\t\t\t\t} catch {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tname: `blocks/${blockName} .eds-meta.json`,\n\t\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\t\tmessage: \"Invalid metadata file\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check helix-query.yaml if exists\n\tconst queryFile = path.join(projectRoot, \"helix-query.yaml\");\n\tif (existsSync(queryFile)) {\n\t\ttry {\n\t\t\tconst content = await readFile(queryFile, \"utf-8\");\n\t\t\tparseYaml(content);\n\t\t\tresults.push({ name: \"helix-query.yaml valid\", status: \"pass\", message: \"Valid YAML\" });\n\t\t} catch {\n\t\t\tresults.push({\n\t\t\t\tname: \"helix-query.yaml valid\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"Invalid YAML syntax\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check eds config\n\tresults.push({\n\t\tname: \"~/.eds/config.json\",\n\t\tstatus: globalConfigExists() ? \"pass\" : \"warn\",\n\t\tmessage: globalConfigExists() ? \"Found\" : 'Missing - run \"eds figma setup\" to configure',\n\t});\n\n\tconst fails0 = results.filter((r) => r.status === \"fail\");\n\tconst warns0 = results.filter((r) => r.status === \"warn\");\n\n\tif (options.json) {\n\t\tconst summary = {\n\t\t\tpass: results.filter((r) => r.status === \"pass\").length,\n\t\t\twarn: warns0.length,\n\t\t\tfail: fails0.length,\n\t\t};\n\t\tconsole.log(JSON.stringify({ projectRoot, results, summary }, null, 2));\n\t\tif (fails0.length > 0) process.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// Print results - align names into a shared column.\n\tconst nameWidth = ui.columnWidth(results.map((r) => r.name));\n\tfor (const r of results) {\n\t\tlogger.info(ui.statusLine(r.status, r.name, r.message, nameWidth));\n\t}\n\n\tconst fails = results.filter((r) => r.status === \"fail\");\n\tconst warns = results.filter((r) => r.status === \"warn\");\n\tconst passes = results.filter((r) => r.status === \"pass\");\n\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tui.box([ui.summary({ pass: passes.length, warn: warns.length, fail: fails.length })]),\n\t);\n\tif (fails.length > 0) process.exitCode = 1;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\ninterface AuditResult {\n\trule: string;\n\tstatus: \"pass\" | \"warn\" | \"fail\" | \"info\";\n\tmessage: string;\n\tfile?: string;\n\tline?: number;\n}\n\nconst LCP_BUDGET_KB = 100;\n\ninterface AuditLoadingOptions {\n\tjson?: boolean;\n}\n\nexport async function auditLoading(options: AuditLoadingOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tif (!options.json) {\n\t\tlogger.logoOnce(ui.logo(\"Loading Audit\"));\n\t\tlogger.info(ui.heading(\"Loading Order Audit\", projectRoot));\n\t}\n\n\tconst results: AuditResult[] = [];\n\n\tawait checkHeadHtml(projectRoot, results);\n\tawait checkScriptsJs(projectRoot, results);\n\tawait checkStylesCss(projectRoot, results);\n\tawait checkDelayedJs(projectRoot, results);\n\tawait checkBlocks(projectRoot, results);\n\tawait checkAemJs(projectRoot, results);\n\n\tif (options.json) {\n\t\tconst summary = {\n\t\t\tpass: results.filter((r) => r.status === \"pass\").length,\n\t\t\twarn: results.filter((r) => r.status === \"warn\").length,\n\t\t\tfail: results.filter((r) => r.status === \"fail\").length,\n\t\t\tinfo: results.filter((r) => r.status === \"info\").length,\n\t\t};\n\t\tconsole.log(JSON.stringify({ projectRoot, results, summary }, null, 2));\n\t\tif (summary.fail > 0) process.exitCode = 1;\n\t\treturn;\n\t}\n\n\tprintResults(results);\n}\n\n// ── head.html ──────────────────────────────────────────────\n\nasync function checkHeadHtml(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"head.html\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"head.html exists\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Missing head.html\",\n\t\t});\n\t\treturn;\n\t}\n\n\tconst content = await readFile(filePath, \"utf-8\");\n\tconst lines = content.split(\"\\n\");\n\n\t// Check for render-blocking scripts (not type=\"module\")\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tif (\n\t\t\t/<script\\b/i.test(line) &&\n\t\t\t!/type\\s*=\\s*[\"']module[\"']/i.test(line) &&\n\t\t\t!/<\\/script>/.test(line)\n\t\t) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No render-blocking scripts in head.html\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: 'Script without type=\"module\" blocks rendering',\n\t\t\t\tfile: \"head.html\",\n\t\t\t\tline: i + 1,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for extra stylesheets beyond styles.css\n\tconst stylesheetMatches = content.match(/<link[^>]+rel=[\"']stylesheet[\"'][^>]*>/gi) || [];\n\tconst extraStylesheets = stylesheetMatches.filter(\n\t\t(tag) => !tag.includes(\"styles/styles.css\") && !tag.includes(\"styles.css\"),\n\t);\n\tif (extraStylesheets.length > 0) {\n\t\tresults.push({\n\t\t\trule: \"No extra stylesheets in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: `${extraStylesheets.length} extra stylesheet(s) — each competes with LCP budget`,\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\t// Check for preload/preconnect (Adobe says these hurt EDS performance)\n\tif (/<link[^>]+rel=[\"'](preload|preconnect)[\"']/i.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No preload/preconnect in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"preload/preconnect can hurt EDS LCP — resources compete with the 100KB budget\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\t// Check for inline scripts\n\tif (/<script\\b[^>]*>[\\s\\S]*?[^\\s<][\\s\\S]*?<\\/script>/i.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No inline scripts in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Inline scripts block rendering — move to delayed.js\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\t// Check for third-party origins in script/link tags\n\tconst thirdPartyPattern =\n\t\t/(?:src|href)=[\"'](https?:\\/\\/(?!(?:localhost|127\\.0\\.0\\.1))[^\"']+)[\"']/gi;\n\tfor (const match of content.matchAll(thirdPartyPattern)) {\n\t\tconst url = match[1];\n\t\t// Allow common CDN for fonts metadata but warn about scripts\n\t\tif (!url.includes(\"fonts.googleapis.com\")) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No third-party resources in head.html\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `Third-party resource: ${url} — move to delayed.js`,\n\t\t\t\tfile: \"head.html\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for font preloads\n\tif (/<link[^>]+as=[\"']font[\"']/i.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No font preloads in head.html\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Font preloads consume LCP bandwidth budget — let loadFonts() handle them\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n\n\tif (!results.some((r) => r.file === \"head.html\")) {\n\t\tresults.push({\n\t\t\trule: \"head.html is clean\",\n\t\t\tstatus: \"pass\",\n\t\t\tmessage: \"No render-blocking issues found\",\n\t\t\tfile: \"head.html\",\n\t\t});\n\t}\n}\n\n// ── scripts.js ─────────────────────────────────────────────\n\nasync function checkScriptsJs(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"scripts\", \"scripts.js\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"scripts/scripts.js exists\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Missing scripts.js — cannot audit loading phases\",\n\t\t});\n\t\treturn;\n\t}\n\n\tconst content = await readFile(filePath, \"utf-8\");\n\tconst lines = content.split(\"\\n\");\n\n\t// Check three-phase structure\n\tconst hasLoadEager = /function\\s+loadEager|loadEager\\s*=/i.test(content);\n\tconst hasLoadLazy = /function\\s+loadLazy|loadLazy\\s*=/i.test(content);\n\tconst hasLoadDelayed = /function\\s+loadDelayed|loadDelayed\\s*=/i.test(content);\n\n\tresults.push({\n\t\trule: \"loadEager phase exists\",\n\t\tstatus: hasLoadEager ? \"pass\" : \"fail\",\n\t\tmessage: hasLoadEager ? \"Found\" : \"Missing loadEager — LCP optimization depends on it\",\n\t\tfile: \"scripts/scripts.js\",\n\t});\n\n\tresults.push({\n\t\trule: \"loadLazy phase exists\",\n\t\tstatus: hasLoadLazy ? \"pass\" : \"fail\",\n\t\tmessage: hasLoadLazy ? \"Found\" : \"Missing loadLazy — below-fold content won't load properly\",\n\t\tfile: \"scripts/scripts.js\",\n\t});\n\n\tresults.push({\n\t\trule: \"loadDelayed phase exists\",\n\t\tstatus: hasLoadDelayed ? \"pass\" : \"warn\",\n\t\tmessage: hasLoadDelayed ? \"Found\" : \"Missing loadDelayed — third-party scripts may block LCP\",\n\t\tfile: \"scripts/scripts.js\",\n\t});\n\n\t// Check delayed uses setTimeout with >=3000ms\n\tconst delayedTimeoutMatch = content.match(/setTimeout\\s*\\([^,]+,\\s*(\\d+)\\s*\\)/);\n\tif (hasLoadDelayed && delayedTimeoutMatch) {\n\t\tconst delay = Number.parseInt(delayedTimeoutMatch[1], 10);\n\t\tif (delay < 3000) {\n\t\t\tresults.push({\n\t\t\t\trule: \"Delayed phase waits >= 3s\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `delayed.js loads after ${delay}ms — should be >= 3000ms for LCP safety`,\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t} else {\n\t\t\tresults.push({\n\t\t\t\trule: \"Delayed phase waits >= 3s\",\n\t\t\t\tstatus: \"pass\",\n\t\t\t\tmessage: `${delay}ms delay before loading delayed.js`,\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check that loadEager only loads first section\n\tif (hasLoadEager) {\n\t\tconst eagerSection = content.match(/loadEager[\\s\\S]*?(?=function\\s|const\\s+load|$)/)?.[0] || \"\";\n\t\tif (/loadSections\\s*\\(/.test(eagerSection)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"loadEager loads only first section\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"loadEager calls loadSections() — should only load first section for fast LCP\",\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for third-party imports in top-level / eager phase\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tif (/import\\s.*from\\s+['\"]https?:\\/\\//i.test(line)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No third-party imports at top level\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `Third-party import at line ${i + 1} — move to delayed.js if not critical`,\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t\tline: i + 1,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for header/footer loading in eager phase\n\tif (hasLoadEager) {\n\t\tconst eagerBody = extractFunctionBody(content, \"loadEager\");\n\t\tif (eagerBody && /loadHeader|loadFooter/.test(eagerBody)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"Header/footer not in loadEager\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: \"Header/footer in loadEager delays LCP — move to loadLazy\",\n\t\t\t\tfile: \"scripts/scripts.js\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// ── styles.css ─────────────────────────────────────────────\n\nasync function checkStylesCss(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"styles\", \"styles.css\");\n\tif (!existsSync(filePath)) return;\n\n\tconst stats = await stat(filePath);\n\tconst sizeKb = stats.size / 1024;\n\n\tresults.push({\n\t\trule: \"styles.css size within LCP budget\",\n\t\tstatus: sizeKb > 40 ? \"warn\" : \"pass\",\n\t\tmessage: `${sizeKb.toFixed(1)} KB${sizeKb > 40 ? \" — large CSS competes with 100KB LCP budget\" : \"\"}`,\n\t\tfile: \"styles/styles.css\",\n\t});\n\n\t// Check for @import (render-blocking chain)\n\tconst content = await readFile(filePath, \"utf-8\");\n\tif (/@import\\s/.test(content)) {\n\t\tresults.push({\n\t\t\trule: \"No @import in styles.css\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"@import creates a request chain — inline the CSS or use lazy-styles.css\",\n\t\t\tfile: \"styles/styles.css\",\n\t\t});\n\t}\n}\n\n// ── delayed.js ─────────────────────────────────────────────\n\nasync function checkDelayedJs(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"scripts\", \"delayed.js\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"scripts/delayed.js exists\",\n\t\t\tstatus: \"info\",\n\t\t\tmessage: \"No delayed.js — third-party scripts should go here\",\n\t\t});\n\t\treturn;\n\t}\n\n\tconst content = await readFile(filePath, \"utf-8\");\n\n\t// Check it actually has content (not just the stub comment)\n\tconst stripped = content\n\t\t.replace(/\\/\\/.*$/gm, \"\")\n\t\t.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n\t\t.trim();\n\tif (!stripped) {\n\t\tresults.push({\n\t\t\trule: \"delayed.js has content\",\n\t\t\tstatus: \"info\",\n\t\t\tmessage: \"delayed.js is empty — add analytics/martech here\",\n\t\t\tfile: \"scripts/delayed.js\",\n\t\t});\n\t}\n}\n\n// ── Block JS files ─────────────────────────────────────────\n\nasync function checkBlocks(root: string, results: AuditResult[]) {\n\tconst blocksDir = path.join(root, \"blocks\");\n\tif (!existsSync(blocksDir)) return;\n\n\tconst entries = await readdir(blocksDir, { withFileTypes: true });\n\n\tfor (const entry of entries) {\n\t\tif (!entry.isDirectory()) continue;\n\t\tconst blockName = entry.name;\n\t\tconst jsFile = path.join(blocksDir, blockName, `${blockName}.js`);\n\t\tif (!existsSync(jsFile)) continue;\n\n\t\tconst content = await readFile(jsFile, \"utf-8\");\n\t\tconst lines = content.split(\"\\n\");\n\n\t\t// Check for heavy library imports\n\t\tconst heavyLibs = [\n\t\t\t\"jquery\",\n\t\t\t\"lodash\",\n\t\t\t\"moment\",\n\t\t\t\"rxjs\",\n\t\t\t\"d3\",\n\t\t\t\"three\",\n\t\t\t\"gsap\",\n\t\t\t\"anime\",\n\t\t\t\"chart.js\",\n\t\t\t\"swiper\",\n\t\t];\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i].toLowerCase();\n\t\t\tfor (const lib of heavyLibs) {\n\t\t\t\tif (line.includes(\"from\") && line.includes(lib) && /import\\s/.test(line)) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\trule: \"No heavy imports in blocks\",\n\t\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\t\tmessage: `Imports \"${lib}\" — heavy library delays section loading`,\n\t\t\t\t\t\tfile: `blocks/${blockName}/${blockName}.js`,\n\t\t\t\t\t\tline: i + 1,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check for synchronous DOM-heavy patterns\n\t\tif (/document\\.write/i.test(content)) {\n\t\t\tresults.push({\n\t\t\t\trule: \"No document.write in blocks\",\n\t\t\t\tstatus: \"fail\",\n\t\t\t\tmessage: \"document.write blocks parsing and can break the page\",\n\t\t\t\tfile: `blocks/${blockName}/${blockName}.js`,\n\t\t\t});\n\t\t}\n\n\t\t// Check block JS file size\n\t\tconst stats = await stat(jsFile);\n\t\tconst sizeKb = stats.size / 1024;\n\t\tif (sizeKb > 20) {\n\t\t\tresults.push({\n\t\t\t\trule: \"Block JS size reasonable\",\n\t\t\t\tstatus: \"warn\",\n\t\t\t\tmessage: `${sizeKb.toFixed(1)} KB — consider splitting or lazy-loading parts`,\n\t\t\t\tfile: `blocks/${blockName}/${blockName}.js`,\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check block CSS for unscoped selectors\n\tfor (const entry of entries) {\n\t\tif (!entry.isDirectory()) continue;\n\t\tconst blockName = entry.name;\n\t\tconst cssFile = path.join(blocksDir, blockName, `${blockName}.css`);\n\t\tif (!existsSync(cssFile)) continue;\n\n\t\tconst content = await readFile(cssFile, \"utf-8\");\n\n\t\t// Simple check: top-level selectors that don't start with .blockname\n\t\tconst selectorPattern = /^([a-z][a-z0-9-]*)\\s*\\{/gm;\n\t\tfor (const selectorMatch of content.matchAll(selectorPattern)) {\n\t\t\tconst selector = selectorMatch[1];\n\t\t\tif (![\"body\", \"html\", \"main\"].includes(selector)) {\n\t\t\t\tresults.push({\n\t\t\t\t\trule: \"Block CSS is scoped\",\n\t\t\t\t\tstatus: \"warn\",\n\t\t\t\t\tmessage: `Bare element selector \"${selector}\" — may leak styles and cause CLS. Use .${blockName} prefix`,\n\t\t\t\t\tfile: `blocks/${blockName}/${blockName}.css`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n// ── aem.js ─────────────────────────────────────────────────\n\nasync function checkAemJs(root: string, results: AuditResult[]) {\n\tconst filePath = path.join(root, \"scripts\", \"aem.js\");\n\tif (!existsSync(filePath)) {\n\t\tresults.push({\n\t\t\trule: \"scripts/aem.js exists\",\n\t\t\tstatus: \"warn\",\n\t\t\tmessage: \"Missing aem.js (or lib-franklin.js) — the EDS framework library\",\n\t\t});\n\t\treturn;\n\t}\n\n\tresults.push({\n\t\trule: \"aem.js present\",\n\t\tstatus: \"pass\",\n\t\tmessage: \"Found — remember: never modify this file\",\n\t\tfile: \"scripts/aem.js\",\n\t});\n}\n\n// ── Helpers ────────────────────────────────────────────────\n\nfunction extractFunctionBody(source: string, funcName: string): string | null {\n\tconst pattern = new RegExp(`(?:async\\\\s+)?function\\\\s+${funcName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{`);\n\tconst match = pattern.exec(source);\n\tif (!match) return null;\n\n\tlet depth = 1;\n\tlet i = match.index + match[0].length;\n\tconst start = i;\n\twhile (i < source.length && depth > 0) {\n\t\tif (source[i] === \"{\") depth++;\n\t\telse if (source[i] === \"}\") depth--;\n\t\ti++;\n\t}\n\treturn source.slice(start, i - 1);\n}\n\nfunction printResults(results: AuditResult[]) {\n\t// Group by file\n\tconst grouped = new Map<string, AuditResult[]>();\n\tfor (const r of results) {\n\t\tconst key = r.file || \"general\";\n\t\tconst bucket = grouped.get(key) ?? [];\n\t\tbucket.push(r);\n\t\tgrouped.set(key, bucket);\n\t}\n\n\tfor (const [file, fileResults] of grouped) {\n\t\tlogger.info(` ${ui.icon.bullet} ${chalk.underline(file)}`);\n\t\tfor (const r of fileResults) {\n\t\t\tconst loc = r.line ? chalk.dim(`:${r.line}`) : \"\";\n\t\t\tlogger.info(` ${ui.statusIcon(r.status)} ${r.rule}${loc}`);\n\t\t\tif (r.status !== \"pass\") {\n\t\t\t\tlogger.info(chalk.dim(` ${r.message}`));\n\t\t\t}\n\t\t}\n\t\tlogger.info(\"\");\n\t}\n\n\tconst counts = {\n\t\tpass: results.filter((r) => r.status === \"pass\").length,\n\t\twarn: results.filter((r) => r.status === \"warn\").length,\n\t\tfail: results.filter((r) => r.status === \"fail\").length,\n\t\tinfo: results.filter((r) => r.status === \"info\").length,\n\t};\n\n\tlogger.info(ui.box([ui.summary(counts)]));\n\tif (counts.fail > 0) process.exitCode = 1;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\ninterface AuditSecurityOptions {\n\tjson?: boolean;\n}\n\ntype Severity = \"critical\" | \"high\" | \"moderate\" | \"low\";\n\ninterface Finding {\n\tseverity: Severity;\n\trule: string;\n\tmessage: string;\n\tfile: string;\n\tline: number;\n\tsnippet: string;\n}\n\ninterface Rule {\n\tid: string;\n\tseverity: Severity;\n\tre: RegExp;\n\tmessage: string;\n\text: string[];\n\t/** Optional extra predicate on the matched line (e.g. negative look-aside). */\n\textra?: (line: string) => boolean;\n}\n\n// Ordered: dynamic innerHTML before static so we don't double-report a line.\nconst RULES: Rule[] = [\n\t{\n\t\tid: \"eval\",\n\t\tseverity: \"critical\",\n\t\tre: /\\beval\\s*\\(/,\n\t\tmessage: \"eval() executes arbitrary code — prime XSS / RCE vector\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"aws-key\",\n\t\tseverity: \"critical\",\n\t\tre: /\\bAKIA[0-9A-Z]{16}\\b/,\n\t\tmessage: \"Hardcoded AWS access key id\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\"],\n\t},\n\t{\n\t\tid: \"private-key\",\n\t\tseverity: \"critical\",\n\t\tre: /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/,\n\t\tmessage: \"Embedded private key material\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\", \"pem\", \"txt\"],\n\t},\n\t{\n\t\tid: \"new-function\",\n\t\tseverity: \"high\",\n\t\tre: /\\bnew\\s+Function\\s*\\(/,\n\t\tmessage: \"new Function() runs strings as code\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"document-write\",\n\t\tseverity: \"high\",\n\t\tre: /document\\.write(?:ln)?\\s*\\(/,\n\t\tmessage: \"document.write() enables XSS and blocks parsing\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"innerhtml-dynamic\",\n\t\tseverity: \"high\",\n\t\tre: /\\.(?:inner|outer)HTML\\s*=\\s*[^;\\n]*(?:\\$\\{|\\+|concat)/,\n\t\tmessage: \"Dynamic innerHTML assignment — sanitize or use textContent / DOM APIs\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"insert-adjacent-html\",\n\t\tseverity: \"high\",\n\t\tre: /insertAdjacentHTML\\s*\\(/,\n\t\tmessage: \"insertAdjacentHTML with untrusted data is an XSS vector\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"js-url\",\n\t\tseverity: \"high\",\n\t\tre: /(?:href|src)\\s*=\\s*[\"']?\\s*javascript:/i,\n\t\tmessage: \"javascript: URL — XSS vector\",\n\t\text: [\"js\", \"mjs\", \"html\"],\n\t},\n\t{\n\t\tid: \"secret\",\n\t\tseverity: \"high\",\n\t\tre: /(?:api[_-]?key|secret|access[_-]?token|auth[_-]?token|client[_-]?secret|passwd|password)\\s*[:=]\\s*[\"'][^\"']{8,}[\"']/i,\n\t\tmessage: \"Possible hardcoded secret / credential\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\"],\n\t\t// Skip obvious placeholders.\n\t\textra: (line) => !/(example|placeholder|your[-_]|changeme|xxxx|<[^>]+>|\\$\\{)/i.test(line),\n\t},\n\t{\n\t\tid: \"bearer-token\",\n\t\tseverity: \"high\",\n\t\tre: /Bearer\\s+[A-Za-z0-9\\-._~+/]{20,}/,\n\t\tmessage: \"Hardcoded bearer token\",\n\t\text: [\"js\", \"mjs\", \"html\", \"json\"],\n\t},\n\t{\n\t\tid: \"innerhtml-static\",\n\t\tseverity: \"moderate\",\n\t\tre: /\\.(?:inner|outer)HTML\\s*=/,\n\t\tmessage: \"innerHTML assignment — confirm the content is trusted / sanitized\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"insecure-url\",\n\t\tseverity: \"moderate\",\n\t\tre: /(?:href|src)\\s*=\\s*[\"']http:\\/\\/(?!localhost|127\\.0\\.0\\.1)/i,\n\t\tmessage: \"Insecure http:// resource — mixed content, use https://\",\n\t\text: [\"html\", \"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"target-blank\",\n\t\tseverity: \"moderate\",\n\t\tre: /target\\s*=\\s*[\"']_blank[\"']/,\n\t\tmessage: 'target=\"_blank\" without rel=\"noopener\" — reverse tabnabbing',\n\t\text: [\"html\", \"js\", \"mjs\"],\n\t\textra: (line) => !/rel\\s*=\\s*[\"'][^\"']*noopener/i.test(line),\n\t},\n\t{\n\t\tid: \"postmessage-wildcard\",\n\t\tseverity: \"moderate\",\n\t\tre: /postMessage\\s*\\([^,]+,\\s*[\"']\\*[\"']\\s*\\)/,\n\t\tmessage: \"postMessage to '*' origin — restrict the target origin\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n\t{\n\t\tid: \"inline-handler\",\n\t\tseverity: \"low\",\n\t\tre: /\\son[a-z]+\\s*=\\s*[\"']/i,\n\t\tmessage: \"Inline event handler — move to addEventListener (CSP-unfriendly)\",\n\t\text: [\"html\"],\n\t},\n\t{\n\t\tid: \"console-log\",\n\t\tseverity: \"low\",\n\t\tre: /console\\.(?:log|debug)\\s*\\(/,\n\t\tmessage: \"console.log / debug left in code — potential info leak\",\n\t\text: [\"js\", \"mjs\"],\n\t},\n];\n\nconst SEVERITY_ORDER: Severity[] = [\"critical\", \"high\", \"moderate\", \"low\"];\nconst SEVERITY_META: Record<Severity, { status: ui.Status; label: string }> = {\n\tcritical: { status: \"fail\", label: \"CRIT\" },\n\thigh: { status: \"fail\", label: \"HIGH\" },\n\tmoderate: { status: \"warn\", label: \"MOD \" },\n\tlow: { status: \"info\", label: \"LOW \" },\n};\n\nconst IGNORE_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".vscode\", \"coverage\"]);\nconst SCAN_EXT = new Set([\"js\", \"mjs\", \"html\", \"json\", \"pem\", \"txt\"]);\n\nasync function* walk(dir: string): AsyncGenerator<string> {\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\tfor (const entry of entries) {\n\t\tconst full = path.join(dir, entry.name);\n\t\tif (entry.isDirectory()) {\n\t\t\tif (IGNORE_DIRS.has(entry.name)) continue;\n\t\t\tyield* walk(full);\n\t\t} else if (entry.isFile()) {\n\t\t\tyield full;\n\t\t}\n\t}\n}\n\nfunction scanContent(content: string, relFile: string, ext: string): Finding[] {\n\tconst findings: Finding[] = [];\n\tconst lines = content.split(\"\\n\");\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tlet innerHtmlDynamicHit = false;\n\t\tfor (const rule of RULES) {\n\t\t\tif (!rule.ext.includes(ext)) continue;\n\t\t\t// Don't double-report the same innerHTML line as both dynamic + static.\n\t\t\tif (rule.id === \"innerhtml-static\" && innerHtmlDynamicHit) continue;\n\t\t\tif (!rule.re.test(line)) continue;\n\t\t\tif (rule.extra && !rule.extra(line)) continue;\n\t\t\tif (rule.id === \"innerhtml-dynamic\") innerHtmlDynamicHit = true;\n\t\t\tfindings.push({\n\t\t\t\tseverity: rule.severity,\n\t\t\t\trule: rule.id,\n\t\t\t\tmessage: rule.message,\n\t\t\t\tfile: relFile,\n\t\t\t\tline: i + 1,\n\t\t\t\tsnippet: line.trim().slice(0, 100),\n\t\t\t});\n\t\t}\n\t}\n\treturn findings;\n}\n\ninterface DepReport {\n\tstatus: \"ok\" | \"vulnerable\" | \"skipped\";\n\tcounts?: { critical: number; high: number; moderate: number; low: number };\n\tnote?: string;\n}\n\nasync function auditDependencies(root: string): Promise<DepReport> {\n\tif (!existsSync(path.join(root, \"package.json\"))) {\n\t\treturn { status: \"skipped\", note: \"no package.json\" };\n\t}\n\tconst hasLock =\n\t\texistsSync(path.join(root, \"package-lock.json\")) ||\n\t\texistsSync(path.join(root, \"npm-shrinkwrap.json\"));\n\tif (!hasLock && !existsSync(path.join(root, \"node_modules\"))) {\n\t\treturn { status: \"skipped\", note: \"no package-lock.json / node_modules — run npm install\" };\n\t}\n\ttry {\n\t\tconst { execa } = await import(\"execa\");\n\t\tconst { stdout } = await execa(\"npm\", [\"audit\", \"--json\"], {\n\t\t\tcwd: root,\n\t\t\treject: false,\n\t\t});\n\t\tconst data = JSON.parse(stdout);\n\t\tconst v = data?.metadata?.vulnerabilities ?? {};\n\t\tconst counts = {\n\t\t\tcritical: v.critical ?? 0,\n\t\t\thigh: v.high ?? 0,\n\t\t\tmoderate: v.moderate ?? 0,\n\t\t\tlow: v.low ?? 0,\n\t\t};\n\t\tconst total = counts.critical + counts.high + counts.moderate + counts.low;\n\t\treturn { status: total > 0 ? \"vulnerable\" : \"ok\", counts };\n\t} catch (err) {\n\t\treturn { status: \"skipped\", note: `npm audit failed: ${(err as Error).message}` };\n\t}\n}\n\nexport async function auditSecurity(options: AuditSecurityOptions = {}): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\t// ── Exploit / code scan ──────────────────────────────────\n\tconst findings: Finding[] = [];\n\tfor await (const file of walk(projectRoot)) {\n\t\tconst ext = path.extname(file).slice(1).toLowerCase();\n\t\tif (!SCAN_EXT.has(ext)) continue;\n\t\t// Never flag the EDS framework library — it's vendored and not ours to edit.\n\t\tconst rel = path.relative(projectRoot, file);\n\t\tif (rel.endsWith(\"aem.js\") || rel.endsWith(\"lib-franklin.js\")) continue;\n\t\tconst content = await readFile(file, \"utf-8\");\n\t\tfindings.push(...scanContent(content, rel, ext));\n\t}\n\n\t// ── Dependency vulnerabilities ───────────────────────────\n\tconst deps = await auditDependencies(projectRoot);\n\n\tconst bySeverity = (s: Severity) => findings.filter((f) => f.severity === s);\n\tconst codeCounts = {\n\t\tcritical: bySeverity(\"critical\").length,\n\t\thigh: bySeverity(\"high\").length,\n\t\tmoderate: bySeverity(\"moderate\").length,\n\t\tlow: bySeverity(\"low\").length,\n\t};\n\tconst hardFail =\n\t\tcodeCounts.critical > 0 ||\n\t\tcodeCounts.high > 0 ||\n\t\t(deps.counts?.critical ?? 0) > 0 ||\n\t\t(deps.counts?.high ?? 0) > 0;\n\n\tif (options.json) {\n\t\tconsole.log(\n\t\t\tJSON.stringify(\n\t\t\t\t{ projectRoot, dependencies: deps, findings, summary: { code: codeCounts } },\n\t\t\t\tnull,\n\t\t\t\t2,\n\t\t\t),\n\t\t);\n\t\tif (hardFail) process.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Security Audit\"));\n\tlogger.info(ui.heading(\"Dependencies\", \"npm audit\"));\n\tif (deps.status === \"skipped\") {\n\t\tlogger.info(ui.statusLine(\"info\", \"npm audit\", deps.note ?? \"skipped\"));\n\t} else if (deps.status === \"ok\") {\n\t\tlogger.info(ui.statusLine(\"pass\", \"npm audit\", \"no known vulnerabilities\"));\n\t} else {\n\t\tconst c = deps.counts ?? { critical: 0, high: 0, moderate: 0, low: 0 };\n\t\tlogger.info(\n\t\t\tui.statusLine(\n\t\t\t\tc.critical + c.high > 0 ? \"fail\" : \"warn\",\n\t\t\t\t\"npm audit\",\n\t\t\t\t`${c.critical} critical, ${c.high} high, ${c.moderate} moderate, ${c.low} low — run \\`npm audit fix\\``,\n\t\t\t),\n\t\t);\n\t}\n\n\tlogger.info(ui.heading(\"Exploit scan\", \"XSS · secrets · injection · tabnabbing\"));\n\tif (findings.length === 0) {\n\t\tlogger.info(ui.statusLine(\"pass\", \"code\", \"no risky patterns found\"));\n\t} else {\n\t\tconst sorted = [...findings].sort(\n\t\t\t(a, b) => SEVERITY_ORDER.indexOf(a.severity) - SEVERITY_ORDER.indexOf(b.severity),\n\t\t);\n\t\tfor (const f of sorted) {\n\t\t\tconst meta = SEVERITY_META[f.severity];\n\t\t\tconst loc = chalk.dim(`${f.file}:${f.line}`);\n\t\t\tlogger.info(` ${ui.statusIcon(meta.status)} ${chalk.bold(meta.label)} ${f.message} ${loc}`);\n\t\t\tlogger.info(chalk.dim(` ${f.snippet}`));\n\t\t}\n\t}\n\n\tconst summaryLine = ui.summary({\n\t\tfail:\n\t\t\tcodeCounts.critical +\n\t\t\tcodeCounts.high +\n\t\t\t(deps.counts?.critical ?? 0) +\n\t\t\t(deps.counts?.high ?? 0),\n\t\twarn: codeCounts.moderate + (deps.counts?.moderate ?? 0),\n\t\tinfo: codeCounts.low + (deps.counts?.low ?? 0),\n\t});\n\tlogger.info(\"\");\n\tlogger.info(\n\t\tui.box([summaryLine || `${ui.icon.pass} no vulnerabilities or risky patterns found`]),\n\t);\n\tif (hardFail) process.exitCode = 1;\n}\n","import { logger } from \"./logger.js\";\n\nconst ADMIN_BASE = \"https://admin.hlx.page\";\n\nexport interface AdminApiConfig {\n\torg: string;\n\tsite: string;\n\tref?: string;\n}\n\nexport interface AdminApiResult {\n\tok: boolean;\n\tstatus: number;\n\tpath: string;\n\tpreviewUrl?: string;\n\tliveUrl?: string;\n\tmessage?: string;\n}\n\nasync function adminRequest(\n\taction: \"preview\" | \"live\",\n\tconfig: AdminApiConfig,\n\tpagePath: string,\n): Promise<AdminApiResult> {\n\tconst ref = config.ref || \"main\";\n\tconst normalizedPath = pagePath.startsWith(\"/\") ? pagePath : `/${pagePath}`;\n\tconst url = `${ADMIN_BASE}/${action}/${config.org}/${config.site}/${ref}${normalizedPath}`;\n\n\tlogger.debug(`POST ${url}`);\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n\n\tconst body = await response.json().catch(() => ({}));\n\tconst data = body as Record<string, Record<string, string>>;\n\n\tif (!response.ok) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tstatus: response.status,\n\t\t\tpath: normalizedPath,\n\t\t\tmessage: (body as Record<string, string>).message || `HTTP ${response.status}`,\n\t\t};\n\t}\n\n\treturn {\n\t\tok: true,\n\t\tstatus: response.status,\n\t\tpath: normalizedPath,\n\t\tpreviewUrl: data.preview?.url,\n\t\tliveUrl: data.live?.url,\n\t};\n}\n\nexport async function previewPage(\n\tconfig: AdminApiConfig,\n\tpagePath: string,\n): Promise<AdminApiResult> {\n\treturn adminRequest(\"preview\", config, pagePath);\n}\n\nexport async function publishPage(\n\tconfig: AdminApiConfig,\n\tpagePath: string,\n): Promise<AdminApiResult> {\n\treturn adminRequest(\"live\", config, pagePath);\n}\n\nexport async function previewPages(\n\tconfig: AdminApiConfig,\n\tpaths: string[],\n): Promise<AdminApiResult[]> {\n\treturn Promise.all(paths.map((p) => previewPage(config, p)));\n}\n\nexport async function publishPages(\n\tconfig: AdminApiConfig,\n\tpaths: string[],\n): Promise<AdminApiResult[]> {\n\treturn Promise.all(paths.map((p) => publishPage(config, p)));\n}\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { previewPage, previewPages } from \"../lib/admin-api.js\";\nimport { loadConfig } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\n\ninterface PreviewOptions {\n\torg?: string;\n\tsite?: string;\n\tref?: string;\n}\n\nexport async function preview(paths: string[], options: PreviewOptions): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tconst config = await loadConfig(projectRoot);\n\tconst adminConfig = resolveAdminConfig(config, options);\n\n\tif (!adminConfig) return;\n\n\tconst spinner = ora(`Previewing ${paths.length} path(s)...`).start();\n\n\tconst results =\n\t\tpaths.length === 1\n\t\t\t? [await previewPage(adminConfig, paths[0])]\n\t\t\t: await previewPages(adminConfig, paths);\n\n\tspinner.stop();\n\n\tlet hasErrors = false;\n\tfor (const r of results) {\n\t\tif (r.ok) {\n\t\t\tlogger.success(`${r.path} → ${chalk.cyan(r.previewUrl || \"preview updated\")}`);\n\t\t} else {\n\t\t\tlogger.error(`${r.path} — ${r.message}`);\n\t\t\thasErrors = true;\n\t\t}\n\t}\n\n\tif (hasErrors) process.exitCode = 1;\n}\n\nfunction resolveAdminConfig(\n\tconfig: { admin?: { org?: string; site?: string; ref?: string } },\n\toptions: PreviewOptions,\n) {\n\tconst org = options.org || config.admin?.org;\n\tconst site = options.site || config.admin?.site;\n\tconst ref = options.ref || config.admin?.ref || \"main\";\n\n\tif (!org || !site) {\n\t\tlogger.error(\"Missing --org and --site. Set them via flags or in .edsrc.json:\");\n\t\tlogger.info(chalk.dim(' { \"admin\": { \"org\": \"my-org\", \"site\": \"my-site\" } }'));\n\t\tprocess.exitCode = 1;\n\t\treturn undefined;\n\t}\n\n\treturn { org, site, ref };\n}\n\n// Re-export for publish to reuse\nexport { resolveAdminConfig };\n","import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { publishPage, publishPages } from \"../lib/admin-api.js\";\nimport { loadConfig } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { resolveAdminConfig } from \"./preview.js\";\n\ninterface PublishOptions {\n\torg?: string;\n\tsite?: string;\n\tref?: string;\n}\n\nexport async function publish(paths: string[], options: PublishOptions): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tconst config = await loadConfig(projectRoot);\n\tconst adminConfig = resolveAdminConfig(config, options);\n\n\tif (!adminConfig) return;\n\n\tconst spinner = ora(`Publishing ${paths.length} path(s)...`).start();\n\n\tconst results =\n\t\tpaths.length === 1\n\t\t\t? [await publishPage(adminConfig, paths[0])]\n\t\t\t: await publishPages(adminConfig, paths);\n\n\tspinner.stop();\n\n\tlet hasErrors = false;\n\tfor (const r of results) {\n\t\tif (r.ok) {\n\t\t\tlogger.success(`${r.path} → ${chalk.cyan(r.liveUrl || \"published\")}`);\n\t\t} else {\n\t\t\tlogger.error(`${r.path} — ${r.message}`);\n\t\t\thasErrors = true;\n\t\t}\n\t}\n\n\tif (hasErrors) process.exitCode = 1;\n}\n","import { loadConfig } from \"../lib/config.js\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport * as ui from \"../lib/ui.js\";\n\n/**\n * Interactive wizard for the AEM Admin API (preview / publish). Reached from the\n * main menu or by running `eds preview` / `eds publish` with no paths. Defaults\n * come from `.edsrc.json` (`admin.org/site/ref`).\n */\nexport async function adminWizard(initialOp?: \"preview\" | \"publish\"): Promise<void> {\n\tconst projectRoot = findProjectRoot();\n\tif (!projectRoot) {\n\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.logoOnce(ui.logo(\"Admin API — preview / publish\"));\n\n\tconst { select, input, confirm } = await import(\"@inquirer/prompts\");\n\tconst config = await loadConfig(projectRoot);\n\tconst admin = (config as { admin?: { org?: string; site?: string; ref?: string } }).admin ?? {};\n\n\tconst op =\n\t\tinitialOp ??\n\t\t((await select({\n\t\t\tmessage: \"What do you want to do?\",\n\t\t\tchoices: [\n\t\t\t\t{ name: \"Preview pages (staging)\", value: \"preview\" },\n\t\t\t\t{ name: \"Publish pages (go live)\", value: \"publish\" },\n\t\t\t],\n\t\t})) as \"preview\" | \"publish\");\n\n\tconst org = (await input({ message: \"GitHub org / owner\", default: admin.org })).trim();\n\tconst site = (await input({ message: \"Repository / site\", default: admin.site })).trim();\n\tconst ref = (await input({ message: \"Git ref\", default: admin.ref || \"main\" })).trim();\n\tconst pathsRaw = await input({\n\t\tmessage: \"Paths (space- or comma-separated)\",\n\t\tdefault: \"/\",\n\t});\n\tconst paths = pathsRaw.split(/[\\s,]+/).filter(Boolean);\n\n\tif (!org || !site || paths.length === 0) {\n\t\tlogger.error(\"org, site and at least one path are required.\");\n\t\tprocess.exitCode = 1;\n\t\treturn;\n\t}\n\n\tlogger.info(ui.heading(\"Summary\"));\n\tconst w = ui.columnWidth([\"operation\", \"org\", \"site\", \"ref\", \"paths\"]);\n\tlogger.info(ui.accentLine(\"operation\", op, w));\n\tlogger.info(ui.accentLine(\"org\", org, w));\n\tlogger.info(ui.accentLine(\"site\", site, w));\n\tlogger.info(ui.accentLine(\"ref\", ref, w));\n\tlogger.info(ui.accentLine(\"paths\", paths.join(\", \"), w));\n\tlogger.info(\"\");\n\n\tif (op === \"publish\") {\n\t\tconst go = await confirm({\n\t\t\tmessage: `Publish ${paths.length} path(s) to LIVE?`,\n\t\t\tdefault: false,\n\t\t});\n\t\tif (!go) {\n\t\t\tlogger.info(\"Cancelled.\");\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst options = { org, site, ref };\n\tif (op === \"preview\") {\n\t\tconst { preview } = await import(\"./preview.js\");\n\t\tawait preview(paths, options);\n\t} else {\n\t\tconst { publish } = await import(\"./publish.js\");\n\t\tawait publish(paths, options);\n\t}\n}\n","import { existsSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { logger } from \"../lib/logger.js\";\nimport { findProjectRoot } from \"../lib/project.js\";\nimport { kebabCaseRegex } from \"../lib/schemas.js\";\n\nasync function listBlockNames(projectRoot: string): Promise<string[]> {\n\tconst dir = path.join(projectRoot, \"blocks\");\n\tif (!existsSync(dir)) return [];\n\tconst entries = await readdir(dir, { withFileTypes: true });\n\treturn entries.filter((e) => e.isDirectory()).map((e) => e.name);\n}\n\n/**\n * The interactive front door: `eds` with no command opens this menu and routes\n * to each feature's own wizard. Flags/subcommands still work for power users/CI.\n */\nexport async function mainMenu(): Promise<void> {\n\tconst { select, input } = await import(\"@inquirer/prompts\");\n\n\tawait logger.logoOnceAnimated(\"What do you want to do?\");\n\n\tconst action = await select({\n\t\tmessage: \"Choose an action\",\n\t\tchoices: [\n\t\t\t{ name: \"Set up this project (authoring model, CI, naming)\", value: \"init\" },\n\t\t\t{ name: \"Generate a block from a design (Figma/Stitch/Canva/Sketch)\", value: \"from-design\" },\n\t\t\t{ name: \"Migrate a classic AEM component to EDS\", value: \"migrate\" },\n\t\t\t{ name: \"Scaffold Universal Editor components\", value: \"scaffold\" },\n\t\t\t{ name: \"Create an empty block\", value: \"create\" },\n\t\t\t{ name: \"Add a third-party integration (GTM, chat, consent…)\", value: \"integrate\" },\n\t\t\t{ name: \"Preview a block in the browser\", value: \"preview-block\" },\n\t\t\t{ name: \"Preview / publish pages (Admin API)\", value: \"admin\" },\n\t\t\t{ name: \"Audit the project\", value: \"audit\" },\n\t\t\t{ name: \"Configure Figma MCP\", value: \"figma-setup\" },\n\t\t],\n\t});\n\n\tswitch (action) {\n\t\tcase \"init\": {\n\t\t\tconst { initProject } = await import(\"./init.js\");\n\t\t\tawait initProject({});\n\t\t\treturn;\n\t\t}\n\t\tcase \"from-design\": {\n\t\t\tconst { blockFromDesign } = await import(\"./block/from-design.js\");\n\t\t\tawait blockFromDesign(undefined, {});\n\t\t\treturn;\n\t\t}\n\t\tcase \"migrate\": {\n\t\t\tconst { migrateComponent } = await import(\"./migrate.js\");\n\t\t\tawait migrateComponent(undefined, {});\n\t\t\treturn;\n\t\t}\n\t\tcase \"scaffold\": {\n\t\t\tconst { scaffoldInteractive } = await import(\"./scaffold.js\");\n\t\t\tawait scaffoldInteractive();\n\t\t\treturn;\n\t\t}\n\t\tcase \"create\": {\n\t\t\tconst name = await input({\n\t\t\t\tmessage: \"Block name\",\n\t\t\t\tvalidate: (v) => kebabCaseRegex.test(v.trim()) || \"Use kebab-case, e.g. hero-banner\",\n\t\t\t});\n\t\t\tconst { createBlock } = await import(\"./block/create.js\");\n\t\t\tawait createBlock(name.trim(), {});\n\t\t\treturn;\n\t\t}\n\t\tcase \"integrate\": {\n\t\t\tconst { integrate } = await import(\"./integrate.js\");\n\t\t\tawait integrate(undefined);\n\t\t\treturn;\n\t\t}\n\t\tcase \"preview-block\": {\n\t\t\tconst projectRoot = findProjectRoot();\n\t\t\tif (!projectRoot) {\n\t\t\t\tlogger.error(\"Not inside an EDS project (no EDS project markers found).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst blocks = await listBlockNames(projectRoot);\n\t\t\tif (blocks.length === 0) {\n\t\t\t\tlogger.warn(\"No blocks found in blocks/.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst name = await select({\n\t\t\t\tmessage: \"Which block?\",\n\t\t\t\tchoices: blocks.map((b) => ({ name: b, value: b })),\n\t\t\t});\n\t\t\tconst { previewBlock } = await import(\"./block/preview.js\");\n\t\t\tawait previewBlock(name, {});\n\t\t\treturn;\n\t\t}\n\t\tcase \"admin\": {\n\t\t\tconst { adminWizard } = await import(\"./admin.js\");\n\t\t\tawait adminWizard();\n\t\t\treturn;\n\t\t}\n\t\tcase \"audit\": {\n\t\t\tconst which = await select({\n\t\t\t\tmessage: \"Which audit?\",\n\t\t\t\tchoices: [\n\t\t\t\t\t{ name: \"Doctor — overall project health\", value: \"doctor\" },\n\t\t\t\t\t{ name: \"Loading — three-phase / LCP budget\", value: \"loading\" },\n\t\t\t\t\t{ name: \"Security — vulnerabilities & exploit patterns\", value: \"security\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (which === \"doctor\") {\n\t\t\t\tconst { doctor } = await import(\"./doctor.js\");\n\t\t\t\tawait doctor({});\n\t\t\t} else if (which === \"loading\") {\n\t\t\t\tconst { auditLoading } = await import(\"./audit-loading.js\");\n\t\t\t\tawait auditLoading({});\n\t\t\t} else {\n\t\t\t\tconst { auditSecurity } = await import(\"./audit-security.js\");\n\t\t\t\tawait auditSecurity({});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tcase \"figma-setup\": {\n\t\t\tconst { figmaSetup } = await import(\"./figma/setup.js\");\n\t\t\tawait figmaSetup();\n\t\t\treturn;\n\t\t}\n\t}\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\n// Single source of truth for the version - inlined from package.json at build\n// time, so `eds --version` can never drift from the published version.\nimport pkg from \"../../package.json\" with { type: \"json\" };\nimport { logger } from \"../lib/logger.js\";\nimport * as ui from \"../lib/ui.js\";\n\nconst program = new Command();\n\nprogram\n\t.name(\"eds\")\n\t.description(\"CLI for AEM Edge Delivery Services with Figma integration\")\n\t.version(pkg.version)\n\t.option(\"--verbose\", \"Enable verbose output\")\n\t.option(\"--quiet\", \"Suppress non-error output\")\n\t.option(\"--json\", \"Output in JSON format\")\n\t.option(\"--no-color\", \"Disable color output\")\n\t.showHelpAfterError(\"(add --help for usage)\")\n\t.hook(\"preAction\", (thisCommand) => {\n\t\tconst opts = thisCommand.opts();\n\t\tif (opts.verbose) logger.setLevel(\"debug\");\n\t\tif (opts.quiet) logger.setQuiet(true);\n\t\t// `--no-color` yields `opts.color === false`; silence chalk entirely.\n\t\tif (opts.color === false) chalk.level = 0;\n\t});\n\n// ANSI-art logo above every help screen (root and subcommands).\nprogram.addHelpText(\"beforeAll\", () => ui.logo());\n\n// eds init\nprogram\n\t.command(\"init\")\n\t.description(\"Set up a freshly cloned EDS boilerplate for your authoring model (interactive)\")\n\t.option(\"--name <name>\", \"Project name (kebab-case)\")\n\t.option(\"--authoring <model>\", \"Authoring model: ue | da | gdrive | sharepoint\")\n\t.option(\"--mountpoint <url>\", \"Content source URL (document models)\")\n\t.option(\"--org <org>\", \"DA org (authoring=da)\")\n\t.option(\"--site <site>\", \"DA site (authoring=da)\")\n\t.option(\"--no-ci\", \"Skip the GitHub Actions CI workflow\")\n\t.option(\"--yes\", \"Skip prompts; apply with flags/defaults\")\n\t.action(async (options) => {\n\t\tconst { initProject } = await import(\"../commands/init.js\");\n\t\tawait initProject(options);\n\t});\n\n// eds migrate component <dir>\nconst migrate = program.command(\"migrate\").description(\"Migrate from classic AEM to EDS\");\nmigrate\n\t.command(\"component [dir]\")\n\t.description(\"Migrate a classic AEM component's dialog into an EDS block + UE model\")\n\t.option(\"--name <name>\", \"Block name (otherwise inferred from the component)\")\n\t.option(\"--clientlib <dir>\", \"Path to the component's clientlib (otherwise auto-detected)\")\n\t.option(\"--yes\", \"Skip confirmation prompts\")\n\t.action(async (dir: string | undefined, options) => {\n\t\tconst { migrateComponent } = await import(\"../commands/migrate.js\");\n\t\tawait migrateComponent(dir, options);\n\t});\n\n// eds block create <name>\nconst block = program.command(\"block\").description(\"Manage EDS blocks\");\n\nblock\n\t.command(\"create <name>\")\n\t.description(\"Scaffold a new EDS block (with Universal Editor model by default)\")\n\t.option(\"--no-ue-model\", \"Skip the Universal Editor model (generated by default)\")\n\t.action(async (name: string, options) => {\n\t\tconst { createBlock } = await import(\"../commands/block/create.js\");\n\t\tawait createBlock(name, options);\n\t});\n\n// eds block from-design <url>\nblock\n\t.command(\"from-design [design-url]\")\n\t.description(\n\t\t\"Generate an EDS block from a design (Figma/Stitch/Canva/Sketch; interactive wizard when run with no URL)\",\n\t)\n\t.option(\"--name <name>\", \"Override the inferred block name\")\n\t.option(\"--agent <type>\", \"Force agent type (claude|cursor|codex|none)\")\n\t.option(\"--dry-run\", \"Generate prompt only, do not invoke agent\")\n\t.option(\"--source <type>\", \"Content source: document|ue|cf|mixed (default: document)\")\n\t.option(\"--no-ue-model\", \"Skip the Universal Editor model (generated by default)\")\n\t.option(\"--no-screenshot\", \"Skip the screenshot fetch (fewer tokens; structural verification)\")\n\t.option(\"--no-serve\", \"Don't auto-start the live preview after generating\")\n\t.option(\"--yes\", \"Skip confirmation prompts\")\n\t.action(async (designUrl: string | undefined, options) => {\n\t\tconst { blockFromDesign } = await import(\"../commands/block/from-design.js\");\n\t\tawait blockFromDesign(designUrl, options);\n\t});\n\n// eds block list\nblock\n\t.command(\"list\")\n\t.description(\"List all blocks in the project\")\n\t.action(async (options) => {\n\t\tconst { listBlocks } = await import(\"../commands/block/list.js\");\n\t\tawait listBlocks({ ...options, json: program.opts().json });\n\t});\n\n// eds block preview <name>\nblock\n\t.command(\"preview <name>\")\n\t.description(\"Serve a live, breakpoint-switchable preview of a block in the browser\")\n\t.option(\"--port <port>\", \"Port to serve on (default: 8777, falls back if taken)\")\n\t.option(\"--widths <list>\", \"Comma-separated breakpoint widths (e.g. 375,768,1280)\")\n\t.option(\"--no-open\", \"Do not open the browser automatically\")\n\t.action(async (name: string, options) => {\n\t\tconst { previewBlock } = await import(\"../commands/block/preview.js\");\n\t\tawait previewBlock(name, options);\n\t});\n\n// eds scaffold ...\nconst scaffold = program\n\t.command(\"scaffold\")\n\t.description(\"Scaffold standard UE components and blocks\")\n\t.action(async () => {\n\t\tconst { scaffoldInteractive } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldInteractive();\n\t});\n\nscaffold\n\t.command(\"ue\")\n\t.description(\"Scaffold default-content UE components + a field-reference block (all 17 fields)\")\n\t.action(async () => {\n\t\tconst { scaffoldUe } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldUe();\n\t});\n\nscaffold\n\t.command(\"blocks [names...]\")\n\t.description(\"Scaffold standard blocks (hero, cards, columns, accordion, embed) with UE models\")\n\t.action(async (names: string[]) => {\n\t\tconst { scaffoldBlocks } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldBlocks(names);\n\t});\n\nscaffold\n\t.command(\"ci\")\n\t.description(\"Scaffold a GitHub Actions workflow (doctor + audits + project lint/build)\")\n\t.action(async () => {\n\t\tconst { scaffoldCi } = await import(\"../commands/scaffold.js\");\n\t\tawait scaffoldCi();\n\t});\n\n// eds integrate [type]\nprogram\n\t.command(\"integrate [type]\")\n\t.description(\"Add a third-party service (GTM, GA4, chat, consent) to scripts/delayed.js\")\n\t.action(async (type: string | undefined) => {\n\t\tconst { integrate } = await import(\"../commands/integrate.js\");\n\t\tawait integrate(type);\n\t});\n\n// eds figma setup\nconst figma = program.command(\"figma\").description(\"Figma MCP integration\");\n\nfigma\n\t.command(\"setup\")\n\t.description(\"Configure Figma MCP for your AI agent\")\n\t.action(async () => {\n\t\tconst { figmaSetup } = await import(\"../commands/figma/setup.js\");\n\t\tawait figmaSetup();\n\t});\n\n// eds doctor\nprogram\n\t.command(\"doctor\")\n\t.description(\"Audit your EDS project for common issues\")\n\t.action(async () => {\n\t\tconst { doctor } = await import(\"../commands/doctor.js\");\n\t\tawait doctor({ json: program.opts().json });\n\t});\n\n// eds audit loading\nconst audit = program.command(\"audit\").description(\"Run project audits\");\n\naudit\n\t.command(\"loading\")\n\t.description(\"Check loading order (eager/lazy/delayed phases, LCP budget)\")\n\t.action(async () => {\n\t\tconst { auditLoading } = await import(\"../commands/audit-loading.js\");\n\t\tawait auditLoading({ json: program.opts().json });\n\t});\n\naudit\n\t.command(\"security\")\n\t.description(\n\t\t\"Scan for vulnerabilities (npm audit) and exploit patterns (XSS, secrets, tabnabbing)\",\n\t)\n\t.action(async () => {\n\t\tconst { auditSecurity } = await import(\"../commands/audit-security.js\");\n\t\tawait auditSecurity({ json: program.opts().json });\n\t});\n\n// eds preview [path...] (interactive Admin API wizard when no paths)\nprogram\n\t.command(\"preview [paths...]\")\n\t.description(\"Preview pages via Admin API (interactive wizard when run with no paths)\")\n\t.option(\"--org <org>\", \"GitHub org/owner\")\n\t.option(\"--site <site>\", \"Repository name\")\n\t.option(\"--ref <ref>\", \"Git ref (default: main)\")\n\t.action(async (paths: string[], options) => {\n\t\tif (!paths || paths.length === 0) {\n\t\t\tconst { adminWizard } = await import(\"../commands/admin.js\");\n\t\t\tawait adminWizard(\"preview\");\n\t\t\treturn;\n\t\t}\n\t\tconst { preview } = await import(\"../commands/preview.js\");\n\t\tawait preview(paths, options);\n\t});\n\n// eds publish [path...] (interactive Admin API wizard when no paths)\nprogram\n\t.command(\"publish [paths...]\")\n\t.description(\"Publish pages to live via Admin API (interactive wizard when run with no paths)\")\n\t.option(\"--org <org>\", \"GitHub org/owner\")\n\t.option(\"--site <site>\", \"Repository name\")\n\t.option(\"--ref <ref>\", \"Git ref (default: main)\")\n\t.action(async (paths: string[], options) => {\n\t\tif (!paths || paths.length === 0) {\n\t\t\tconst { adminWizard } = await import(\"../commands/admin.js\");\n\t\t\tawait adminWizard(\"publish\");\n\t\t\treturn;\n\t\t}\n\t\tconst { publish } = await import(\"../commands/publish.js\");\n\t\tawait publish(paths, options);\n\t});\n\n// No command → open the interactive menu in a terminal; fall back to help when\n// piped / non-interactive (CI). Flags and subcommands always work directly.\n(async () => {\n\ttry {\n\t\tif (process.argv.slice(2).length === 0) {\n\t\t\tif (process.stdout.isTTY) {\n\t\t\t\tconst { mainMenu } = await import(\"../commands/menu.js\");\n\t\t\t\tawait mainMenu();\n\t\t\t} else {\n\t\t\t\tprogram.outputHelp();\n\t\t\t}\n\t\t} else {\n\t\t\tawait program.parseAsync();\n\t\t}\n\t} catch (err) {\n\t\tlogger.error(err instanceof Error ? err.message : String(err));\n\t\tprocess.exitCode = 1;\n\t}\n})();\n","{\n \"name\": \"aem-eds-kit\",\n \"version\": \"0.4.9\",\n \"description\": \"CLI for AEM Edge Delivery Services with Figma MCP integration\",\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"bin\": {\n \"eds\": \"dist/bin/eds.js\"\n },\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"CHANGELOG.md\"\n ],\n \"scripts\": {\n \"dev\": \"tsx src/bin/eds.ts\",\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"lint\": \"biome check src/ tests/\",\n \"lint:fix\": \"biome check --write src/ tests/\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepare\": \"git config core.hooksPath .githooks || true\",\n \"prepublishOnly\": \"npm run build\"\n },\n \"keywords\": [\n \"aem\",\n \"edge-delivery-services\",\n \"helix\",\n \"figma\",\n \"mcp\",\n \"cli\",\n \"adobe\"\n ],\n \"author\": \"Piotr Godycki <piotrgodycki@yahoo.com>\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/piotrgodycki/aem-eds-kit.git\"\n },\n \"homepage\": \"https://piotrgodycki.github.io/aem-eds-kit/\",\n \"bugs\": {\n \"url\": \"https://github.com/piotrgodycki/aem-eds-kit/issues\"\n },\n \"dependencies\": {\n \"@inquirer/prompts\": \"^7.0.0\",\n \"chalk\": \"^5.4.0\",\n \"commander\": \"^13.0.0\",\n \"execa\": \"^9.5.0\",\n \"fast-xml-parser\": \"^5.11.2\",\n \"ora\": \"^8.1.0\",\n \"yaml\": \"^2.6.0\",\n \"zod\": \"^3.24.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.0\",\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^2.1.0\"\n },\n \"optionalDependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.29.0\"\n }\n}\n"],"mappings":"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","names":["chalk","path","existsSync","path","writeFile","path","existsSync","mkdir","writeFile","path","existsSync","readFile","writeFile","path","chalk","existsSync","readFile","path","walk","existsSync","readFile","path","XMLParser","existsSync","mkdir","writeFile","path","slug","existsSync","mkdir","writeFile","path","chalk","existsSync","readFile","path","mkdir","readFile","writeFile","path","chalk","ora","block","existsSync","readFile","homedir","path","existsSync","readFile","path","existsSync","path","existsSync","readFile","path","chalk","existsSync","readFile","writeFile","path","chalk","figma","previewBlock","existsSync","readFile","readdir","path","chalk","existsSync","mkdir","readFile","writeFile","path","chalk","block","existsSync","mkdir","writeFile","chalk","existsSync","readFile","readdir","path","summary","existsSync","readFile","readdir","stat","path","chalk","summary","existsSync","readFile","readdir","path","chalk","walk","preview_exports","chalk","ora","init_preview","chalk","ora","init_preview","preview","publish","existsSync","readdir","path","initProject","blockFromDesign","migrateComponent","scaffoldInteractive","createBlock","integrate","previewBlock","adminWizard","doctor","auditLoading","auditSecurity","figmaSetup","chalk","chalk","initProject","migrateComponent","createBlock","blockFromDesign","listBlocks","previewBlock","scaffoldInteractive","scaffoldUe","scaffoldBlocks","scaffoldCi","integrate","figmaSetup","doctor","auditLoading","auditSecurity","adminWizard","preview","publish","mainMenu"]}