oh-my-design-cli 0.1.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/post-edit-watch.cjs +99 -0
- package/.claude/hooks/session-end-foldin.cjs +96 -0
- package/.claude/hooks/session-state-loader.cjs +64 -0
- package/.claude/hooks/skill-activation.cjs +73 -0
- package/.claude/settings.json +55 -0
- package/.claude/skills/skill-rules.json +87 -0
- package/AGENTS.md +111 -0
- package/README.md +75 -202
- package/agents/AGENT.md +53 -0
- package/agents/omd-3d-blender.md +269 -0
- package/agents/omd-a11y-auditor.md +97 -0
- package/agents/omd-asset-curator.md +260 -0
- package/agents/omd-critic.md +181 -0
- package/agents/omd-master.md +548 -0
- package/agents/omd-microcopy.md +63 -0
- package/agents/omd-persona-tester.md +118 -0
- package/agents/omd-ui-junior.md +129 -0
- package/agents/omd-ux-engineer.md +265 -0
- package/agents/omd-ux-researcher.md +62 -0
- package/agents/omd-ux-writer.md +181 -0
- package/data/opt-out-corpus.json +141 -0
- package/data/reference-fingerprints.json +1495 -0
- package/dist/bin/oh-my-design.js +3 -818
- package/dist/bin/oh-my-design.js.map +1 -1
- package/dist/install-skills-SVIYKXOE.js +442 -0
- package/dist/install-skills-SVIYKXOE.js.map +1 -0
- package/package.json +23 -23
- package/scripts/context.cjs +91 -0
- package/scripts/postinstall.cjs +54 -0
- package/skills/omd-apply/SKILL.md +64 -53
- package/skills/omd-harness/SKILL.md +271 -0
- package/skills/omd-learn/SKILL.md +55 -35
- package/skills/omd-remember/SKILL.md +93 -15
- package/skills/omd-sync/SKILL.md +140 -16
- package/dist/chunk-6YNSV3VY.js +0 -35
- package/dist/chunk-6YNSV3VY.js.map +0 -1
- package/dist/chunk-MHFYGZSO.js +0 -337
- package/dist/chunk-MHFYGZSO.js.map +0 -1
- package/dist/chunk-N2JG6N4Q.js +0 -264
- package/dist/chunk-N2JG6N4Q.js.map +0 -1
- package/dist/chunk-OOQQEUGX.js +0 -46
- package/dist/chunk-OOQQEUGX.js.map +0 -1
- package/dist/chunk-OR5DHENY.js +0 -250
- package/dist/chunk-OR5DHENY.js.map +0 -1
- package/dist/customizer-CM76752R.js +0 -8
- package/dist/customizer-CM76752R.js.map +0 -1
- package/dist/index.d.ts +0 -559
- package/dist/index.js +0 -3113
- package/dist/index.js.map +0 -1
- package/dist/init-UMM4XIV5.js +0 -675
- package/dist/init-UMM4XIV5.js.map +0 -1
- package/dist/install-skills-CM6VXFZJ.js +0 -152
- package/dist/install-skills-CM6VXFZJ.js.map +0 -1
- package/dist/learn-33LHKEJA.js +0 -140
- package/dist/learn-33LHKEJA.js.map +0 -1
- package/dist/reference-YMNAOXJQ.js +0 -47
- package/dist/reference-YMNAOXJQ.js.map +0 -1
- package/dist/reference-parser-TM3CJPNE.js +0 -10
- package/dist/reference-parser-TM3CJPNE.js.map +0 -1
- package/dist/remember-UAFA5B2O.js +0 -78
- package/dist/remember-UAFA5B2O.js.map +0 -1
- package/dist/sync-FDYRKNFE.js +0 -417
- package/dist/sync-FDYRKNFE.js.map +0 -1
- package/dist/templates/templates/design-md.hbs +0 -44
- package/dist/templates/templates/partials/agent-prompt-guide.hbs +0 -28
- package/dist/templates/templates/partials/color-palette.hbs +0 -49
- package/dist/templates/templates/partials/component-stylings.hbs +0 -28
- package/dist/templates/templates/partials/depth-elevation.hbs +0 -31
- package/dist/templates/templates/partials/dos-donts.hbs +0 -13
- package/dist/templates/templates/partials/layout.hbs +0 -30
- package/dist/templates/templates/partials/responsive.hbs +0 -25
- package/dist/templates/templates/partials/shadcn-tokens.hbs +0 -64
- package/dist/templates/templates/partials/typography.hbs +0 -43
- package/dist/templates/templates/partials/visual-theme.hbs +0 -26
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/color.ts","../src/utils/spacing.ts","../src/utils/typography.ts","../src/core/token-resolver.ts","../src/core/renderer.ts","../src/core/components.ts","../src/core/shadcn-mapper.ts","../src/core/preview-generator.ts","../src/core/reference-parser.ts","../src/core/customizer.ts","../src/presets/_base.ts","../src/presets/fintech-premium.ts","../src/presets/developer-dark.ts","../src/presets/productivity-warm.ts","../src/presets/data-dense.ts","../src/presets/playful-creative.ts","../src/presets/brutalist.ts","../src/presets/corporate-clean.ts","../src/presets/index.ts","../src/core/sync-marker.ts","../src/core/sync-lock.ts","../src/core/shims.ts","../src/core/preferences.ts","../src/core/agent-detect.ts","../src/core/vocabulary.ts","../src/core/recommend.ts","../src/core/apply-delta-stub.ts","../src/core/init-deprecate.ts"],"sourcesContent":["import type { ColorScale, SemanticColor } from '../core/types.js';\n\n// ── Hex ↔ HSL conversions ────────────────────────────────────────\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const h = hex.replace('#', '');\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n ];\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return (\n '#' +\n [r, g, b]\n .map((v) => Math.round(Math.max(0, Math.min(255, v))).toString(16).padStart(2, '0'))\n .join('')\n );\n}\n\nexport function hexToHsl(hex: string): [number, number, number] {\n const [r, g, b] = hexToRgb(hex).map((v) => v / 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [Math.round(h * 360), Math.round(s * 100), Math.round(l * 100)];\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sn = s / 100;\n const ln = l / 100;\n const a = sn * Math.min(ln, 1 - ln);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = ln - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color);\n };\n return rgbToHex(f(0), f(8), f(4));\n}\n\n/** Format HSL for shadcn CSS variables: \"210 40% 98%\" */\nexport function hslString(hex: string): string {\n const [h, s, l] = hexToHsl(hex);\n return `${h} ${s}% ${l}%`;\n}\n\n// ── Palette generation ───────────────────────────────────────────\n\n/** Generate a full 11-stop color scale from a single hex */\nexport function generateColorScale(hex: string): ColorScale {\n const [h, s] = hexToHsl(hex);\n\n const lightnesses: Record<keyof ColorScale, number> = {\n 50: 97, 100: 94, 200: 86, 300: 77,\n 400: 66, 500: 55, 600: 47, 700: 39,\n 800: 32, 900: 24, 950: 14,\n };\n\n const scale = {} as ColorScale;\n for (const [key, l] of Object.entries(lightnesses)) {\n (scale as unknown as Record<string, string>)[key] = hslToHex(h, s, l);\n }\n return scale;\n}\n\n/** Determine if a color is \"light\" (needs dark foreground) */\nexport function isLight(hex: string): boolean {\n const [, , l] = hexToHsl(hex);\n return l > 55;\n}\n\n/** Pick a contrasting foreground for a given background */\nexport function contrastForeground(bgHex: string): string {\n return isLight(bgHex) ? '#09090b' : '#fafafa';\n}\n\n/** Create a semantic color pair (base + auto-contrast foreground) */\nexport function semanticColor(base: string): SemanticColor {\n return { base, foreground: contrastForeground(base) };\n}\n\n/** Lighten a hex color by a percentage (0-100) */\nexport function lighten(hex: string, amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex(h, s, Math.min(100, l + amount));\n}\n\n/** Darken a hex color by a percentage (0-100) */\nexport function darken(hex: string, amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex(h, s, Math.max(0, l - amount));\n}\n\n/** Desaturate a color */\nexport function desaturate(hex: string, amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex(h, Math.max(0, s - amount), l);\n}\n\n/** Generate chart colors from primary by rotating hue */\nexport function generateChartColors(primaryHex: string): [string, string, string, string, string] {\n const [h, s, l] = hexToHsl(primaryHex);\n return [\n primaryHex,\n hslToHex((h + 40) % 360, s, l),\n hslToHex((h + 80) % 360, s, l),\n hslToHex((h + 160) % 360, s, l),\n hslToHex((h + 220) % 360, s, l),\n ];\n}\n","import type { Density, SpacingTokens } from '../core/types.js';\n\nconst SPACING_CONFIGS: Record<Density, { baseUnit: number; multiplier: number }> = {\n compact: { baseUnit: 4, multiplier: 1 },\n comfortable: { baseUnit: 4, multiplier: 1.5 },\n spacious: { baseUnit: 4, multiplier: 2 },\n};\n\nexport function generateSpacingTokens(density: Density): SpacingTokens {\n const { baseUnit, multiplier } = SPACING_CONFIGS[density];\n\n const steps = [0, 1, 2, 3, 4, 6, 8, 12, 16, 24];\n const scale = steps.map((s) => Math.round(s * baseUnit * multiplier));\n\n const px = (n: number) => `${n}px`;\n\n return {\n baseUnit: baseUnit * multiplier,\n scale,\n sectionGap: px(scale[8]),\n componentPadding: {\n sm: `${px(scale[2])} ${px(scale[3])}`,\n md: `${px(scale[3])} ${px(scale[4])}`,\n lg: `${px(scale[4])} ${px(scale[6])}`,\n },\n };\n}\n","import type { TypographyStyle, TypographyTokens } from '../core/types.js';\n\nconst FONT_STACKS: Record<TypographyStyle, { sans: string; mono: string; heading: string }> = {\n geometric: {\n sans: '\"Inter\", \"Geist\", ui-sans-serif, system-ui, sans-serif',\n mono: '\"JetBrains Mono\", \"Fira Code\", ui-monospace, monospace',\n heading: '\"Inter\", \"Geist\", ui-sans-serif, system-ui, sans-serif',\n },\n humanist: {\n sans: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: '\"SF Mono\", \"Cascadia Code\", ui-monospace, monospace',\n heading: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n },\n monospace: {\n sans: '\"JetBrains Mono\", \"Fira Code\", ui-monospace, monospace',\n mono: '\"JetBrains Mono\", \"Fira Code\", ui-monospace, monospace',\n heading: '\"JetBrains Mono\", \"Fira Code\", ui-monospace, monospace',\n },\n 'serif-accent': {\n sans: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: '\"SF Mono\", ui-monospace, monospace',\n heading: '\"Playfair Display\", \"Georgia\", \"Times New Roman\", serif',\n },\n};\n\nconst WEIGHT_PROFILES: Record<TypographyStyle, TypographyTokens['weight']> = {\n geometric: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n humanist: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n monospace: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n 'serif-accent': { normal: 400, medium: 500, semibold: 600, bold: 800 },\n};\n\nconst LETTER_SPACING: Record<TypographyStyle, TypographyTokens['letterSpacing']> = {\n geometric: { tight: '-0.025em', normal: '0em', wide: '0.05em' },\n humanist: { tight: '-0.01em', normal: '0em', wide: '0.025em' },\n monospace: { tight: '-0.02em', normal: '0em', wide: '0.1em' },\n 'serif-accent': { tight: '-0.02em', normal: '0.01em', wide: '0.075em' },\n};\n\nexport function generateTypographyTokens(style: TypographyStyle): TypographyTokens {\n return {\n fontFamily: FONT_STACKS[style],\n scale: {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n base: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.25rem', // 20px\n '2xl': '1.5rem', // 24px\n '3xl': '1.875rem', // 30px\n '4xl': '2.25rem', // 36px\n },\n weight: WEIGHT_PROFILES[style],\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75,\n },\n letterSpacing: LETTER_SPACING[style],\n };\n}\n","import type {\n UserPreferences,\n DesignTokens,\n ColorTokens,\n RadiusTokens,\n ShadowTokens,\n BorderTokens,\n Mood,\n Roundness,\n DepthStyle,\n} from './types.js';\nimport {\n generateColorScale,\n semanticColor,\n lighten,\n darken,\n desaturate,\n generateChartColors,\n hexToHsl,\n hslToHex,\n} from '../utils/color.js';\nimport { generateSpacingTokens } from '../utils/spacing.js';\nimport { generateTypographyTokens } from '../utils/typography.js';\n\n// ── Color Resolution ─────────────────────────────────────────────\n\ninterface MoodColorAdjustments {\n secondaryHueShift: number;\n accentHueShift: number;\n saturationMod: number;\n backgroundLightness: number;\n mutedSaturation: number;\n}\n\nconst MOOD_ADJUSTMENTS: Record<Mood, MoodColorAdjustments> = {\n clean: { secondaryHueShift: 0, accentHueShift: 30, saturationMod: -10, backgroundLightness: 100, mutedSaturation: 5 },\n warm: { secondaryHueShift: 20, accentHueShift: 40, saturationMod: 0, backgroundLightness: 99, mutedSaturation: 8 },\n bold: { secondaryHueShift: 180, accentHueShift: 60, saturationMod: 15, backgroundLightness: 100, mutedSaturation: 5 },\n minimal: { secondaryHueShift: 0, accentHueShift: 0, saturationMod: -20, backgroundLightness: 100, mutedSaturation: 3 },\n playful: { secondaryHueShift: 120, accentHueShift: 60, saturationMod: 10, backgroundLightness: 99, mutedSaturation: 10 },\n dark: { secondaryHueShift: 30, accentHueShift: 180, saturationMod: 5, backgroundLightness: 7, mutedSaturation: 10 },\n};\n\nfunction resolveColors(primaryHex: string, mood: Mood): ColorTokens {\n const adj = MOOD_ADJUSTMENTS[mood];\n const [h, s] = hexToHsl(primaryHex);\n const scale = generateColorScale(primaryHex);\n const isDark = mood === 'dark';\n\n const secondaryHex = hslToHex(\n (h + adj.secondaryHueShift) % 360,\n Math.max(0, Math.min(100, s + adj.saturationMod - 30)),\n isDark ? 20 : 96\n );\n const accentHex = hslToHex(\n (h + adj.accentHueShift) % 360,\n Math.max(0, Math.min(100, s + adj.saturationMod)),\n isDark ? 30 : 55\n );\n const mutedHex = hslToHex(h, adj.mutedSaturation, isDark ? 15 : 96);\n const bgHex = isDark\n ? hslToHex(h, 15, adj.backgroundLightness)\n : hslToHex(h, adj.mutedSaturation, adj.backgroundLightness);\n const fgHex = isDark ? '#fafafa' : '#09090b';\n const borderHex = isDark ? hslToHex(h, 10, 18) : hslToHex(h, 8, 90);\n\n return {\n primary: { ...semanticColor(primaryHex), scale },\n secondary: semanticColor(secondaryHex),\n accent: semanticColor(accentHex),\n muted: semanticColor(mutedHex),\n destructive: semanticColor('#ef4444'),\n background: bgHex,\n foreground: fgHex,\n card: semanticColor(isDark ? lighten(bgHex, 3) : '#ffffff'),\n popover: semanticColor(isDark ? lighten(bgHex, 5) : '#ffffff'),\n border: borderHex,\n input: isDark ? lighten(borderHex, 5) : darken(borderHex, 3),\n ring: primaryHex,\n chart: generateChartColors(primaryHex),\n };\n}\n\nfunction resolveDarkColors(primaryHex: string, mood: Mood): ColorTokens {\n // For dark mode, we force the dark mood adjustments\n return resolveColors(primaryHex, 'dark');\n}\n\n// ── Radius Resolution ────────────────────────────────────────────\n\nconst RADIUS_CONFIGS: Record<Roundness, RadiusTokens> = {\n sharp: { none: '0', sm: '0.125rem', md: '0.125rem', lg: '0.25rem', xl: '0.375rem', full: '9999px' },\n moderate: { none: '0', sm: '0.25rem', md: '0.375rem', lg: '0.5rem', xl: '0.75rem', full: '9999px' },\n rounded: { none: '0', sm: '0.375rem', md: '0.75rem', lg: '1rem', xl: '1.5rem', full: '9999px' },\n pill: { none: '0', sm: '0.5rem', md: '9999px', lg: '9999px', xl: '9999px', full: '9999px' },\n};\n\n// ── Shadow Resolution ────────────────────────────────────────────\n\nconst SHADOW_CONFIGS: Record<DepthStyle, ShadowTokens> = {\n flat: {\n none: 'none',\n sm: 'none',\n md: 'none',\n lg: 'none',\n xl: 'none',\n },\n subtle: {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.03)',\n md: '0 1px 3px 0 rgb(0 0 0 / 0.06), 0 1px 2px -1px rgb(0 0 0 / 0.06)',\n lg: '0 4px 6px -1px rgb(0 0 0 / 0.06), 0 2px 4px -2px rgb(0 0 0 / 0.06)',\n xl: '0 10px 15px -3px rgb(0 0 0 / 0.06), 0 4px 6px -4px rgb(0 0 0 / 0.06)',\n },\n layered: {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',\n lg: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n },\n dramatic: {\n none: 'none',\n sm: '0 1px 3px 0 rgb(0 0 0 / 0.12)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.15), 0 2px 4px -2px rgb(0 0 0 / 0.15)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.2), 0 4px 6px -4px rgb(0 0 0 / 0.2)',\n xl: '0 25px 50px -12px rgb(0 0 0 / 0.3)',\n },\n};\n\n// ── Border Resolution ────────────────────────────────────────────\n\nfunction resolveBorders(depth: DepthStyle, borderColor: string): BorderTokens {\n return {\n width: depth === 'flat' ? '1px' : '1px',\n style: 'solid',\n color: borderColor,\n };\n}\n\n// ── Main Resolver ────────────────────────────────────────────────\n\nexport function resolveTokens(prefs: UserPreferences): DesignTokens {\n const colors = resolveColors(prefs.primaryColor, prefs.mood);\n\n return {\n name: prefs.preset ?? 'Custom Design System',\n colors,\n typography: generateTypographyTokens(prefs.typography),\n spacing: generateSpacingTokens(prefs.density),\n radius: RADIUS_CONFIGS[prefs.roundness],\n shadows: SHADOW_CONFIGS[prefs.depth],\n borders: resolveBorders(prefs.depth, colors.border),\n components: {},\n darkColors: prefs.darkMode ? resolveDarkColors(prefs.primaryColor, prefs.mood) : undefined,\n };\n}\n","import Handlebars from 'handlebars';\nimport { readFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport type { TemplateContext } from './types.js';\nimport { hslString } from '../utils/color.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATE_DIR = join(__dirname, '..', 'templates');\n\n// ── Handlebars Helpers ───────────────────────────────────────────\n\nfunction registerHelpers() {\n Handlebars.registerHelper('eq', (a: unknown, b: unknown) => a === b);\n\n Handlebars.registerHelper('hsl', (hex: string) => {\n if (typeof hex !== 'string') return '';\n return hslString(hex);\n });\n\n Handlebars.registerHelper('chartColor', (arr: string[], index: number) => {\n if (Array.isArray(arr) && typeof index === 'number') {\n return arr[index] ?? '';\n }\n return '';\n });\n\n Handlebars.registerHelper('multiply', (a: number, b: number) => a * b);\n\n Handlebars.registerHelper('spacingUsage', (index: number) => {\n const usages = [\n 'None',\n 'Tight inner gaps',\n 'Icon-to-text gap, inline padding',\n 'Small component padding',\n 'Default component padding',\n 'Component group spacing',\n 'Section inner padding',\n 'Large section padding',\n 'Section gap',\n 'Page-level section spacing',\n ];\n return usages[index] ?? '';\n });\n}\n\n// ── Partial Registration ─────────────────────────────────────────\n\nfunction registerPartials() {\n const partialNames = [\n 'visual-theme',\n 'color-palette',\n 'typography',\n 'component-stylings',\n 'layout',\n 'depth-elevation',\n 'dos-donts',\n 'responsive',\n 'agent-prompt-guide',\n 'shadcn-tokens',\n ];\n\n for (const name of partialNames) {\n const content = readFileSync(join(TEMPLATE_DIR, 'partials', `${name}.hbs`), 'utf-8');\n Handlebars.registerPartial(name, content);\n }\n}\n\n// ── Render ───────────────────────────────────────────────────────\n\nlet initialized = false;\n\nexport function renderDesignMd(context: TemplateContext): string {\n if (!initialized) {\n registerHelpers();\n registerPartials();\n initialized = true;\n }\n\n const mainTemplate = readFileSync(join(TEMPLATE_DIR, 'design-md.hbs'), 'utf-8');\n const template = Handlebars.compile(mainTemplate);\n const result = template(context);\n\n // Clean up extra blank lines\n return result.replace(/\\n{3,}/g, '\\n\\n').trim() + '\\n';\n}\n","import type { ComponentName, ComponentTokens, DesignTokens } from './types.js';\n\ntype ComponentGenerator = (tokens: DesignTokens) => ComponentTokens;\n\nconst COMPONENT_TITLES: Record<ComponentName, string> = {\n button: 'Button',\n card: 'Card',\n dialog: 'Dialog / Modal',\n dropdown: 'Dropdown Menu',\n table: 'Table',\n input: 'Input / Form Field',\n navigation: 'Navigation / Sidebar',\n badge: 'Badge / Tag',\n 'floating-button': 'Floating Action Button',\n toast: 'Toast / Notification',\n tabs: 'Tabs',\n select: 'Select',\n};\n\nconst generators: Record<ComponentName, ComponentGenerator> = {\n button: (t) => ({\n description: 'Primary interaction element. Use clear, action-oriented labels.',\n variants: {\n default: { background: t.colors.primary.base, foreground: t.colors.primary.foreground, radius: t.radius.md },\n secondary: { background: t.colors.secondary.base, foreground: t.colors.secondary.foreground, border: t.colors.border, radius: t.radius.md },\n outline: { background: 'transparent', foreground: t.colors.foreground, border: t.colors.border, radius: t.radius.md },\n ghost: { background: 'transparent', foreground: t.colors.foreground, radius: t.radius.md },\n destructive: { background: t.colors.destructive.base, foreground: t.colors.destructive.foreground, radius: t.radius.md },\n },\n states: {\n hover: 'Reduce opacity to 90% or shift background 1 stop darker',\n active: 'Scale down to 98% and shift background 2 stops darker',\n focus: `Ring 2px offset-2 using ring color (${t.colors.ring})`,\n disabled: 'Opacity 50%, pointer-events none',\n },\n sizes: {\n sm: { height: '32px', padding: t.spacing.componentPadding.sm, fontSize: t.typography.scale.sm },\n md: { height: '40px', padding: t.spacing.componentPadding.md, fontSize: t.typography.scale.sm },\n lg: { height: '48px', padding: t.spacing.componentPadding.lg, fontSize: t.typography.scale.base },\n },\n }),\n\n card: (t) => ({\n description: 'Container for grouped content. Provides visual separation from the page background.',\n variants: {\n default: { background: t.colors.card.base, foreground: t.colors.card.foreground, border: t.colors.border, shadow: t.shadows.sm, radius: t.radius.lg },\n elevated: { background: t.colors.card.base, foreground: t.colors.card.foreground, shadow: t.shadows.md, radius: t.radius.lg },\n outline: { background: 'transparent', foreground: t.colors.foreground, border: t.colors.border, radius: t.radius.lg },\n },\n states: {\n hover: 'Shift shadow up one level (sm → md) for interactive cards',\n },\n }),\n\n dialog: (t) => ({\n description: 'Modal overlay for focused interactions. Always includes a backdrop.',\n variants: {\n default: { background: t.colors.card.base, foreground: t.colors.card.foreground, shadow: t.shadows.xl, radius: t.radius.lg },\n },\n states: {\n hover: 'N/A',\n focus: 'Trap focus within the dialog. Highlight focusable elements with ring.',\n },\n }),\n\n dropdown: (t) => ({\n description: 'Contextual menu triggered by a button or right-click.',\n variants: {\n default: { background: t.colors.popover.base, foreground: t.colors.popover.foreground, border: t.colors.border, shadow: t.shadows.lg, radius: t.radius.md },\n },\n states: {\n hover: `Item background shifts to accent (${t.colors.accent.base})`,\n focus: `Item receives subtle background tint and focus ring`,\n },\n sizes: {\n item: { height: '32px', padding: t.spacing.componentPadding.sm, fontSize: t.typography.scale.sm },\n },\n }),\n\n table: (t) => ({\n description: 'Data display in rows and columns. Prioritize scanability and alignment.',\n variants: {\n default: { background: t.colors.card.base, foreground: t.colors.foreground, border: t.colors.border, radius: t.radius.lg },\n },\n states: {\n hover: `Row background shifts to muted (${t.colors.muted.base})`,\n },\n sizes: {\n cell: { height: '44px', padding: t.spacing.componentPadding.sm, fontSize: t.typography.scale.sm },\n header: { height: '44px', padding: t.spacing.componentPadding.sm, fontSize: t.typography.scale.sm },\n },\n }),\n\n input: (t) => ({\n description: 'Text input, textarea, and form controls.',\n variants: {\n default: { background: t.colors.background, foreground: t.colors.foreground, border: t.colors.input, radius: t.radius.md },\n error: { background: t.colors.background, foreground: t.colors.foreground, border: t.colors.destructive.base, radius: t.radius.md },\n },\n states: {\n hover: 'Border darkens by 1 stop',\n focus: `Border shifts to ring color (${t.colors.ring}), add focus ring`,\n disabled: 'Background shifts to muted, opacity 60%',\n },\n sizes: {\n sm: { height: '32px', padding: t.spacing.componentPadding.sm, fontSize: t.typography.scale.sm },\n md: { height: '40px', padding: t.spacing.componentPadding.md, fontSize: t.typography.scale.sm },\n lg: { height: '48px', padding: t.spacing.componentPadding.lg, fontSize: t.typography.scale.base },\n },\n }),\n\n navigation: (t) => ({\n description: 'Primary navigation, sidebar, or top bar.',\n variants: {\n default: { background: t.colors.card.base, foreground: t.colors.foreground, border: t.colors.border },\n },\n states: {\n hover: `Item background shifts to accent (${t.colors.accent.base})`,\n active: `Item receives primary color indicator and semibold weight`,\n },\n sizes: {\n item: { height: '40px', padding: t.spacing.componentPadding.md, fontSize: t.typography.scale.sm },\n },\n }),\n\n badge: (t) => ({\n description: 'Small label for status, category, or count.',\n variants: {\n default: { background: t.colors.primary.base, foreground: t.colors.primary.foreground, radius: t.radius.full },\n secondary: { background: t.colors.secondary.base, foreground: t.colors.secondary.foreground, radius: t.radius.full },\n outline: { background: 'transparent', foreground: t.colors.foreground, border: t.colors.border, radius: t.radius.full },\n destructive: { background: t.colors.destructive.base, foreground: t.colors.destructive.foreground, radius: t.radius.full },\n },\n states: {},\n sizes: {\n sm: { height: '20px', padding: '2px 8px', fontSize: t.typography.scale.xs },\n md: { height: '24px', padding: '2px 10px', fontSize: t.typography.scale.sm },\n },\n }),\n\n 'floating-button': (t) => ({\n description: 'Fixed-position action button, typically in the bottom-right corner.',\n variants: {\n default: { background: t.colors.primary.base, foreground: t.colors.primary.foreground, shadow: t.shadows.lg, radius: t.radius.full },\n },\n states: {\n hover: 'Scale to 105%, shadow increases one level',\n active: 'Scale to 95%',\n focus: `Focus ring with offset (${t.colors.ring})`,\n },\n sizes: {\n md: { height: '48px', padding: '12px', fontSize: t.typography.scale.base },\n lg: { height: '56px', padding: '16px', fontSize: t.typography.scale.lg },\n },\n }),\n\n toast: (t) => ({\n description: 'Temporary notification appearing at screen edge.',\n variants: {\n default: { background: t.colors.card.base, foreground: t.colors.card.foreground, border: t.colors.border, shadow: t.shadows.lg, radius: t.radius.md },\n success: { background: '#10b981', foreground: '#ffffff', shadow: t.shadows.lg, radius: t.radius.md },\n error: { background: t.colors.destructive.base, foreground: t.colors.destructive.foreground, shadow: t.shadows.lg, radius: t.radius.md },\n },\n states: {},\n }),\n\n tabs: (t) => ({\n description: 'Segmented navigation for switching between content panels.',\n variants: {\n default: { background: t.colors.muted.base, foreground: t.colors.muted.foreground, radius: t.radius.md },\n active: { background: t.colors.background, foreground: t.colors.foreground, shadow: t.shadows.sm, radius: t.radius.md },\n },\n states: {\n hover: `Background shifts to accent (${t.colors.accent.base})`,\n },\n sizes: {\n item: { height: '36px', padding: t.spacing.componentPadding.sm, fontSize: t.typography.scale.sm },\n },\n }),\n\n select: (t) => ({\n description: 'Dropdown selector for choosing from a list of options.',\n variants: {\n default: { background: t.colors.background, foreground: t.colors.foreground, border: t.colors.input, radius: t.radius.md },\n },\n states: {\n hover: 'Border darkens by 1 stop',\n focus: `Border shifts to ring color (${t.colors.ring}), add focus ring`,\n disabled: 'Background shifts to muted, opacity 60%',\n },\n sizes: {\n sm: { height: '32px', padding: t.spacing.componentPadding.sm, fontSize: t.typography.scale.sm },\n md: { height: '40px', padding: t.spacing.componentPadding.md, fontSize: t.typography.scale.sm },\n },\n }),\n};\n\nexport function generateComponentTokens(\n componentNames: ComponentName[],\n tokens: DesignTokens,\n): Array<{ name: ComponentName; title: string } & ComponentTokens> {\n return componentNames.map((name) => ({\n name,\n title: COMPONENT_TITLES[name],\n ...generators[name](tokens),\n }));\n}\n","import type { DesignTokens, ColorTokens } from './types.js';\nimport { hslString } from '../utils/color.js';\n\nexport interface ShadcnTheme {\n light: Record<string, string>;\n dark?: Record<string, string>;\n}\n\nfunction mapColorTokens(colors: ColorTokens, radius: string): Record<string, string> {\n return {\n '--background': hslString(colors.background),\n '--foreground': hslString(colors.foreground),\n '--card': hslString(colors.card.base),\n '--card-foreground': hslString(colors.card.foreground),\n '--popover': hslString(colors.popover.base),\n '--popover-foreground': hslString(colors.popover.foreground),\n '--primary': hslString(colors.primary.base),\n '--primary-foreground': hslString(colors.primary.foreground),\n '--secondary': hslString(colors.secondary.base),\n '--secondary-foreground': hslString(colors.secondary.foreground),\n '--muted': hslString(colors.muted.base),\n '--muted-foreground': hslString(colors.muted.foreground),\n '--accent': hslString(colors.accent.base),\n '--accent-foreground': hslString(colors.accent.foreground),\n '--destructive': hslString(colors.destructive.base),\n '--destructive-foreground': hslString(colors.destructive.foreground),\n '--border': hslString(colors.border),\n '--input': hslString(colors.input),\n '--ring': hslString(colors.ring),\n '--radius': radius,\n '--chart-1': hslString(colors.chart[0]),\n '--chart-2': hslString(colors.chart[1]),\n '--chart-3': hslString(colors.chart[2]),\n '--chart-4': hslString(colors.chart[3]),\n '--chart-5': hslString(colors.chart[4]),\n '--sidebar-background': hslString(colors.card.base),\n '--sidebar-foreground': hslString(colors.foreground),\n '--sidebar-primary': hslString(colors.primary.base),\n '--sidebar-primary-foreground': hslString(colors.primary.foreground),\n '--sidebar-accent': hslString(colors.accent.base),\n '--sidebar-accent-foreground': hslString(colors.accent.foreground),\n '--sidebar-border': hslString(colors.border),\n '--sidebar-ring': hslString(colors.ring),\n };\n}\n\nexport function mapToShadcn(tokens: DesignTokens): ShadcnTheme {\n const theme: ShadcnTheme = {\n light: mapColorTokens(tokens.colors, tokens.radius.md),\n };\n\n if (tokens.darkColors) {\n theme.dark = mapColorTokens(tokens.darkColors, tokens.radius.md);\n }\n\n return theme;\n}\n\nexport function shadcnToCss(theme: ShadcnTheme): string {\n const indent = ' ';\n const lines: string[] = ['@layer base {', ' :root {'];\n\n for (const [key, value] of Object.entries(theme.light)) {\n lines.push(`${indent}${key}: ${value};`);\n }\n lines.push(' }');\n\n if (theme.dark) {\n lines.push('', ' .dark {');\n for (const [key, value] of Object.entries(theme.dark)) {\n lines.push(`${indent}${key}: ${value};`);\n }\n lines.push(' }');\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/** Generate CSS custom properties as inline style string (for preview HTML) */\nexport function shadcnToInlineVars(vars: Record<string, string>): string {\n return Object.entries(vars)\n .map(([key, value]) => `${key}: ${value}`)\n .join('; ');\n}\n","import type { PreviewData } from './customizer.js';\nimport {\n generateColorScale,\n contrastForeground,\n hslString,\n hexToHsl,\n hslToHex,\n lighten,\n darken,\n generateChartColors,\n} from '../utils/color.js';\n\nexport function generatePreviewHtml(data: PreviewData): string {\n const {\n name, basedOn, primary, background, foreground, font, headingWeight,\n radius, colors, darkMode, shadcnCss,\n } = data;\n\n const isLightBg = isLight(background);\n const scale = generateColorScale(primary);\n const radiusPx = radius === '9999px' ? '24px' : radius;\n const borderColor = colors.border;\n const accent = colors.accent;\n const muted = colors.muted;\n const chart = colors.chart;\n\n // Generate dark mode vars for CSS\n const darkBg = hslToHex(hexToHsl(primary)[0], 15, 7);\n const darkFg = '#fafafa';\n const darkBorder = hslToHex(hexToHsl(primary)[0], 10, 18);\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>${esc(name)} — Design System Preview</title>\n<style>\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n :root {\n --bg: ${background};\n --fg: ${foreground};\n --primary: ${primary};\n --primary-fg: ${contrastForeground(primary)};\n --accent: ${accent};\n --muted: ${muted};\n --muted-fg: ${lighten(foreground, 40)};\n --border: ${borderColor};\n --destructive: #ef4444;\n --card: ${isLightBg ? '#ffffff' : lighten(background, 3)};\n --radius: ${radiusPx};\n }\n\n .dark {\n --bg: ${darkBg};\n --fg: ${darkFg};\n --card: ${lighten(darkBg, 3)};\n --muted: ${hslToHex(hexToHsl(primary)[0], 10, 15)};\n --muted-fg: ${darken(darkFg, 35)};\n --border: ${darkBorder};\n }\n\n body {\n font-family: \"${font}\", \"Inter\", system-ui, sans-serif;\n background: var(--bg);\n color: var(--fg);\n line-height: 1.5;\n transition: background 0.25s, color 0.25s;\n }\n\n .shell { max-width: 1100px; margin: 0 auto; padding: 40px 24px 80px; }\n\n /* ── Header ─────── */\n .header {\n display: flex; justify-content: space-between; align-items: center;\n padding-bottom: 24px; margin-bottom: 40px;\n border-bottom: 1px solid var(--border);\n }\n .header h1 {\n font-size: 2rem; font-weight: ${headingWeight};\n letter-spacing: -0.02em;\n }\n .header .sub {\n font-size: 0.875rem; color: var(--muted-fg); margin-top: 4px;\n }\n .controls { display: flex; gap: 8px; }\n .ctrl-btn {\n padding: 8px 16px; border-radius: var(--radius);\n font-size: 0.8125rem; font-family: inherit; cursor: pointer;\n transition: all 0.15s; border: 1px solid var(--border);\n background: var(--card); color: var(--fg);\n }\n .ctrl-btn:hover { opacity: 0.85; }\n .ctrl-btn.primary { background: var(--primary); color: var(--primary-fg); border-color: transparent; }\n\n /* ── Sections ───── */\n .section { margin-bottom: 48px; }\n .section-title {\n font-size: 1.375rem; font-weight: ${headingWeight};\n letter-spacing: -0.01em; margin-bottom: 16px;\n }\n .section-sub { font-size: 0.8125rem; color: var(--muted-fg); margin-bottom: 16px; }\n\n /* ── Color Scale ── */\n .scale-row {\n display: flex; border-radius: var(--radius); overflow: hidden;\n border: 1px solid var(--border); margin-bottom: 24px;\n }\n .scale-stop {\n flex: 1; padding: 28px 4px 8px; text-align: center;\n font-size: 10px; font-family: monospace; cursor: pointer;\n transition: transform 0.1s; position: relative;\n }\n .scale-stop:hover { z-index: 1; transform: scaleY(1.12); }\n .scale-stop .lbl { display: block; opacity: 0.7; margin-bottom: 2px; }\n .scale-stop .hex {\n background: rgba(0,0,0,0.2); color: #fff;\n padding: 1px 4px; border-radius: 3px; font-size: 9px;\n }\n\n /* ── Color Chips ── */\n .chip-grid {\n display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px;\n }\n .chip {\n border-radius: var(--radius); overflow: hidden;\n border: 1px solid var(--border); cursor: pointer;\n transition: transform 0.15s, box-shadow 0.15s;\n }\n .chip:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.1); }\n .chip .sw { height: 64px; display: flex; align-items: end; padding: 6px; }\n .chip .sw span {\n font-size: 10px; font-family: monospace;\n background: rgba(0,0,0,0.25); color: #fff;\n padding: 1px 5px; border-radius: 3px;\n }\n .chip .inf { padding: 8px; background: var(--card); }\n .chip .inf .n { font-size: 0.75rem; font-weight: 500; }\n .chip .inf .v { font-size: 10px; color: var(--muted-fg); font-family: monospace; }\n\n /* ── Typography ── */\n .type-rows { display: flex; flex-direction: column; gap: 8px; }\n .type-row {\n display: flex; align-items: baseline; gap: 16px;\n padding: 12px 16px; border-radius: var(--radius);\n background: var(--card); border: 1px solid var(--border);\n }\n .type-row .lbl {\n min-width: 48px; font-size: 0.75rem; color: var(--muted-fg);\n font-family: monospace; flex-shrink: 0;\n }\n .type-row .sample { flex: 1; }\n\n /* ── Components ── */\n .comp-card {\n padding: 24px; border-radius: var(--radius);\n background: var(--card); border: 1px solid var(--border);\n margin-bottom: 16px;\n }\n .comp-card h3 { font-size: 1rem; font-weight: 600; margin-bottom: 16px; }\n .comp-row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 12px; }\n\n .btn {\n display: inline-flex; align-items: center; justify-content: center;\n font-family: inherit; font-weight: 500; cursor: pointer;\n transition: all 0.15s; border: none; font-size: 0.8125rem;\n padding: 8px 16px; height: 36px; border-radius: var(--radius);\n }\n .btn-primary { background: var(--primary); color: var(--primary-fg); }\n .btn-secondary { background: var(--muted); color: var(--fg); }\n .btn-outline { background: transparent; color: var(--fg); border: 1px solid var(--border); }\n .btn-ghost { background: transparent; color: var(--fg); }\n .btn-destructive { background: var(--destructive); color: #fff; }\n .btn:hover { opacity: 0.9; }\n\n .badge {\n display: inline-flex; font-size: 0.6875rem; font-weight: 500;\n padding: 2px 10px; border-radius: 9999px;\n }\n .badge-primary { background: var(--primary); color: var(--primary-fg); }\n .badge-secondary { background: var(--muted); color: var(--fg); }\n .badge-outline { background: transparent; color: var(--fg); border: 1px solid var(--border); }\n\n .input-demo {\n width: 100%; max-width: 320px; font-family: inherit;\n background: var(--bg); color: var(--fg);\n border: 1px solid var(--border); border-radius: var(--radius);\n padding: 8px 12px; font-size: 0.8125rem; outline: none;\n transition: border-color 0.15s;\n }\n .input-demo:focus {\n border-color: var(--primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 20%, transparent);\n }\n\n .demo-table {\n width: 100%; border-collapse: collapse; font-size: 0.8125rem;\n }\n .demo-table th, .demo-table td {\n padding: 10px 12px; text-align: left;\n border-bottom: 1px solid var(--border);\n }\n .demo-table th {\n font-weight: 500; color: var(--muted-fg);\n font-size: 0.75rem; text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .demo-table tr:hover td { background: var(--muted); }\n\n .demo-card {\n padding: 20px; border-radius: var(--radius);\n background: var(--card); border: 1px solid var(--border);\n max-width: 340px; box-shadow: 0 1px 3px rgba(0,0,0,0.06);\n }\n .demo-card h4 { font-weight: 600; margin-bottom: 6px; }\n .demo-card p { font-size: 0.8125rem; color: var(--muted-fg); margin-bottom: 14px; }\n\n .demo-dialog {\n padding: 24px; border-radius: var(--radius);\n background: var(--card); box-shadow: 0 20px 40px rgba(0,0,0,0.15);\n max-width: 400px; border: 1px solid var(--border);\n }\n .demo-dialog h4 { font-weight: 600; margin-bottom: 8px; }\n .demo-dialog p { font-size: 0.8125rem; color: var(--muted-fg); margin-bottom: 16px; }\n .demo-dialog .acts { display: flex; justify-content: flex-end; gap: 8px; }\n\n .tabs {\n display: flex; background: var(--muted); border-radius: var(--radius); padding: 4px; gap: 2px;\n }\n .tab {\n padding: 6px 14px; border-radius: calc(var(--radius) - 2px);\n font-size: 0.8125rem; font-family: inherit; font-weight: 500;\n border: none; cursor: pointer; background: transparent;\n color: var(--muted-fg); transition: all 0.15s;\n }\n .tab.active {\n background: var(--bg); color: var(--fg);\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n }\n .tab:hover:not(.active) { color: var(--fg); }\n\n /* ── CSS Block ──── */\n .css-block {\n position: relative; background: var(--card);\n border: 1px solid var(--border); border-radius: var(--radius);\n overflow: hidden;\n }\n .css-block pre {\n padding: 20px; overflow-x: auto; font-family: monospace;\n font-size: 11px; line-height: 1.6; color: var(--fg);\n }\n .css-block .copy-css { position: absolute; top: 8px; right: 8px; }\n\n /* ── Spacing ────── */\n .spacing-vis {\n display: flex; align-items: end; gap: 8px; padding: 24px;\n background: var(--card); border: 1px solid var(--border);\n border-radius: var(--radius);\n }\n .sp-bar { display: flex; flex-direction: column; align-items: center; gap: 4px; }\n .sp-bar .bar { background: var(--primary); border-radius: 2px; width: 28px; }\n .sp-bar .val { font-size: 10px; font-family: monospace; color: var(--muted-fg); }\n\n /* ── Radius ─────── */\n .radius-grid { display: flex; gap: 16px; flex-wrap: wrap; }\n .radius-demo {\n width: 72px; height: 72px; background: var(--primary);\n display: flex; align-items: center; justify-content: center;\n color: var(--primary-fg); font-size: 0.6875rem; font-family: monospace;\n }\n\n /* ── Toast ──────── */\n .toast-popup {\n position: fixed; bottom: 24px; right: 24px;\n padding: 10px 20px; background: var(--fg); color: var(--bg);\n border-radius: var(--radius); font-size: 0.8125rem;\n box-shadow: 0 8px 20px rgba(0,0,0,0.15);\n transform: translateY(100px); opacity: 0;\n transition: all 0.3s; z-index: 100;\n }\n .toast-popup.show { transform: translateY(0); opacity: 1; }\n\n @media (max-width: 768px) {\n .shell { padding: 16px 12px 48px; }\n .header { flex-direction: column; gap: 12px; align-items: flex-start; }\n .chip-grid { grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); }\n }\n</style>\n</head>\n<body>\n<div class=\"shell\">\n\n <div class=\"header\">\n <div>\n <h1>${esc(name)}</h1>\n <div class=\"sub\">Based on ${esc(basedOn)} · Generated by oh-my-design</div>\n </div>\n <div class=\"controls\">\n ${darkMode ? '<button class=\"ctrl-btn\" onclick=\"toggleTheme()\" id=\"theme-btn\">🌙 Dark</button>' : ''}\n <button class=\"ctrl-btn primary\" onclick=\"copyCss()\">Copy CSS</button>\n </div>\n </div>\n\n <!-- Primary Scale -->\n <div class=\"section\">\n <h2 class=\"section-title\">Primary Color Scale</h2>\n <div class=\"section-sub\">Click to copy hex value</div>\n <div class=\"scale-row\">\n${Object.entries(scale).map(([stop, hex]) =>\n ` <div class=\"scale-stop\" style=\"background:${hex};color:${isLight(hex) ? '#000' : '#fff'}\" onclick=\"copy('${hex}')\">\n <span class=\"lbl\">${stop}</span><span class=\"hex\">${hex}</span>\n </div>`).join('\\n')}\n </div>\n </div>\n\n <!-- Semantic Colors -->\n <div class=\"section\">\n <h2 class=\"section-title\">Semantic Colors</h2>\n <div class=\"chip-grid\">\n${[\n { n: 'Primary', bg: primary, v: '--primary' },\n { n: 'Accent', bg: accent, v: '--accent' },\n { n: 'Muted', bg: muted, v: '--muted' },\n { n: 'Destructive', bg: '#ef4444', v: '--destructive' },\n { n: 'Background', bg: background, v: '--background' },\n { n: 'Foreground', bg: foreground, v: '--foreground' },\n { n: 'Border', bg: borderColor, v: '--border' },\n { n: 'Card', bg: isLightBg ? '#ffffff' : lighten(background, 3), v: '--card' },\n].map((c) => ` <div class=\"chip\" onclick=\"copy('${c.bg}')\">\n <div class=\"sw\" style=\"background:${c.bg}\"><span>${c.bg}</span></div>\n <div class=\"inf\"><div class=\"n\">${c.n}</div><div class=\"v\">${c.v}</div></div>\n </div>`).join('\\n')}\n </div>\n </div>\n\n <!-- Chart Colors -->\n <div class=\"section\">\n <h2 class=\"section-title\">Chart Colors</h2>\n <div style=\"display:flex;gap:8px;\">\n${chart.map((c, i) => ` <div style=\"width:48px;height:48px;border-radius:var(--radius);background:${c};cursor:pointer;\" onclick=\"copy('${c}')\" title=\"Chart ${i + 1}: ${c}\"></div>`).join('\\n')}\n </div>\n </div>\n\n <!-- Typography -->\n <div class=\"section\">\n <h2 class=\"section-title\">Typography</h2>\n <div class=\"type-rows\">\n <div class=\"type-row\">\n <span class=\"lbl\">H1</span>\n <span class=\"sample\" style=\"font-size:2.25rem;font-weight:${headingWeight};letter-spacing:-0.02em;line-height:1.2\">Page Title Heading</span>\n </div>\n <div class=\"type-row\">\n <span class=\"lbl\">H2</span>\n <span class=\"sample\" style=\"font-size:1.875rem;font-weight:${headingWeight};letter-spacing:-0.01em;line-height:1.25\">Section Heading</span>\n </div>\n <div class=\"type-row\">\n <span class=\"lbl\">H3</span>\n <span class=\"sample\" style=\"font-size:1.5rem;font-weight:${headingWeight};line-height:1.3\">Subsection</span>\n </div>\n <div class=\"type-row\">\n <span class=\"lbl\">body</span>\n <span class=\"sample\" style=\"font-size:1rem;\">The quick brown fox jumps over the lazy dog. 다람쥐 헌 쳇바퀴에 타고파.</span>\n </div>\n <div class=\"type-row\">\n <span class=\"lbl\">sm</span>\n <span class=\"sample\" style=\"font-size:0.875rem;color:var(--muted-fg)\">Secondary text, labels, and metadata</span>\n </div>\n <div class=\"type-row\">\n <span class=\"lbl\">mono</span>\n <span class=\"sample\" style=\"font-family:monospace;font-size:0.875rem\">const theme = generateDesignSystem();</span>\n </div>\n </div>\n </div>\n\n <!-- Radius -->\n <div class=\"section\">\n <h2 class=\"section-title\">Border Radius</h2>\n <div class=\"radius-grid\">\n <div style=\"text-align:center\"><div class=\"radius-demo\" style=\"border-radius:0\">0</div><div style=\"font-size:10px;margin-top:4px;color:var(--muted-fg)\">none</div></div>\n <div style=\"text-align:center\"><div class=\"radius-demo\" style=\"border-radius:${radiusPx}\">${radiusPx}</div><div style=\"font-size:10px;margin-top:4px;color:var(--muted-fg)\">base</div></div>\n <div style=\"text-align:center\"><div class=\"radius-demo\" style=\"border-radius:${parseInt(radiusPx) * 2}px\">${parseInt(radiusPx) * 2}px</div><div style=\"font-size:10px;margin-top:4px;color:var(--muted-fg)\">lg</div></div>\n <div style=\"text-align:center\"><div class=\"radius-demo\" style=\"border-radius:9999px\">pill</div><div style=\"font-size:10px;margin-top:4px;color:var(--muted-fg)\">full</div></div>\n </div>\n </div>\n\n <!-- Components -->\n <div class=\"section\">\n <h2 class=\"section-title\">Components</h2>\n\n <!-- Buttons -->\n <div class=\"comp-card\">\n <h3>Buttons</h3>\n <div class=\"comp-row\">\n <button class=\"btn btn-primary\">Primary</button>\n <button class=\"btn btn-secondary\">Secondary</button>\n <button class=\"btn btn-outline\">Outline</button>\n <button class=\"btn btn-ghost\">Ghost</button>\n <button class=\"btn btn-destructive\">Delete</button>\n </div>\n </div>\n\n <!-- Badges -->\n <div class=\"comp-card\">\n <h3>Badges</h3>\n <div class=\"comp-row\">\n <span class=\"badge badge-primary\">Active</span>\n <span class=\"badge badge-secondary\">Draft</span>\n <span class=\"badge badge-outline\">Archived</span>\n </div>\n </div>\n\n <!-- Input -->\n <div class=\"comp-card\">\n <h3>Input</h3>\n <div style=\"display:flex;flex-direction:column;gap:12px;max-width:400px;\">\n <div>\n <label style=\"font-size:0.8125rem;font-weight:500;display:block;margin-bottom:4px;\">Email</label>\n <input class=\"input-demo\" type=\"email\" placeholder=\"you@example.com\">\n </div>\n <div>\n <label style=\"font-size:0.8125rem;font-weight:500;display:block;margin-bottom:4px;\">Password</label>\n <input class=\"input-demo\" type=\"password\" placeholder=\"••••••••\">\n </div>\n </div>\n </div>\n\n <!-- Card -->\n <div class=\"comp-card\">\n <h3>Card</h3>\n <div class=\"comp-row\" style=\"align-items:stretch;\">\n <div class=\"demo-card\">\n <h4>Project Overview</h4>\n <p>A summary card showing key metrics and status for your project.</p>\n <button class=\"btn btn-primary\" style=\"height:32px;font-size:0.75rem;\">View Details</button>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <div class=\"comp-card\">\n <h3>Table</h3>\n <div style=\"overflow-x:auto;\">\n <table class=\"demo-table\">\n <thead><tr><th>Name</th><th>Status</th><th>Role</th><th>Email</th></tr></thead>\n <tbody>\n <tr><td>Kim Minjae</td><td><span class=\"badge badge-primary\" style=\"font-size:10px;\">Active</span></td><td>Developer</td><td>minjae@example.com</td></tr>\n <tr><td>Lee Soyeon</td><td><span class=\"badge badge-secondary\" style=\"font-size:10px;\">Pending</span></td><td>Designer</td><td>soyeon@example.com</td></tr>\n <tr><td>Park Jiwoo</td><td><span class=\"badge badge-outline\" style=\"font-size:10px;\">Inactive</span></td><td>PM</td><td>jiwoo@example.com</td></tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <!-- Dialog -->\n <div class=\"comp-card\">\n <h3>Dialog</h3>\n <div class=\"demo-dialog\">\n <h4>Delete item?</h4>\n <p>This action cannot be undone.</p>\n <div class=\"acts\">\n <button class=\"btn btn-outline\" style=\"height:32px;\">Cancel</button>\n <button class=\"btn btn-destructive\" style=\"height:32px;\">Delete</button>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"comp-card\">\n <h3>Tabs</h3>\n <div class=\"tabs\">\n <button class=\"tab active\">Overview</button>\n <button class=\"tab\">Analytics</button>\n <button class=\"tab\">Settings</button>\n </div>\n </div>\n </div>\n\n <!-- shadcn CSS -->\n <div class=\"section\">\n <h2 class=\"section-title\">shadcn/ui CSS Variables</h2>\n <div class=\"section-sub\">Ready to paste into globals.css</div>\n <div class=\"css-block\">\n <button class=\"ctrl-btn copy-css\" onclick=\"copyCss()\" style=\"position:absolute;top:8px;right:8px;\">Copy</button>\n <pre id=\"css-output\">${escHtml(shadcnCss)}</pre>\n </div>\n </div>\n\n</div>\n\n<div class=\"toast-popup\" id=\"toast\">Copied!</div>\n\n<script>\nlet isDark = false;\nfunction toggleTheme() {\n isDark = !isDark;\n document.body.classList.toggle('dark', isDark);\n const btn = document.getElementById('theme-btn');\n if (btn) btn.textContent = isDark ? '☀️ Light' : '🌙 Dark';\n}\nfunction showToast(msg) {\n const el = document.getElementById('toast');\n el.textContent = msg;\n el.classList.add('show');\n setTimeout(() => el.classList.remove('show'), 1800);\n}\nfunction copy(val) {\n navigator.clipboard.writeText(val).then(() => showToast('Copied: ' + val));\n}\nfunction copyCss() {\n const css = document.getElementById('css-output').textContent;\n navigator.clipboard.writeText(css).then(() => showToast('CSS variables copied!'));\n}\ndocument.querySelectorAll('.tab').forEach(t => {\n t.addEventListener('click', () => {\n t.parentElement.querySelectorAll('.tab').forEach(x => x.classList.remove('active'));\n t.classList.add('active');\n });\n});\n</script>\n</body>\n</html>`;\n}\n\nfunction isLight(hex: string): boolean {\n const h = hex.replace('#', '');\n const r = parseInt(h.slice(0, 2), 16);\n const g = parseInt(h.slice(2, 4), 16);\n const b = parseInt(h.slice(4, 6), 16);\n return (r * 299 + g * 587 + b * 114) / 1000 > 140;\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nfunction escHtml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n","import { readFileSync, readdirSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport interface ReferenceEntry {\n id: string; // folder name e.g. \"stripe\"\n name: string; // display name e.g. \"Stripe\"\n category: string; // e.g. \"Fintech\"\n designMd: string; // full DESIGN.md content\n colors: ExtractedColors;\n typography: ExtractedTypography;\n radius: string; // e.g. \"4px-8px\"\n mood: string; // extracted from section 1\n}\n\nexport interface ExtractedColors {\n primary: string; // main brand hex\n primaryName: string; // e.g. \"Stripe Purple\"\n background: string;\n foreground: string;\n accent?: string;\n border?: string;\n}\n\nexport interface ExtractedTypography {\n primary: string; // e.g. \"sohne-var\"\n mono?: string; // e.g. \"SourceCodePro\"\n headingWeight: string;\n}\n\n// ── Category mapping ─────────────────────────────────────────────\n\nconst CATEGORIES: Record<string, string> = {\n stripe: 'Fintech', coinbase: 'Fintech', revolut: 'Fintech', wise: 'Fintech', kraken: 'Fintech',\n vercel: 'Developer Tools', cursor: 'Developer Tools', warp: 'Developer Tools',\n expo: 'Developer Tools', lovable: 'Developer Tools', raycast: 'Developer Tools', superhuman: 'Developer Tools',\n supabase: 'Backend & DevOps', mongodb: 'Backend & DevOps', sentry: 'Backend & DevOps',\n posthog: 'Backend & DevOps', hashicorp: 'Backend & DevOps', clickhouse: 'Backend & DevOps',\n composio: 'Backend & DevOps', sanity: 'Backend & DevOps',\n notion: 'Productivity', 'linear.app': 'Productivity', 'cal': 'Productivity',\n zapier: 'Productivity', intercom: 'Productivity', resend: 'Productivity', mintlify: 'Productivity',\n figma: 'Design Tools', framer: 'Design Tools', miro: 'Design Tools',\n webflow: 'Design Tools', airtable: 'Design Tools', clay: 'Design Tools',\n claude: 'AI & LLM', cohere: 'AI & LLM', mistral: 'AI & LLM', 'mistral.ai': 'AI & LLM',\n ollama: 'AI & LLM', 'opencode.ai': 'AI & LLM', replicate: 'AI & LLM',\n 'together.ai': 'AI & LLM', 'x.ai': 'AI & LLM', elevenlabs: 'AI & LLM',\n minimax: 'AI & LLM', runwayml: 'AI & LLM', voltagent: 'AI & LLM',\n apple: 'Consumer Tech', spotify: 'Consumer Tech', uber: 'Consumer Tech',\n airbnb: 'Consumer Tech', pinterest: 'Consumer Tech', nvidia: 'Consumer Tech',\n ibm: 'Consumer Tech', spacex: 'Consumer Tech',\n shopify: 'E-commerce', semrush: 'Marketing',\n tesla: 'Automotive', bmw: 'Automotive', ferrari: 'Automotive',\n lamborghini: 'Automotive', renault: 'Automotive', bugatti: 'Automotive',\n karrot: 'Korean Tech', toss: 'Korean Tech', baemin: 'Korean Tech', kakao: 'Korean Tech',\n};\n\nconst CATEGORY_ORDER = [\n 'Korean Tech', 'AI & LLM', 'Design Tools', 'Developer Tools',\n 'Productivity', 'Consumer Tech', 'Fintech', 'Backend & DevOps',\n 'E-commerce', 'Automotive', 'Marketing',\n];\n\n// ── Extraction helpers ───────────────────────────────────────────\n\nfunction extractHexColors(text: string): string[] {\n const matches = text.match(/#[0-9a-fA-F]{6}\\b/g) || [];\n return [...new Set(matches)];\n}\n\nfunction extractPrimaryColor(md: string): { hex: string; name: string } {\n // Look for the first color in section 2 with \"Primary\" or \"Brand\" in its description\n const section2Match = md.match(/## 2\\. Color Palette.*?\\n([\\s\\S]*?)(?=## 3\\.)/);\n if (section2Match) {\n const section2 = section2Match[1];\n // Pattern: **Name** (`#hex`): description with \"primary\" or \"brand\" or \"CTA\"\n const primaryMatch = section2.match(/\\*\\*([^*]+)\\*\\*\\s*\\(`(#[0-9a-fA-F]{6})`\\).*?(?:primary|brand|CTA|main)/i);\n if (primaryMatch) {\n return { hex: primaryMatch[2], name: primaryMatch[1] };\n }\n // Fallback: first hex in section 2\n const firstHex = section2.match(/`(#[0-9a-fA-F]{6})`/);\n if (firstHex) {\n return { hex: firstHex[1], name: 'Primary' };\n }\n }\n const allHex = extractHexColors(md);\n return { hex: allHex[0] || '#6366f1', name: 'Primary' };\n}\n\nfunction extractBackground(md: string): string {\n // Try specific page/canvas background patterns first (avoid matching component backgrounds)\n const patterns = [\n /(?:page|canvas|marketing)\\s+background.*?`(#[0-9a-fA-F]{6})`/i,\n /(?:Pure White|White).*?`(#[0-9a-fA-F]{6})`.*?(?:page background|background)/i,\n /Background:.*?Pure White.*?\\(`(#[0-9a-fA-F]{6})`\\)/i,\n /(?:Page|Site)\\s+background.*?`(#[0-9a-fA-F]{6})`/i,\n // Match \"hex: The primary page background\" pattern (hex before description)\n /`(#[0-9a-fA-F]{6})`[^.]*?(?:primary\\s+)?page\\s+background/i,\n ];\n for (const pattern of patterns) {\n const match = md.match(pattern);\n if (match) return match[1];\n }\n // Look in Section 2 for surface/background colors\n const section2 = md.match(/## 2\\. Color.*?\\n([\\s\\S]*?)(?=## 3\\.)/);\n if (section2) {\n const surfaceBg = section2[1].match(/(?:Pure White|Pure Black|page background|Background\\b).*?`(#[0-9a-fA-F]{6})`/i);\n if (surfaceBg) return surfaceBg[1];\n }\n // Check Quick Color Reference section for background (supports both backtick and parenthesis hex)\n const quickRef = md.match(/Quick Color Reference[\\s\\S]*?(?:Page\\s+)?Background.*?[(`](#[0-9a-fA-F]{6})[)`]/i);\n if (quickRef) return quickRef[1];\n // Fallback: if the design mentions dark-mode-native, use dark bg\n if (md.match(/dark.mode.(?:native|first)/i)) {\n const darkBg = md.match(/(?:marketing|deepest|canvas).*?`(#[0-9a-fA-F]{6})`/i);\n if (darkBg) return darkBg[1];\n }\n return '#ffffff';\n}\n\nfunction extractForeground(md: string): string {\n const fgMatch = md.match(/(?:heading|primary text).*?`(#[0-9a-fA-F]{6})`/i);\n return fgMatch ? fgMatch[1] : '#09090b';\n}\n\nfunction extractAccent(md: string): string | undefined {\n const accentMatch = md.match(/(?:accent|secondary).*?`(#[0-9a-fA-F]{6})`/i);\n return accentMatch ? accentMatch[1] : undefined;\n}\n\nfunction extractBorder(md: string): string | undefined {\n const borderMatch = md.match(/(?:border.*?default|border.*?standard).*?`(#[0-9a-fA-F]{6})`/i);\n return borderMatch ? borderMatch[1] : undefined;\n}\n\nfunction extractTypography(md: string): ExtractedTypography {\n const section3 = md.match(/## 3\\. Typography.*?\\n([\\s\\S]*?)(?=## 4\\.)/);\n let primary = 'Inter';\n let mono: string | undefined;\n let headingWeight = '600';\n\n if (section3) {\n const text = section3[1];\n const primaryMatch = text.match(/\\*\\*Primary\\*\\*:\\s*`([^`]+)`/i);\n if (primaryMatch) primary = primaryMatch[1].split(',')[0].trim();\n\n const monoMatch = text.match(/\\*\\*Monospace\\*\\*:\\s*`([^`]+)`/i);\n if (monoMatch) mono = monoMatch[1].split(',')[0].trim();\n\n // Look for heading weight in hierarchy table\n const weightMatch = text.match(/Display.*?\\|\\s*(\\d{3})\\s*\\|/);\n if (weightMatch) headingWeight = weightMatch[1];\n }\n\n return { primary, mono, headingWeight };\n}\n\nfunction extractRadius(md: string): string {\n const radiusMatch = md.match(/(?:border-radius|radius).*?(\\d+px(?:\\s*[-–]\\s*\\d+px)?)/i);\n return radiusMatch ? radiusMatch[1] : '6px';\n}\n\nfunction extractMood(md: string): string {\n const section1 = md.match(/## 1\\. Visual Theme.*?\\n([\\s\\S]*?)(?=## 2\\.)/);\n if (!section1) return '';\n // First sentence or two\n const text = section1[1].trim();\n const firstParagraph = text.split('\\n\\n')[0];\n return firstParagraph.slice(0, 300);\n}\n\nfunction toDisplayName(id: string): string {\n const special: Record<string, string> = {\n 'linear.app': 'Linear', 'cal': 'Cal.com', 'mistral.ai': 'Mistral AI',\n 'opencode.ai': 'OpenCode AI', 'together.ai': 'Together AI',\n 'x.ai': 'xAI', ibm: 'IBM', bmw: 'BMW', nvidia: 'NVIDIA',\n posthog: 'PostHog', supabase: 'Supabase', voltagent: 'VoltAgent',\n elevenlabs: 'ElevenLabs', runwayml: 'RunwayML', spacex: 'SpaceX',\n coinbase: 'Coinbase', airbnb: 'Airbnb', clickhouse: 'ClickHouse',\n karrot: 'Karrot', toss: 'Toss', baemin: 'Baemin', kakao: 'Kakao',\n };\n return special[id] || id.charAt(0).toUpperCase() + id.slice(1);\n}\n\n// ── Main API ─────────────────────────────────────────────────────\n\nfunction getReferencesDir(): string {\n // Try multiple locations:\n // 1. Current working directory (project root)\n // 2. Relative to this compiled file (dist/core/ → ../../references)\n // 3. Inside the installed npm package (npx installs to node_modules)\n const candidates = [\n join(process.cwd(), 'references'),\n join(__dirname, '..', '..', 'references'),\n join(__dirname, '..', 'references'),\n ];\n for (const dir of candidates) {\n if (existsSync(dir)) return dir;\n }\n throw new Error('references/ directory not found. Searched: ' + candidates.join(', '));\n}\n\nexport function loadReference(id: string): ReferenceEntry {\n const dir = getReferencesDir();\n const mdPath = join(dir, id, 'DESIGN.md');\n if (!existsSync(mdPath)) {\n throw new Error(`Reference not found: ${id}`);\n }\n\n const designMd = readFileSync(mdPath, 'utf-8');\n const primary = extractPrimaryColor(designMd);\n\n return {\n id,\n name: toDisplayName(id),\n category: CATEGORIES[id] || 'Other',\n designMd,\n colors: {\n primary: primary.hex,\n primaryName: primary.name,\n background: extractBackground(designMd),\n foreground: extractForeground(designMd),\n accent: extractAccent(designMd),\n border: extractBorder(designMd),\n },\n typography: extractTypography(designMd),\n radius: extractRadius(designMd),\n mood: extractMood(designMd),\n };\n}\n\nexport function listReferences(): Array<{ id: string; name: string; category: string; primaryColor: string }> {\n const dir = getReferencesDir();\n const entries = readdirSync(dir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && existsSync(join(dir, d.name, 'DESIGN.md')))\n .map((d) => {\n const mdPath = join(dir, d.name, 'DESIGN.md');\n const md = readFileSync(mdPath, 'utf-8');\n const primary = extractPrimaryColor(md);\n return {\n id: d.name,\n name: toDisplayName(d.name),\n category: CATEGORIES[d.name] || 'Other',\n primaryColor: primary.hex,\n };\n });\n\n // Sort by category order, then name\n return entries.sort((a, b) => {\n const ai = CATEGORY_ORDER.indexOf(a.category);\n const bi = CATEGORY_ORDER.indexOf(b.category);\n const oa = ai === -1 ? 999 : ai;\n const ob = bi === -1 ? 999 : bi;\n return oa - ob || a.name.localeCompare(b.name);\n });\n}\n","import type { ReferenceEntry } from './reference-parser.js';\nimport type { CustomOverrides } from '../cli/prompts.js';\nimport {\n generateColorScale,\n contrastForeground,\n hslString,\n hexToHsl,\n hslToHex,\n lighten,\n darken,\n generateChartColors,\n} from '../utils/color.js';\n\n/**\n * Apply user overrides to a reference DESIGN.md.\n *\n * Strategy:\n * - \"as-is\": return the original DESIGN.md content with minimal additions\n * - \"customized\": perform text-level replacements for color/font/radius/weight\n * and append a customization summary + shadcn CSS variables block\n *\n * This is intentionally NOT an AI call. It's deterministic string transformation.\n */\nexport function applyOverrides(\n ref: ReferenceEntry,\n overrides: CustomOverrides,\n mode: 'as-is' | 'customized',\n components?: string[],\n): { designMd: string; shadcnCss: string; previewData: PreviewData } {\n let md = ref.designMd;\n\n const effectivePrimary = overrides.primaryColor || ref.colors.primary;\n const effectiveFont = overrides.fontFamily || ref.typography.primary;\n const effectiveWeight = overrides.headingWeight || ref.typography.headingWeight;\n const effectiveRadius = overrides.borderRadius || ref.radius.replace(/[-–].*/, '').trim();\n const effectiveBg = ref.colors.background;\n const effectiveFg = ref.colors.foreground;\n\n // Strip emojis. The unicode range covers ✅ (U+2705) and ❌ (U+274C) too,\n // so any DO:/DON'T: prefix conversion would never match — references use\n // explicit \"**DO**\" / \"**DON'T**\" markdown instead.\n md = md.replace(/[\\u{1F300}-\\u{1F9FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{FE00}-\\u{FE0F}\\u{1FA00}-\\u{1FAFF}\\u{200D}\\u{20E3}\\u{E0020}-\\u{E007F}]/gu, '');\n\n if (mode === 'customized') {\n // Direct replacement — one source of truth for AI agents\n md = md.replace(/^# .+$/m, `# Custom Design System (based on ${ref.name})`);\n\n if (overrides.primaryColor && overrides.primaryColor !== ref.colors.primary) {\n const re = new RegExp(ref.colors.primary.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n md = re[Symbol.replace](md, overrides.primaryColor);\n }\n if (overrides.fontFamily && overrides.fontFamily !== ref.typography.primary) {\n md = md.replaceAll(ref.typography.primary, overrides.fontFamily);\n }\n }\n\n // Append component list\n if (components && components.length > 0) {\n md += `\\n\\n---\\n\\n## Included Components\\n\\nThe following components are part of this design system:\\n\\n`;\n md += components.map(c => `- ${c.charAt(0).toUpperCase() + c.slice(1).replace(/-/g, ' ')}`).join('\\n');\n md += '\\n';\n }\n\n // Append iconography section\n md += buildIconographySection();\n\n // Generate shadcn CSS for preview data only (no longer appended to DESIGN.md)\n const shadcnCss = generateShadcnCss(effectivePrimary, effectiveBg, effectiveFg, effectiveRadius, ref, overrides);\n\n // Append document policies\n md += buildDocumentPolicies();\n\n // Build preview data\n const previewData = buildPreviewData(ref, overrides, effectivePrimary, effectiveBg, effectiveFg, effectiveFont, effectiveWeight, effectiveRadius);\n\n return { designMd: md, shadcnCss, previewData };\n}\n\n// ── Text replacements ────────────────────────────────────────────\n\nfunction replaceColor(md: string, oldHex: string, newHex: string): string {\n // Replace the exact hex (case-insensitive)\n const regex = new RegExp(escapeRegex(oldHex), 'gi');\n return md.replace(regex, newHex);\n}\n\nfunction replaceFont(md: string, oldFont: string, newFont: string): string {\n const regex = new RegExp(escapeRegex(oldFont), 'g');\n return md.replace(regex, newFont);\n}\n\nfunction replaceWeight(md: string, oldWeight: string, newWeight: string): string {\n // Only replace weight in Display/Heading rows and key characteristics\n // Be careful not to replace all numbers\n const regex = new RegExp(`(Display.*?\\\\|\\\\s*)${oldWeight}(\\\\s*\\\\|)`, 'g');\n let result = md.replace(regex, `$1${newWeight}$2`);\n // Also replace \"weight X\" patterns\n result = result.replace(\n new RegExp(`weight ${oldWeight}`, 'g'),\n `weight ${newWeight}`,\n );\n return result;\n}\n\nfunction replaceRadius(md: string, oldRadius: string, newRadius: string): string {\n // Replace \"Xpx\" radius patterns\n const oldBase = oldRadius.replace(/[-–].*/, '').trim();\n if (oldBase === newRadius) return md;\n const regex = new RegExp(`${escapeRegex(oldBase)}`, 'g');\n return md.replace(regex, newRadius);\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n// ── Customization summary section ────────────────────────────────\n\nfunction buildCustomizationSummary(ref: ReferenceEntry, overrides: CustomOverrides): string {\n const changes: string[] = [];\n if (overrides.primaryColor) {\n changes.push(`- **Primary color**: ${ref.colors.primary} → ${overrides.primaryColor}`);\n }\n if (overrides.fontFamily) {\n changes.push(`- **Font**: ${ref.typography.primary} → ${overrides.fontFamily}`);\n }\n if (overrides.headingWeight) {\n changes.push(`- **Heading weight**: ${ref.typography.headingWeight} → ${overrides.headingWeight}`);\n }\n if (overrides.borderRadius) {\n changes.push(`- **Border radius**: ${ref.radius} → ${overrides.borderRadius}`);\n }\n if (overrides.additionalNotes) {\n changes.push(`- **Additional notes**: ${overrides.additionalNotes}`);\n }\n\n if (changes.length === 0) return '';\n\n return `\n\n---\n\n## Customization Applied\n\n> Based on **${ref.name}** design system with the following modifications:\n\n${changes.join('\\n')}\n`;\n}\n\n// ── shadcn CSS generation ────────────────────────────────────────\n\nfunction generateShadcnCss(\n primary: string,\n background: string,\n foreground: string,\n radius: string,\n ref: ReferenceEntry,\n overrides: CustomOverrides,\n): string {\n const scale = generateColorScale(primary);\n const accent = ref.colors.accent || hslToHex((hexToHsl(primary)[0] + 30) % 360, 60, 55);\n const border = ref.colors.border || lighten(foreground, 75);\n const muted = lighten(background === '#ffffff' ? '#f5f5f5' : background, 5);\n const destructive = '#ef4444';\n const chart = generateChartColors(primary);\n\n const radiusRem = radius === '9999px' ? '9999px' : `${parseInt(radius) / 16}rem`;\n\n const vars: Record<string, string> = {\n '--background': hslString(background),\n '--foreground': hslString(foreground),\n '--card': hslString(background === '#ffffff' ? '#ffffff' : lighten(background, 3)),\n '--card-foreground': hslString(foreground),\n '--popover': hslString(background === '#ffffff' ? '#ffffff' : lighten(background, 5)),\n '--popover-foreground': hslString(foreground),\n '--primary': hslString(primary),\n '--primary-foreground': hslString(contrastForeground(primary)),\n '--secondary': hslString(scale[100]),\n '--secondary-foreground': hslString(foreground),\n '--muted': hslString(muted),\n '--muted-foreground': hslString(lighten(foreground, 40)),\n '--accent': hslString(accent),\n '--accent-foreground': hslString(contrastForeground(accent)),\n '--destructive': hslString(destructive),\n '--destructive-foreground': hslString(contrastForeground(destructive)),\n '--border': hslString(border),\n '--input': hslString(border),\n '--ring': hslString(primary),\n '--radius': radiusRem,\n '--chart-1': hslString(chart[0]),\n '--chart-2': hslString(chart[1]),\n '--chart-3': hslString(chart[2]),\n '--chart-4': hslString(chart[3]),\n '--chart-5': hslString(chart[4]),\n };\n\n const lines = ['@layer base {', ' :root {'];\n for (const [k, v] of Object.entries(vars)) {\n lines.push(` ${k}: ${v};`);\n }\n lines.push(' }');\n\n // Dark mode\n if (overrides.darkMode) {\n const darkBg = hslToHex(hexToHsl(primary)[0], 15, 7);\n const darkFg = '#fafafa';\n const darkBorder = hslToHex(hexToHsl(primary)[0], 10, 18);\n const darkMuted = hslToHex(hexToHsl(primary)[0], 10, 15);\n\n lines.push('', ' .dark {');\n const darkVars: Record<string, string> = {\n '--background': hslString(darkBg),\n '--foreground': hslString(darkFg),\n '--card': hslString(lighten(darkBg, 3)),\n '--card-foreground': hslString(darkFg),\n '--popover': hslString(lighten(darkBg, 5)),\n '--popover-foreground': hslString(darkFg),\n '--primary': hslString(primary),\n '--primary-foreground': hslString(contrastForeground(primary)),\n '--secondary': hslString(hslToHex(hexToHsl(primary)[0], 15, 20)),\n '--secondary-foreground': hslString(darkFg),\n '--muted': hslString(darkMuted),\n '--muted-foreground': hslString(darken(darkFg, 35)),\n '--accent': hslString(accent),\n '--accent-foreground': hslString(contrastForeground(accent)),\n '--destructive': hslString(destructive),\n '--destructive-foreground': hslString(contrastForeground(destructive)),\n '--border': hslString(darkBorder),\n '--input': hslString(lighten(darkBorder, 5)),\n '--ring': hslString(primary),\n '--chart-1': hslString(chart[0]),\n '--chart-2': hslString(chart[1]),\n '--chart-3': hslString(chart[2]),\n '--chart-4': hslString(chart[3]),\n '--chart-5': hslString(chart[4]),\n };\n for (const [k, v] of Object.entries(darkVars)) {\n lines.push(` ${k}: ${v};`);\n }\n lines.push(' }');\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction buildShadcnSection(css: string): string {\n return `\n\n---\n\n## 10. shadcn/ui Theme\n\nCopy this CSS block into your \\`globals.css\\` to apply this design system to shadcn/ui components.\n\n\\`\\`\\`css\n${css}\n\\`\\`\\`\n`;\n}\n\n// ── Preview Data ─────────────────────────────────────────────────\n\nexport interface PreviewData {\n name: string;\n basedOn: string;\n primary: string;\n background: string;\n foreground: string;\n font: string;\n headingWeight: string;\n radius: string;\n shadcnCss: string;\n designMd: string;\n colors: {\n primary: string;\n accent: string;\n muted: string;\n destructive: string;\n border: string;\n scale: Record<string, string>;\n chart: string[];\n };\n darkMode: boolean;\n}\n\nfunction buildPreviewData(\n ref: ReferenceEntry,\n overrides: CustomOverrides,\n primary: string,\n background: string,\n foreground: string,\n font: string,\n headingWeight: string,\n radius: string,\n): PreviewData {\n const scale = generateColorScale(primary);\n const accent = ref.colors.accent || hslToHex((hexToHsl(primary)[0] + 30) % 360, 60, 55);\n const border = ref.colors.border || lighten(foreground, 75);\n const chart = generateChartColors(primary);\n\n return {\n name: overrides.primaryColor || overrides.fontFamily ? `Custom (based on ${ref.name})` : ref.name,\n basedOn: ref.name,\n primary,\n background,\n foreground,\n font,\n headingWeight,\n radius,\n shadcnCss: '', // filled later\n designMd: '', // filled later\n colors: {\n primary,\n accent,\n muted: lighten(background === '#ffffff' ? '#f5f5f5' : background, 5),\n destructive: '#ef4444',\n border,\n scale: scale as unknown as Record<string, string>,\n chart,\n },\n darkMode: overrides.darkMode,\n };\n}\n\n// ── Iconography section ──────────────────────────────────────────\n\nfunction buildIconographySection(): string {\n return `\n\n---\n\n## Iconography & SVG Guidelines\n\n### Icon Library\n\nUse a single, consistent icon library throughout the project. Recommended options:\n\n- **Lucide React** (\\`lucide-react\\`): Default for shadcn/ui projects. 1,400+ icons, tree-shakeable, consistent 24x24 grid.\n- **Radix Icons** (\\`@radix-ui/react-icons\\`): 300+ icons, 15x15 grid, minimal and geometric.\n- **Heroicons** (\\`@heroicons/react\\`): 300+ icons by Tailwind team, outline and solid variants.\n\nPick ONE library and use it everywhere. Do not mix icon libraries within the same project.\n\n### SVG Usage Rules\n\n- All icons must be inline SVG components (not \\`<img>\\` tags) for color and size control.\n- Icon size follows the type scale: 16px (inline), 20px (buttons), 24px (standalone).\n- Icon color inherits from \\`currentColor\\` -- never hard-code fill/stroke colors.\n- For custom/brand icons, export as SVG components with \\`currentColor\\` fills.\n- Stroke width: 1.5px-2px for outline icons. Keep consistent across the project.\n\n### Icon Sizing Scale\n\n| Context | Size | Usage |\n|---------|------|-------|\n| Inline text | 16px (1rem) | Badges, labels, breadcrumbs |\n| Button icon | 18px (1.125rem) | Icon buttons, CTA icons |\n| Standalone | 24px (1.5rem) | Navigation, card icons |\n| Feature | 32-48px | Hero sections, empty states |\n\n### SVG Optimization\n\n- Run all custom SVGs through SVGO before committing.\n- Remove unnecessary attributes: \\`xmlns\\`, \\`xml:space\\`, editor metadata.\n- Use \\`viewBox\\` instead of fixed \\`width\\`/\\`height\\` for scalability.\n`;\n}\n\n// ── Document policies ────────────────────────────────────────────\n\nfunction buildDocumentPolicies(): string {\n return `\n\n---\n\n## Document Policies\n\n### No Emojis\n\nThis design system must not use emojis in any UI element, component, label, status indicator, or documentation.\nUse SVG icons from the chosen icon library instead. Emojis render inconsistently across platforms and break visual coherence.\n\n- Status indicators: use colored dots or icon components, not emoji.\n- Section markers: use text prefixes (\"DO:\" / \"DON'T:\") or icons, not checkmark/cross emojis.\n- Navigation: use icon components, not emoji.\n\n### Format Compliance\n\nThis document follows the Google Stitch DESIGN.md 9-section format:\n1. Visual Theme & Atmosphere\n2. Color Palette & Roles\n3. Typography Rules\n4. Component Stylings\n5. Layout Principles\n6. Depth & Elevation\n7. Do's and Don'ts\n8. Responsive Behavior\n9. Agent Prompt Guide\n\nExtended with:\n- Iconography & SVG Guidelines\n- Document Policies\n\nTotal target length: 250-400 lines. Keep sections concise and actionable.\n`;\n}\n","import type { Preset } from '../core/types.js';\n\nexport const basePreset: Preset = {\n name: 'base',\n displayName: 'Base',\n description: 'Shared defaults inherited by all presets',\n preferences: {\n mood: 'clean',\n primaryColor: '#2563eb',\n roundness: 'moderate',\n density: 'comfortable',\n typography: 'geometric',\n depth: 'subtle',\n darkMode: false,\n components: ['button', 'card', 'input'],\n },\n dosAndDonts: {\n dos: [\n 'Maintain consistent spacing throughout all components',\n 'Use semantic color tokens instead of raw hex values',\n 'Ensure all interactive elements have visible focus indicators',\n 'Keep text contrast ratio at WCAG AA minimum (4.5:1)',\n 'Use the defined type scale — avoid arbitrary font sizes',\n ],\n donts: [\n 'Mix border-radius styles within the same surface level',\n 'Use more than 3 font weights on a single page',\n 'Apply shadows and borders simultaneously on the same element',\n 'Override semantic colors with hard-coded values',\n 'Nest elevated surfaces more than 2 levels deep',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\n\nexport const fintechPremiumPreset: Preset = {\n name: 'fintech-premium',\n displayName: 'Fintech Premium',\n description: 'Refined, trustworthy aesthetic with blue-tinted shadows and conservative radius — inspired by fintech dashboards',\n preferences: {\n mood: 'clean',\n primaryColor: '#635bff',\n roundness: 'moderate',\n density: 'comfortable',\n typography: 'geometric',\n depth: 'layered',\n darkMode: true,\n components: ['button', 'card', 'input', 'table', 'badge', 'dropdown', 'tabs'],\n },\n dosAndDonts: {\n dos: [\n 'Use generous whitespace to convey premium feel',\n 'Rely on typography hierarchy over decorative elements',\n 'Keep interactive states subtle — opacity shifts over color jumps',\n 'Use the primary color sparingly for key CTAs only',\n 'Present data in clean, well-aligned tables with minimal borders',\n ],\n donts: [\n 'Use bright, saturated accent colors for large surface areas',\n 'Mix warm and cool grays — stick to one temperature',\n 'Add decorative gradients or patterns to functional surfaces',\n 'Use pill-shaped buttons for primary actions',\n 'Over-decorate table rows — let the data breathe',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\n\nexport const developerDarkPreset: Preset = {\n name: 'developer-dark',\n displayName: 'Developer Dark',\n description: 'High-contrast dark theme with monospace accents and sharp edges — inspired by developer tools and terminals',\n preferences: {\n mood: 'dark',\n primaryColor: '#ffffff',\n roundness: 'sharp',\n density: 'compact',\n typography: 'monospace',\n depth: 'subtle',\n darkMode: false, // already dark by default\n components: ['button', 'card', 'input', 'table', 'badge', 'tabs', 'toast'],\n },\n dosAndDonts: {\n dos: [\n 'Use high contrast between foreground text and dark backgrounds',\n 'Leverage monospace type for code, data, and labels',\n 'Keep borders thin (1px) and use subtle color separation',\n 'Use accent color only for interactive elements and focus rings',\n 'Maintain sharp corners throughout — consistency matters',\n ],\n donts: [\n 'Use rounded or pill-shaped elements — they conflict with the sharp aesthetic',\n 'Apply warm tones to the neutral palette',\n 'Use heavy shadows on dark backgrounds — they become invisible',\n 'Mix serif fonts into the interface',\n 'Use light gray text on dark backgrounds below 4.5:1 contrast ratio',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\n\nexport const productivityWarmPreset: Preset = {\n name: 'productivity-warm',\n displayName: 'Productivity Warm',\n description: 'Warm neutrals with friendly radius and comfortable density — inspired by modern productivity tools',\n preferences: {\n mood: 'warm',\n primaryColor: '#2f81f7',\n roundness: 'rounded',\n density: 'comfortable',\n typography: 'humanist',\n depth: 'subtle',\n darkMode: true,\n components: ['button', 'card', 'input', 'dropdown', 'dialog', 'navigation', 'badge'],\n },\n dosAndDonts: {\n dos: [\n 'Use warm gray tones (#faf9f7, #37352f) over pure black/white',\n 'Keep interactions gentle — soft hover states, smooth transitions',\n 'Use rounded corners consistently for a friendly, approachable feel',\n 'Emphasize readability with generous line-height (1.6+)',\n 'Layer content with subtle background tints rather than hard borders',\n ],\n donts: [\n 'Use sharp corners or angular design elements',\n 'Apply cold, saturated blues for large background areas',\n 'Use heavy shadows that make the UI feel oppressive',\n 'Over-use the primary color — warm UIs need muted palettes',\n 'Make interactive elements too small — comfortable density means generous targets',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\n\nexport const dataDensePreset: Preset = {\n name: 'data-dense',\n displayName: 'Data Dense',\n description: 'Compact spacing with flat depth and geometric sans — inspired by project management and data-heavy interfaces',\n preferences: {\n mood: 'clean',\n primaryColor: '#5e6ad2',\n roundness: 'sharp',\n density: 'compact',\n typography: 'geometric',\n depth: 'flat',\n darkMode: true,\n components: ['button', 'card', 'input', 'table', 'badge', 'tabs', 'select', 'dropdown'],\n },\n dosAndDonts: {\n dos: [\n 'Pack information densely — every pixel should earn its place',\n 'Use small type sizes (12-13px) for data cells and metadata',\n 'Rely on borders and background tints over shadows for separation',\n 'Keep interactive elements compact but above 28px minimum height',\n 'Use keyboard shortcuts and dense navigation patterns',\n ],\n donts: [\n 'Add decorative spacing between dense data elements',\n 'Use large rounded corners — they waste space in tight layouts',\n 'Apply heavy shadows that add visual weight to a dense interface',\n 'Use more than 2 levels of visual nesting',\n 'Mix compact and spacious components on the same surface',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\n\nexport const playfulCreativePreset: Preset = {\n name: 'playful-creative',\n displayName: 'Playful Creative',\n description: 'Rounded corners, vibrant colors, and layered depth — inspired by creative and design tools',\n preferences: {\n mood: 'playful',\n primaryColor: '#a855f7',\n roundness: 'rounded',\n density: 'comfortable',\n typography: 'humanist',\n depth: 'layered',\n darkMode: true,\n components: ['button', 'card', 'input', 'badge', 'dialog', 'toast', 'floating-button'],\n },\n dosAndDonts: {\n dos: [\n 'Use vibrant, saturated colors for interactive elements',\n 'Apply generous border-radius to convey friendliness',\n 'Layer surfaces with distinct shadows for spatial clarity',\n 'Use playful micro-interactions (scale, bounce, color shift)',\n 'Mix 2-3 accent colors for visual variety within the palette',\n ],\n donts: [\n 'Use sharp corners — they contradict the playful mood',\n 'Make the palette too muted or desaturated',\n 'Use flat depth — layered shadows are part of the personality',\n 'Overcrowd layouts — playful needs room to breathe',\n 'Use formal serif fonts for UI text',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\n\nexport const brutalistPreset: Preset = {\n name: 'brutalist',\n displayName: 'Brutalist',\n description: 'No radius, flat surfaces, monospace type, high-contrast borders — anti-design aesthetic',\n preferences: {\n mood: 'bold',\n primaryColor: '#000000',\n roundness: 'sharp',\n density: 'comfortable',\n typography: 'monospace',\n depth: 'flat',\n darkMode: false,\n components: ['button', 'card', 'input', 'table', 'badge'],\n },\n dosAndDonts: {\n dos: [\n 'Use thick borders (2-3px) as the primary visual separator',\n 'Keep all corners sharp — 0px radius everywhere',\n 'Use monospace type for all text, including headings',\n 'Embrace high contrast: black on white, white on black',\n 'Let raw structure show — no decorative gradients or shadows',\n ],\n donts: [\n 'Add rounded corners, gradients, or subtle shadows',\n 'Use pastel or muted color palettes',\n 'Apply smooth transitions — prefer instant state changes',\n 'Mix serif or humanist fonts into the interface',\n 'Over-polish the UI — imperfection is intentional',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\n\nexport const corporateCleanPreset: Preset = {\n name: 'corporate-clean',\n displayName: 'Corporate Clean',\n description: 'System fonts, subtle shadows, blue primary — reliable enterprise SaaS aesthetic',\n preferences: {\n mood: 'clean',\n primaryColor: '#2563eb',\n roundness: 'moderate',\n density: 'comfortable',\n typography: 'humanist',\n depth: 'subtle',\n darkMode: true,\n components: ['button', 'card', 'input', 'table', 'dialog', 'dropdown', 'navigation', 'tabs', 'select', 'badge'],\n },\n dosAndDonts: {\n dos: [\n 'Use system fonts for maximum cross-platform consistency',\n 'Keep the blue primary for trust and authority',\n 'Apply subtle shadows for gentle depth without drama',\n 'Maintain strict visual hierarchy with consistent spacing',\n 'Design for accessibility first — WCAG AA minimum everywhere',\n ],\n donts: [\n 'Use trendy or experimental design patterns',\n 'Apply vibrant accent colors to large surfaces',\n 'Use custom or decorative fonts — system fonts are intentional',\n 'Create dramatic visual effects (large shadows, animations)',\n 'Sacrifice clarity for visual flair',\n ],\n },\n};\n","import type { Preset } from '../core/types.js';\nimport { basePreset } from './_base.js';\nimport { fintechPremiumPreset } from './fintech-premium.js';\nimport { developerDarkPreset } from './developer-dark.js';\nimport { productivityWarmPreset } from './productivity-warm.js';\nimport { dataDensePreset } from './data-dense.js';\nimport { playfulCreativePreset } from './playful-creative.js';\nimport { brutalistPreset } from './brutalist.js';\nimport { corporateCleanPreset } from './corporate-clean.js';\n\nexport { basePreset } from './_base.js';\n\nconst presetRegistry: Map<string, Preset> = new Map([\n ['fintech-premium', fintechPremiumPreset],\n ['developer-dark', developerDarkPreset],\n ['productivity-warm', productivityWarmPreset],\n ['data-dense', dataDensePreset],\n ['playful-creative', playfulCreativePreset],\n ['brutalist', brutalistPreset],\n ['corporate-clean', corporateCleanPreset],\n]);\n\nexport function getPreset(name: string): Preset | undefined {\n return presetRegistry.get(name);\n}\n\nexport function getAllPresets(): Preset[] {\n return Array.from(presetRegistry.values());\n}\n\nexport function mergeWithBase(preset: Preset): Required<Pick<Preset, 'preferences' | 'dosAndDonts'>> {\n return {\n preferences: { ...basePreset.preferences, ...preset.preferences },\n dosAndDonts: {\n dos: [...(basePreset.dosAndDonts?.dos ?? []), ...(preset.dosAndDonts?.dos ?? [])],\n donts: [...(basePreset.dosAndDonts?.donts ?? []), ...(preset.dosAndDonts?.donts ?? [])],\n },\n };\n}\n","import { createHash } from 'node:crypto';\n\nexport interface ManagedBlock {\n version: number;\n hash: string;\n content: string;\n rawStart: number;\n rawEnd: number;\n}\n\nexport interface WriteBlockResult {\n updated: string;\n hash: string;\n}\n\nconst BLOCK_RE =\n /<!-- omd:start v=(\\d+) hash=([a-f0-9]+) -->\\n?([\\s\\S]*?)\\n?<!-- omd:end -->/;\n\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content, 'utf8').digest('hex').slice(0, 12);\n}\n\nexport function parseBlock(fileContent: string): ManagedBlock | null {\n const m = BLOCK_RE.exec(fileContent);\n if (!m) return null;\n return {\n version: Number(m[1]),\n hash: m[2],\n content: m[3],\n rawStart: m.index,\n rawEnd: m.index + m[0].length,\n };\n}\n\nexport function hasDrift(block: ManagedBlock): boolean {\n return hashContent(block.content) !== block.hash;\n}\n\nexport function writeBlock(\n fileContent: string,\n managedContent: string,\n version: number\n): WriteBlockResult {\n const hash = hashContent(managedContent);\n const block = `<!-- omd:start v=${version} hash=${hash} -->\\n${managedContent}\\n<!-- omd:end -->`;\n\n const existing = parseBlock(fileContent);\n if (existing) {\n const updated =\n fileContent.slice(0, existing.rawStart) +\n block +\n fileContent.slice(existing.rawEnd);\n return { updated, hash };\n }\n\n if (fileContent === '') {\n return { updated: block + '\\n', hash };\n }\n\n const sep = fileContent.endsWith('\\n\\n')\n ? ''\n : fileContent.endsWith('\\n')\n ? '\\n'\n : '\\n\\n';\n return { updated: fileContent + sep + block + '\\n', hash };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { z } from 'zod';\n\nexport const SYNC_LOCK_VERSION = 1;\nexport const SYNC_LOCK_PATH = '.omd/sync.lock.json';\n\nconst TargetSchema = z.object({\n managed_hash: z.string(),\n last_synced: z.string(),\n});\n\nconst SyncLockSchema = z.object({\n version: z.number().int().positive(),\n design_md_hash: z.string(),\n targets: z.record(z.string(), TargetSchema),\n});\n\nexport type SyncTarget = z.infer<typeof TargetSchema>;\nexport type SyncLock = z.infer<typeof SyncLockSchema>;\n\nfunction lockPath(projectRoot: string): string {\n return join(projectRoot, SYNC_LOCK_PATH);\n}\n\nexport function readLock(projectRoot: string): SyncLock | null {\n const path = lockPath(projectRoot);\n if (!existsSync(path)) return null;\n const raw = readFileSync(path, 'utf8');\n const parsed = JSON.parse(raw);\n return SyncLockSchema.parse(parsed);\n}\n\nexport function writeLock(projectRoot: string, lock: SyncLock): void {\n const validated = SyncLockSchema.parse(lock);\n const path = lockPath(projectRoot);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(validated, null, 2) + '\\n', 'utf8');\n}\n\nexport function createLock(designMdHash: string): SyncLock {\n return {\n version: SYNC_LOCK_VERSION,\n design_md_hash: designMdHash,\n targets: {},\n };\n}\n\nexport function updateTarget(\n projectRoot: string,\n target: string,\n managedHash: string\n): SyncLock {\n const existing = readLock(projectRoot) ?? createLock('');\n const next: SyncLock = {\n ...existing,\n targets: {\n ...existing.targets,\n [target]: {\n managed_hash: managedHash,\n last_synced: new Date().toISOString(),\n },\n },\n };\n writeLock(projectRoot, next);\n return next;\n}\n\nexport function updateDesignMdHash(\n projectRoot: string,\n designMdHash: string\n): SyncLock {\n const existing = readLock(projectRoot) ?? createLock(designMdHash);\n const next: SyncLock = { ...existing, design_md_hash: designMdHash };\n writeLock(projectRoot, next);\n return next;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport {\n parseBlock,\n writeBlock,\n hashContent,\n hasDrift,\n} from './sync-marker.js';\nimport { updateTarget, updateDesignMdHash } from './sync-lock.js';\n\nexport const MANAGED_BLOCK_VERSION = 1;\n\nexport type ShimId = 'claude' | 'agents' | 'cursor';\n\nexport type ShimMode = 'block' | 'whole';\n\nexport interface Shim {\n id: ShimId;\n relPath: string;\n mode: ShimMode;\n render(): string;\n}\n\nconst CLAUDE_BODY = `# Design System (oh-my-design)\n\nThe authoritative brand & UI spec is **@./DESIGN.md**.\nRead before any UI/styling/microcopy/motion work.\n\nPreference log (pending corrections): @./.omd/preferences.md\n\nPrecedence: DESIGN.md > preferences.md > your defaults.`;\n\nconst AGENTS_BODY = `## Design System (oh-my-design)\n\n**Before any UI, styling, copy, or motion change, open and read \\`./DESIGN.md\\` in full.** It is the authoritative brand/design spec. Treat its tokens, voice, and component rules as binding unless the user overrides in chat.\n\nIf present, read \\`./.omd/preferences.md\\` — pending corrections not yet folded into DESIGN.md. Apply them; flag conflicts.`;\n\nconst CURSOR_FRONTMATTER = `---\ndescription: Authoritative brand & UI design system. Read DESIGN.md before UI work.\nglobs:\n - \"**/*.tsx\"\n - \"**/*.jsx\"\n - \"**/*.vue\"\n - \"**/*.svelte\"\n - \"**/*.css\"\n - \"**/*.scss\"\n - \"**/tailwind.config.*\"\n - \"**/components/**\"\n - \"**/app/**/page.*\"\nalwaysApply: false\n---`;\n\nconst CURSOR_BODY = `The authoritative design spec lives at \\`@DESIGN.md\\` (repo root). Open and read before generating/modifying UI.\n\nPending preference corrections: \\`@.omd/preferences.md\\`.\n\nPrecedence: DESIGN.md > preferences.md > framework defaults.`;\n\nexport const CLAUDE_SHIM: Shim = {\n id: 'claude',\n relPath: 'CLAUDE.md',\n mode: 'block',\n render: () => CLAUDE_BODY,\n};\n\nexport const AGENTS_SHIM: Shim = {\n id: 'agents',\n relPath: 'AGENTS.md',\n mode: 'block',\n render: () => AGENTS_BODY,\n};\n\nexport const CURSOR_SHIM: Shim = {\n id: 'cursor',\n relPath: '.cursor/rules/omd-design.mdc',\n mode: 'whole',\n render: () => {\n const hash = hashContent(CURSOR_BODY);\n return `${CURSOR_FRONTMATTER}\\n\\n<!-- omd:start v=${MANAGED_BLOCK_VERSION} hash=${hash} -->\\n${CURSOR_BODY}\\n<!-- omd:end -->\\n`;\n },\n};\n\nexport const ALL_SHIMS: readonly Shim[] = [\n CLAUDE_SHIM,\n AGENTS_SHIM,\n CURSOR_SHIM,\n] as const;\n\nexport type DriftAction = 'overwrite' | 'skip' | 'error';\n\nexport interface WriteShimResult {\n id: ShimId;\n path: string;\n hash: string;\n status: 'created' | 'updated' | 'unchanged' | 'skipped-drift';\n}\n\nexport interface WriteShimsOptions {\n onDrift?: DriftAction;\n}\n\nfunction resolvePath(projectRoot: string, relPath: string): string {\n return join(projectRoot, relPath);\n}\n\nfunction readFileOrEmpty(path: string): string {\n return existsSync(path) ? readFileSync(path, 'utf8') : '';\n}\n\nfunction ensureDir(path: string): void {\n mkdirSync(dirname(path), { recursive: true });\n}\n\nexport type InspectStatus =\n | 'missing'\n | 'clean'\n | 'drifted'\n | 'out-of-date';\n\nexport interface InspectResult {\n id: ShimId;\n path: string;\n status: InspectStatus;\n existing?: string;\n rendered: string;\n}\n\nexport function inspectShim(projectRoot: string, shim: Shim): InspectResult {\n const abs = resolvePath(projectRoot, shim.relPath);\n const existing = readFileOrEmpty(abs);\n const fileExists = existing !== '';\n\n if (shim.mode === 'whole') {\n const rendered = shim.render();\n if (!fileExists) {\n return { id: shim.id, path: abs, status: 'missing', rendered };\n }\n if (existing === rendered) {\n return { id: shim.id, path: abs, status: 'clean', existing, rendered };\n }\n return { id: shim.id, path: abs, status: 'drifted', existing, rendered };\n }\n\n const managed = shim.render();\n const block = parseBlock(existing);\n\n if (!block) {\n return {\n id: shim.id,\n path: abs,\n status: 'missing',\n existing: fileExists ? existing : undefined,\n rendered: managed,\n };\n }\n\n if (hasDrift(block)) {\n return {\n id: shim.id,\n path: abs,\n status: 'drifted',\n existing: block.content,\n rendered: managed,\n };\n }\n\n if (block.content === managed) {\n return {\n id: shim.id,\n path: abs,\n status: 'clean',\n existing: block.content,\n rendered: managed,\n };\n }\n\n return {\n id: shim.id,\n path: abs,\n status: 'out-of-date',\n existing: block.content,\n rendered: managed,\n };\n}\n\nexport function inspectAllShims(projectRoot: string): InspectResult[] {\n return ALL_SHIMS.map((s) => inspectShim(projectRoot, s));\n}\n\nexport function writeShim(\n projectRoot: string,\n shim: Shim,\n opts: WriteShimsOptions = {}\n): WriteShimResult {\n const onDrift = opts.onDrift ?? 'error';\n const abs = resolvePath(projectRoot, shim.relPath);\n const existing = readFileOrEmpty(abs);\n const fileExists = existing !== '';\n\n if (shim.mode === 'whole') {\n const rendered = shim.render();\n const newHash = hashContent(rendered);\n\n if (fileExists && existing !== rendered) {\n const existingHash = hashContent(existing);\n if (onDrift === 'error') {\n throw new Error(\n `drift detected in ${shim.relPath} (existing hash ${existingHash} != rendered ${newHash}); rerun with onDrift=overwrite to force`\n );\n }\n if (onDrift === 'skip') {\n updateTarget(projectRoot, shim.relPath, existingHash);\n return {\n id: shim.id,\n path: abs,\n hash: existingHash,\n status: 'skipped-drift',\n };\n }\n }\n\n if (fileExists && existing === rendered) {\n updateTarget(projectRoot, shim.relPath, newHash);\n return { id: shim.id, path: abs, hash: newHash, status: 'unchanged' };\n }\n\n ensureDir(abs);\n writeFileSync(abs, rendered, 'utf8');\n updateTarget(projectRoot, shim.relPath, newHash);\n return {\n id: shim.id,\n path: abs,\n hash: newHash,\n status: fileExists ? 'updated' : 'created',\n };\n }\n\n const managed = shim.render();\n const existingBlock = parseBlock(existing);\n\n if (existingBlock && hasDrift(existingBlock)) {\n if (onDrift === 'error') {\n throw new Error(\n `managed block in ${shim.relPath} was hand-edited; rerun with onDrift=overwrite to force`\n );\n }\n if (onDrift === 'skip') {\n updateTarget(projectRoot, shim.relPath, existingBlock.hash);\n return {\n id: shim.id,\n path: abs,\n hash: existingBlock.hash,\n status: 'skipped-drift',\n };\n }\n }\n\n if (existingBlock && existingBlock.content === managed && !hasDrift(existingBlock)) {\n updateTarget(projectRoot, shim.relPath, existingBlock.hash);\n return {\n id: shim.id,\n path: abs,\n hash: existingBlock.hash,\n status: 'unchanged',\n };\n }\n\n const { updated, hash } = writeBlock(existing, managed, MANAGED_BLOCK_VERSION);\n ensureDir(abs);\n writeFileSync(abs, updated, 'utf8');\n updateTarget(projectRoot, shim.relPath, hash);\n return {\n id: shim.id,\n path: abs,\n hash,\n status: existingBlock ? 'updated' : 'created',\n };\n}\n\nexport function writeAllShims(\n projectRoot: string,\n opts: WriteShimsOptions = {}\n): WriteShimResult[] {\n const results = ALL_SHIMS.map((shim) => writeShim(projectRoot, shim, opts));\n refreshDesignMdHash(projectRoot);\n return results;\n}\n\nexport function refreshDesignMdHash(projectRoot: string): string | null {\n const designMdPath = join(projectRoot, 'DESIGN.md');\n if (!existsSync(designMdPath)) return null;\n const hash = hashContent(readFileSync(designMdPath, 'utf8'));\n updateDesignMdHash(projectRoot, hash);\n return hash;\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n} from 'node:fs';\nimport { randomBytes } from 'node:crypto';\nimport { dirname, join } from 'node:path';\n\nexport const PREFERENCES_PATH = '.omd/preferences.md';\nexport const PREFERENCES_SCHEMA = 'omd.preferences/v1';\n\nexport type PreferenceScope =\n | 'visualTheme'\n | 'color'\n | 'typography'\n | 'spacing'\n | 'voice'\n | 'motion'\n | 'layout'\n | `components.${string}`;\n\nexport type PreferenceSignal =\n | 'user-correction'\n | 'user-statement'\n | 'inferred-from-revert'\n | 'inferred-from-edit';\n\nexport type PreferenceConfidence = 'explicit' | 'inferred';\n\nexport type PreferenceStatus =\n | 'pending'\n | 'applied'\n | 'rejected'\n | 'superseded';\n\nexport interface PreferenceMeta {\n id: string;\n timestamp: string;\n scope: PreferenceScope;\n signal: PreferenceSignal;\n confidence: PreferenceConfidence;\n status: PreferenceStatus;\n source_agent?: string;\n source_context?: string;\n applied_design_md_hash?: string;\n applied_at?: string;\n rejected_reason?: string;\n superseded_by?: string;\n}\n\nexport interface PreferenceEntry {\n meta: PreferenceMeta;\n heading: string;\n body: string;\n}\n\nexport interface PreferencesFile {\n schema: string;\n design_md_hash_at_creation: string;\n entries: PreferenceEntry[];\n}\n\nfunction prefPath(projectRoot: string): string {\n return join(projectRoot, PREFERENCES_PATH);\n}\n\nexport function generateId(): string {\n const ts = Date.now().toString(36);\n const rand = randomBytes(4).toString('hex');\n return `pref_${ts}_${rand}`;\n}\n\nexport function slugify(input: string, max = 40): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, max) || 'entry';\n}\n\nconst SCOPE_KEYWORDS: Array<[RegExp, PreferenceScope]> = [\n [/\\b(buttons?|ctas?|btns?)\\b/i, 'components.button'],\n [/\\b(cards?)\\b/i, 'components.card'],\n [/\\b(dialogs?|modals?)\\b/i, 'components.dialog'],\n [/\\b(inputs?|fields?|forms?)\\b/i, 'components.input'],\n [/\\b(nav|navigation|headers?|menus?)\\b/i, 'components.navigation'],\n [/\\b(badges?|chips?|pills?|tags?)\\b/i, 'components.badge'],\n [/\\b(tables?|rows?|cells?)\\b/i, 'components.table'],\n [/\\b(dropdowns?|selects?|comboboxes?)\\b/i, 'components.dropdown'],\n [/\\b(toasts?|notifications?|snackbars?)\\b/i, 'components.toast'],\n [/\\b(tabs?)\\b/i, 'components.tabs'],\n [/\\b(colors?|palette|hex|hue|saturation|shades?|tints?|gradients?)\\b/i, 'color'],\n [/\\b(font|typography|typeface|weight|leading|tracking|letter-?spacing)\\b/i, 'typography'],\n [/\\b(spacing|gap|padding|margin|grid)\\b/i, 'spacing'],\n [/\\b(voice|tone|copy|microcopy|wording|language)\\b/i, 'voice'],\n [/\\b(motion|animation|transition|easing|duration)\\b/i, 'motion'],\n [/\\b(layout|structure|hierarchy)\\b/i, 'layout'],\n [/\\b(theme|aesthetic|vibe|mood|look|feel)\\b/i, 'visualTheme'],\n];\n\nexport function inferScope(note: string): PreferenceScope {\n for (const [re, scope] of SCOPE_KEYWORDS) {\n if (re.test(note)) return scope;\n }\n return 'visualTheme';\n}\n\nfunction renderMeta(meta: PreferenceMeta): string {\n const lines: string[] = [];\n lines.push(`id: ${meta.id}`);\n lines.push(`timestamp: ${meta.timestamp}`);\n lines.push(`scope: ${meta.scope}`);\n lines.push(`signal: ${meta.signal}`);\n lines.push(`confidence: ${meta.confidence}`);\n lines.push(`status: ${meta.status}`);\n if (meta.source_agent) lines.push(`source_agent: ${meta.source_agent}`);\n if (meta.source_context)\n lines.push(`source_context: ${JSON.stringify(meta.source_context)}`);\n if (meta.applied_design_md_hash)\n lines.push(`applied_design_md_hash: ${meta.applied_design_md_hash}`);\n if (meta.applied_at) lines.push(`applied_at: ${meta.applied_at}`);\n if (meta.rejected_reason)\n lines.push(`rejected_reason: ${JSON.stringify(meta.rejected_reason)}`);\n if (meta.superseded_by) lines.push(`superseded_by: ${meta.superseded_by}`);\n return lines.join('\\n');\n}\n\nexport function renderEntry(entry: PreferenceEntry): string {\n return (\n `## ${entry.heading}\\n\\n` +\n '```omd-meta\\n' +\n renderMeta(entry.meta) +\n '\\n```\\n\\n' +\n entry.body.trim() +\n '\\n'\n );\n}\n\nexport function renderFile(file: PreferencesFile): string {\n const header =\n `---\\n` +\n `schema: ${file.schema}\\n` +\n `design_md_hash_at_creation: ${file.design_md_hash_at_creation}\\n` +\n `---\\n\\n` +\n `# Preference Log\\n\\n`;\n const body = file.entries.map(renderEntry).join('\\n');\n return header + body;\n}\n\nconst FRONTMATTER_RE = /^---\\n([\\s\\S]*?)\\n---\\n?/;\nconst ENTRY_SPLIT_RE = /^## /m;\nconst META_BLOCK_RE = /```omd-meta\\n([\\s\\S]*?)\\n```/;\n\nfunction parseFrontmatter(raw: string): {\n fields: Record<string, string>;\n rest: string;\n} {\n const m = FRONTMATTER_RE.exec(raw);\n if (!m) return { fields: {}, rest: raw };\n const fields: Record<string, string> = {};\n for (const line of m[1].split('\\n')) {\n const idx = line.indexOf(':');\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n const val = line.slice(idx + 1).trim();\n fields[key] = val;\n }\n return { fields, rest: raw.slice(m[0].length) };\n}\n\nfunction parseMetaBlock(text: string): Record<string, string> {\n const m = META_BLOCK_RE.exec(text);\n if (!m) return {};\n const fields: Record<string, string> = {};\n for (const line of m[1].split('\\n')) {\n const idx = line.indexOf(':');\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n let val = line.slice(idx + 1).trim();\n if (val.startsWith('\"') && val.endsWith('\"')) {\n try {\n val = JSON.parse(val);\n } catch {\n // keep as-is\n }\n }\n fields[key] = val;\n }\n return fields;\n}\n\nfunction parseEntry(chunk: string): PreferenceEntry | null {\n const newline = chunk.indexOf('\\n');\n const heading = (newline === -1 ? chunk : chunk.slice(0, newline)).trim();\n const rest = newline === -1 ? '' : chunk.slice(newline + 1);\n const metaFields = parseMetaBlock(rest);\n if (!metaFields.id) return null;\n\n const bodyStart = rest.search(META_BLOCK_RE);\n const metaEnd =\n bodyStart >= 0\n ? bodyStart + (META_BLOCK_RE.exec(rest.slice(bodyStart))?.[0].length ?? 0)\n : 0;\n const body = rest.slice(metaEnd).trim();\n\n return {\n heading,\n body,\n meta: {\n id: metaFields.id,\n timestamp: metaFields.timestamp ?? '',\n scope: (metaFields.scope as PreferenceScope) ?? 'visualTheme',\n signal: (metaFields.signal as PreferenceSignal) ?? 'user-statement',\n confidence:\n (metaFields.confidence as PreferenceConfidence) ?? 'explicit',\n status: (metaFields.status as PreferenceStatus) ?? 'pending',\n source_agent: metaFields.source_agent,\n source_context: metaFields.source_context,\n applied_design_md_hash: metaFields.applied_design_md_hash,\n applied_at: metaFields.applied_at,\n rejected_reason: metaFields.rejected_reason,\n superseded_by: metaFields.superseded_by,\n },\n };\n}\n\nexport function parseFile(raw: string): PreferencesFile {\n const { fields, rest } = parseFrontmatter(raw);\n const schema = fields.schema || PREFERENCES_SCHEMA;\n const design_md_hash_at_creation = fields.design_md_hash_at_creation ?? '';\n\n const chunks = rest.split(ENTRY_SPLIT_RE).slice(1);\n const entries = chunks\n .map((c) => parseEntry(c))\n .filter((e): e is PreferenceEntry => e !== null);\n\n return { schema, design_md_hash_at_creation, entries };\n}\n\nexport function readFile(projectRoot: string): PreferencesFile | null {\n const path = prefPath(projectRoot);\n if (!existsSync(path)) return null;\n return parseFile(readFileSync(path, 'utf8'));\n}\n\nexport function writeFile(\n projectRoot: string,\n file: PreferencesFile\n): void {\n const path = prefPath(projectRoot);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, renderFile(file), 'utf8');\n}\n\nexport interface CreateEntryInput {\n note: string;\n scope?: PreferenceScope;\n signal?: PreferenceSignal;\n confidence?: PreferenceConfidence;\n source_agent?: string;\n source_context?: string;\n now?: Date;\n}\n\nexport function buildEntry(input: CreateEntryInput): PreferenceEntry {\n const now = input.now ?? new Date();\n const timestamp = now.toISOString();\n const scope = input.scope ?? inferScope(input.note);\n const slug = slugify(input.note);\n const heading = `${timestamp} — ${slug}`;\n\n return {\n heading,\n body: input.note.trim(),\n meta: {\n id: generateId(),\n timestamp,\n scope,\n signal: input.signal ?? 'user-statement',\n confidence: input.confidence ?? 'explicit',\n status: 'pending',\n source_agent: input.source_agent,\n source_context: input.source_context,\n },\n };\n}\n\nexport interface UpdateStatusInput {\n id: string;\n status: PreferenceStatus;\n applied_design_md_hash?: string;\n rejected_reason?: string;\n superseded_by?: string;\n now?: Date;\n}\n\nexport function updateEntryStatus(\n projectRoot: string,\n input: UpdateStatusInput\n): PreferenceEntry {\n const file = readFile(projectRoot);\n if (!file) {\n throw new Error(\n `no preferences file found at ${projectRoot}/${PREFERENCES_PATH}`\n );\n }\n\n const entry = file.entries.find((e) => e.meta.id === input.id);\n if (!entry) {\n throw new Error(`preference id not found: ${input.id}`);\n }\n\n const now = (input.now ?? new Date()).toISOString();\n entry.meta.status = input.status;\n\n if (input.status === 'applied') {\n entry.meta.applied_at = now;\n if (input.applied_design_md_hash) {\n entry.meta.applied_design_md_hash = input.applied_design_md_hash;\n }\n }\n if (input.status === 'rejected' && input.rejected_reason) {\n entry.meta.rejected_reason = input.rejected_reason;\n }\n if (input.status === 'superseded' && input.superseded_by) {\n entry.meta.superseded_by = input.superseded_by;\n }\n\n writeFile(projectRoot, file);\n return entry;\n}\n\nexport function groupByScope(\n entries: PreferenceEntry[]\n): Map<PreferenceScope, PreferenceEntry[]> {\n const map = new Map<PreferenceScope, PreferenceEntry[]>();\n for (const entry of entries) {\n const bucket = map.get(entry.meta.scope);\n if (bucket) bucket.push(entry);\n else map.set(entry.meta.scope, [entry]);\n }\n return map;\n}\n\nexport function filterByStatus(\n entries: PreferenceEntry[],\n status: PreferenceStatus\n): PreferenceEntry[] {\n return entries.filter((e) => e.meta.status === status);\n}\n\nexport function appendEntry(\n projectRoot: string,\n input: CreateEntryInput,\n designMdHashIfNew = ''\n): PreferenceEntry {\n const existing = readFile(projectRoot);\n const entry = buildEntry(input);\n\n const file: PreferencesFile = existing ?? {\n schema: PREFERENCES_SCHEMA,\n design_md_hash_at_creation: designMdHashIfNew,\n entries: [],\n };\n\n file.entries.push(entry);\n writeFile(projectRoot, file);\n return entry;\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type AgentId = 'claude-code' | 'codex' | 'opencode' | 'cursor' | 'unknown';\n\nexport function detectCallingAgent(): AgentId {\n const env = process.env;\n\n if (env.CLAUDECODE === '1' || env.CLAUDE_CODE === '1' || env.CLAUDE_CODE_TASK_ID) {\n return 'claude-code';\n }\n if (env.CODEX_SESSION_ID || env.CODEX || env.OPENAI_CODEX) {\n return 'codex';\n }\n if (env.OPENCODE || env.OPENCODE_SESSION) {\n return 'opencode';\n }\n if (env.CURSOR_SESSION_ID || env.CURSOR_AGENT) {\n return 'cursor';\n }\n\n return 'unknown';\n}\n\nexport interface AgentPresence {\n claudeCode: boolean;\n codex: boolean;\n opencode: boolean;\n cursor: boolean;\n}\n\nexport function detectInstalledAgents(projectRoot: string): AgentPresence {\n return {\n claudeCode:\n existsSync(join(projectRoot, '.claude')) ||\n existsSync(join(projectRoot, 'CLAUDE.md')),\n codex:\n existsSync(join(projectRoot, '.codex')) ||\n existsSync(join(projectRoot, 'AGENTS.md')) ||\n existsSync(join(projectRoot, 'AGENTS.override.md')),\n opencode:\n existsSync(join(projectRoot, '.opencode')) ||\n existsSync(join(projectRoot, 'opencode.json')) ||\n existsSync(join(projectRoot, 'opencode.jsonc')),\n cursor:\n existsSync(join(projectRoot, '.cursor')) ||\n existsSync(join(projectRoot, '.cursorrules')),\n };\n}\n","import { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\n\nexport interface AxisSpec {\n type: 'int' | 'float' | 'enum';\n domain: [number, number];\n unit?: string;\n step?: number;\n}\n\nexport interface KeywordAxes {\n [axis: string]: { delta: number; range: [number, number] };\n}\n\nexport interface KeywordSpec {\n group: 'tone' | 'density' | 'formality' | 'domain';\n axes: KeywordAxes;\n conflicts_with: string[];\n voice_hints: string[];\n coupled_axes?: string[];\n sources?: string[];\n}\n\nexport interface Vocabulary {\n version: number;\n generated_at: string;\n axis_registry: Record<string, AxisSpec>;\n modifiers: Record<string, number>;\n keywords: Record<string, KeywordSpec>;\n}\n\nexport interface SynonymsFile {\n version: number;\n map: Record<string, string>;\n}\n\nlet cachedVocab: Vocabulary | null = null;\nlet cachedSynonyms: SynonymsFile | null = null;\n\nfunction dataDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n // When built (dist/) we are at dist/*.js → data/ is ../data\n // When running from src/ via tsx we are at src/core/ → data/ is ../../data\n const candidates = [\n join(here, '..', 'data'),\n join(here, '..', '..', 'data'),\n ];\n for (const c of candidates) {\n try {\n readFileSync(join(c, 'vocabulary.json'), 'utf8');\n return c;\n } catch {\n // continue\n }\n }\n throw new Error('data/vocabulary.json not found relative to ' + here);\n}\n\nexport function loadVocabulary(): Vocabulary {\n if (cachedVocab) return cachedVocab;\n const path = join(dataDir(), 'vocabulary.json');\n cachedVocab = JSON.parse(readFileSync(path, 'utf8')) as Vocabulary;\n return cachedVocab;\n}\n\nexport function loadSynonyms(): SynonymsFile {\n if (cachedSynonyms) return cachedSynonyms;\n const path = join(dataDir(), 'synonyms.json');\n cachedSynonyms = JSON.parse(readFileSync(path, 'utf8')) as SynonymsFile;\n return cachedSynonyms;\n}\n\nexport interface ResolvedKeyword {\n keyword: string;\n modifier: number;\n matchedAs: 'direct' | 'synonym';\n synonymSource?: string;\n}\n\nconst MODIFIER_RE = /\\b(primarily|mostly|slightly|very|not)\\s+([a-z][a-z-]*)/gi;\n\nexport function tokenize(description: string): string[] {\n return description\n .toLowerCase()\n .split(/[^a-z-]+/)\n .filter(Boolean);\n}\n\nexport function extractKeywords(description: string): ResolvedKeyword[] {\n const vocab = loadVocabulary();\n const { map: synonyms } = loadSynonyms();\n\n const lower = description.toLowerCase();\n const modifierOverrides = new Map<string, number>();\n let match: RegExpExecArray | null;\n const modRe = new RegExp(MODIFIER_RE.source, MODIFIER_RE.flags);\n while ((match = modRe.exec(lower)) !== null) {\n const modName = match[1];\n const target = match[2];\n const value = vocab.modifiers[modName];\n if (value !== undefined) modifierOverrides.set(target, value);\n }\n\n const tokens = tokenize(description);\n const seen = new Set<string>();\n const results: ResolvedKeyword[] = [];\n\n for (const token of tokens) {\n if (seen.has(token)) continue;\n seen.add(token);\n\n if (vocab.keywords[token]) {\n results.push({\n keyword: token,\n modifier: modifierOverrides.get(token) ?? 1.0,\n matchedAs: 'direct',\n });\n continue;\n }\n\n const syn = synonyms[token];\n if (syn && vocab.keywords[syn]) {\n results.push({\n keyword: syn,\n modifier: modifierOverrides.get(token) ?? 1.0,\n matchedAs: 'synonym',\n synonymSource: token,\n });\n }\n }\n\n return results;\n}\n\nexport interface ConflictResolution {\n kept: ResolvedKeyword[];\n dropped: Array<{ keyword: string; reason: string }>;\n warnings: string[];\n}\n\nexport function resolveConflicts(\n keywords: ResolvedKeyword[]\n): ConflictResolution {\n const vocab = loadVocabulary();\n const kept: ResolvedKeyword[] = [];\n const dropped: Array<{ keyword: string; reason: string }> = [];\n\n // Classify each keyword: kept if strictly higher modifier than any conflicter, else dropped.\n for (const kw of keywords) {\n const spec = vocab.keywords[kw.keyword];\n if (!spec) continue;\n\n const conflictingHere = keywords.filter(\n (other) =>\n other.keyword !== kw.keyword &&\n spec.conflicts_with.includes(other.keyword)\n );\n\n if (conflictingHere.length === 0) {\n kept.push(kw);\n continue;\n }\n\n const strictlyHigherThanAll = conflictingHere.every(\n (c) => kw.modifier > c.modifier + 1e-9\n );\n if (strictlyHigherThanAll) {\n kept.push(kw);\n continue;\n }\n\n dropped.push({\n keyword: kw.keyword,\n reason: `conflicts with ${conflictingHere.map((c) => c.keyword).join(',')}`,\n });\n }\n\n // Emit warnings ONLY for conflict groups where no member was kept\n // (genuine tie — user should disambiguate).\n const warnings: string[] = [];\n const keptSet = new Set(kept.map((k) => k.keyword));\n const warned = new Set<string>();\n for (const kw of keywords) {\n const spec = vocab.keywords[kw.keyword];\n if (!spec) continue;\n const conflictingHere = keywords.filter(\n (other) =>\n other.keyword !== kw.keyword &&\n spec.conflicts_with.includes(other.keyword)\n );\n if (conflictingHere.length === 0) continue;\n const groupKeys = [kw.keyword, ...conflictingHere.map((c) => c.keyword)];\n const groupHasWinner = groupKeys.some((k) => keptSet.has(k));\n if (groupHasWinner) continue;\n const pairKey = [...new Set(groupKeys)].sort().join(',');\n if (warned.has(pairKey)) continue;\n warned.add(pairKey);\n warnings.push(\n `${kw.keyword} ↔ ${conflictingHere.map((c) => c.keyword).join(',')}: use \"primarily <kw>\" or \"very <kw>\" to pick a winner`\n );\n }\n\n return { kept, dropped, warnings };\n}\n\nexport interface DeltaSet {\n axes: Record<string, { value: number; rangeUnion: [number, number]; sources: string[] }>;\n voiceHints: string[];\n unresolved: string[];\n warnings: string[];\n droppedKeywords: Array<{ keyword: string; reason: string }>;\n matchedKeywords: ResolvedKeyword[];\n}\n\nfunction clamp(value: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, value));\n}\n\nfunction snap(value: number, spec: AxisSpec): number {\n if (spec.type === 'int') return Math.round(value);\n if (spec.type === 'enum') {\n const [lo, hi] = spec.domain;\n return Math.abs(value - lo) < Math.abs(value - hi) ? lo : hi;\n }\n return Number(value.toFixed(3));\n}\n\nexport function buildDeltaSet(description: string): DeltaSet {\n const vocab = loadVocabulary();\n const matched = extractKeywords(description);\n const { kept, dropped, warnings } = resolveConflicts(matched);\n\n const axes: DeltaSet['axes'] = {};\n const voiceHintSet = new Set<string>();\n\n for (const kw of kept) {\n const spec = vocab.keywords[kw.keyword];\n const multiplier = kw.modifier;\n\n for (const hint of spec.voice_hints) voiceHintSet.add(hint);\n\n for (const [axisName, axisDelta] of Object.entries(spec.axes)) {\n const bucket = axes[axisName] ?? {\n value: 0,\n rangeUnion: [axisDelta.range[0], axisDelta.range[1]] as [number, number],\n sources: [] as string[],\n };\n bucket.value += axisDelta.delta * multiplier;\n bucket.rangeUnion = [\n Math.min(bucket.rangeUnion[0], axisDelta.range[0]),\n Math.max(bucket.rangeUnion[1], axisDelta.range[1]),\n ];\n bucket.sources.push(kw.keyword);\n axes[axisName] = bucket;\n }\n }\n\n for (const [axisName, bucket] of Object.entries(axes)) {\n const registry = vocab.axis_registry[axisName];\n if (!registry) continue;\n let v = clamp(bucket.value, bucket.rangeUnion[0], bucket.rangeUnion[1]);\n v = clamp(v, registry.domain[0], registry.domain[1]);\n bucket.value = snap(v, registry);\n bucket.sources.sort();\n }\n\n return {\n axes,\n voiceHints: [...voiceHintSet],\n unresolved: [],\n warnings,\n droppedKeywords: dropped,\n matchedKeywords: kept,\n };\n}\n\nexport function listKeywords(): string[] {\n return Object.keys(loadVocabulary().keywords).sort();\n}\n","import { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { tokenize } from './vocabulary.js';\n\nexport interface ReferenceTag {\n id: string;\n color: string;\n category: string;\n keywords: string[];\n}\n\nexport interface RecommendHit {\n id: string;\n category: string;\n color: string;\n keywords: string[];\n score: number;\n matchedKeywords: string[];\n matchedCategories: string[];\n}\n\nconst CATEGORY_HINTS: Record<string, string[]> = {\n Consumer: [\n 'marketplace',\n 'shopping',\n 'ecommerce',\n 'consumer',\n 'b2c',\n 'retail',\n 'subscription',\n 'family',\n 'families',\n 'meal',\n 'meals',\n 'meal-kit',\n 'food',\n 'travel',\n 'social',\n 'community',\n 'buyer',\n 'seller',\n 'parents',\n 'kids',\n 'lifestyle',\n 'recipe',\n 'recipes',\n ],\n Fintech: [\n 'fintech',\n 'banking',\n 'bank',\n 'payment',\n 'payments',\n 'crypto',\n 'trading',\n 'wallet',\n 'invest',\n 'investing',\n 'money',\n 'finance',\n 'financial',\n 'lending',\n 'remittance',\n 'tax',\n ],\n 'Developer Tools': [\n 'developer',\n 'devtool',\n 'devtools',\n 'dev-tool',\n 'deploy',\n 'deployment',\n 'build',\n 'ci',\n 'cd',\n 'cli',\n 'sdk',\n 'editor',\n 'ide',\n 'engineering',\n 'compiler',\n 'runtime',\n ],\n AI: [\n 'ai',\n 'ml',\n 'llm',\n 'agent',\n 'agents',\n 'model',\n 'models',\n 'inference',\n 'gpt',\n 'chatbot',\n 'rag',\n 'embedding',\n 'embeddings',\n 'mcp',\n ],\n 'Design Tools': [\n 'design',\n 'design-tool',\n 'whiteboard',\n 'prototype',\n 'prototyping',\n 'wireframe',\n 'wireframes',\n 'mockup',\n 'mockups',\n 'figma-like',\n 'illustration',\n 'canvas',\n ],\n Productivity: [\n 'saas',\n 'workspace',\n 'team',\n 'teams',\n 'project-management',\n 'enterprise',\n 'b2b',\n 'crm',\n 'docs',\n 'wiki',\n 'collaboration',\n 'kanban',\n 'scheduling',\n 'meetings',\n ],\n Backend: [\n 'backend',\n 'database',\n 'db',\n 'api',\n 'apis',\n 'observability',\n 'monitoring',\n 'logging',\n 'analytics',\n 'pipeline',\n 'data-pipeline',\n 'streaming',\n 'queue',\n 'cache',\n ],\n Automotive: [\n 'car',\n 'cars',\n 'vehicle',\n 'vehicles',\n 'auto',\n 'automotive',\n 'driving',\n 'ev',\n 'electric-vehicle',\n ],\n Marketing: [\n 'marketing',\n 'seo',\n 'campaign',\n 'campaigns',\n 'newsletter',\n 'email-marketing',\n 'attribution',\n ],\n};\n\nfunction matchedCategoriesFor(\n queryTokens: Set<string>,\n queryStems: Set<string>\n): Set<string> {\n const out = new Set<string>();\n for (const [category, hints] of Object.entries(CATEGORY_HINTS)) {\n for (const hint of hints) {\n if (queryTokens.has(hint) || queryStems.has(stem(hint))) {\n out.add(category);\n break;\n }\n }\n }\n return out;\n}\n\nlet cachedTags: ReferenceTag[] | null = null;\n\nfunction stem(s: string): string {\n // Minimal English suffix stripping for recall across -ing/-ed/-s variants.\n // Preserves stems of length ≥3 so we don't collapse short words.\n let out = s;\n for (const suffix of ['ing', 'ed', 'ly', 'es', 's']) {\n if (out.length - suffix.length >= 3 && out.endsWith(suffix)) {\n out = out.slice(0, -suffix.length);\n break;\n }\n }\n return out;\n}\n\nfunction tagsFilePath(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(here, '..', 'data', 'reference-tags.md'),\n join(here, '..', '..', 'data', 'reference-tags.md'),\n ];\n for (const c of candidates) {\n try {\n readFileSync(c, 'utf8');\n return c;\n } catch {\n // continue\n }\n }\n throw new Error('data/reference-tags.md not found');\n}\n\nconst ROW_RE = /^\\|\\s*([a-z0-9._-]+)\\s*\\|\\s*([^|]*?)\\s*\\|\\s*([^|]*?)\\s*\\|\\s*([^|]*?)\\s*\\|$/i;\n\nexport function loadReferenceTags(): ReferenceTag[] {\n if (cachedTags) return cachedTags;\n const raw = readFileSync(tagsFilePath(), 'utf8');\n const rows: ReferenceTag[] = [];\n for (const line of raw.split('\\n')) {\n const m = ROW_RE.exec(line);\n if (!m) continue;\n const [, id, color, category, keywordsRaw] = m;\n if (id === 'id') continue; // header\n if (id.startsWith('---')) continue;\n rows.push({\n id: id.trim(),\n color: color.trim(),\n category: category.trim(),\n keywords: keywordsRaw\n .split(',')\n .map((k) => k.trim().toLowerCase())\n .filter(Boolean),\n });\n }\n cachedTags = rows;\n return rows;\n}\n\nexport interface RecommendOptions {\n topK?: number;\n diversityByCategory?: boolean;\n}\n\nexport function recommend(\n description: string,\n opts: RecommendOptions = {}\n): RecommendHit[] {\n const topK = opts.topK ?? 5;\n const diversityByCategory = opts.diversityByCategory ?? true;\n\n const tags = loadReferenceTags();\n const rawTokens = [\n ...tokenize(description),\n ...description\n .toLowerCase()\n .split(/[^a-z0-9-]+/)\n .filter(Boolean),\n ];\n const queryTokens = new Set(rawTokens);\n const queryStems = new Set(rawTokens.map(stem));\n const matchedCategories = matchedCategoriesFor(queryTokens, queryStems);\n\n // First pass: tag matches per ref, to know whether to gate category bonus.\n const tagMatchByRef = tags.map((t) =>\n t.keywords.filter(\n (kw) => queryTokens.has(kw) || queryStems.has(stem(kw))\n )\n );\n const totalTagMatches = tagMatchByRef.reduce((a, m) => a + m.length, 0);\n\n const scored: Array<RecommendHit & { _ratio: number }> = tags.map((t, i) => {\n const matched = tagMatchByRef[i];\n const tagScore = matched.length;\n const categoryHit = matchedCategories.has(t.category);\n // Category bonus normally requires ≥1 tag match (prevents flooding).\n // But when the description produces zero tag matches anywhere, we\n // fall back to category-only scoring so users still get a useful\n // top-K instead of an alphabetical no-op.\n const categoryBonus =\n categoryHit && (tagScore > 0 || totalTagMatches === 0) ? 0.5 : 0;\n const score = tagScore + categoryBonus;\n const ratio = matched.length / Math.max(1, t.keywords.length);\n return {\n id: t.id,\n category: t.category,\n color: t.color,\n keywords: t.keywords,\n score,\n matchedKeywords: matched,\n matchedCategories: categoryHit ? [t.category] : [],\n _ratio: ratio,\n };\n });\n\n scored.sort(\n (a, b) =>\n b.score - a.score || b._ratio - a._ratio || a.id.localeCompare(b.id)\n );\n\n const stripRatio = (s: typeof scored): RecommendHit[] =>\n s.map(({ _ratio, ...rest }) => {\n void _ratio;\n return rest;\n });\n\n if (!diversityByCategory) return stripRatio(scored.slice(0, topK));\n\n // Category-bucketed diversity: one top hit per category, fill with next best.\n const picked = stripRatio(scored).slice(0, 0);\n const pickedSet = new Set<string>();\n const usedCategories = new Set<string>();\n const allHits = stripRatio(scored);\n for (const hit of allHits) {\n if (picked.length >= topK) break;\n if (usedCategories.has(hit.category)) continue;\n picked.push(hit);\n pickedSet.add(hit.id);\n usedCategories.add(hit.category);\n }\n for (const hit of allHits) {\n if (picked.length >= topK) break;\n if (pickedSet.has(hit.id)) continue;\n picked.push(hit);\n pickedSet.add(hit.id);\n }\n return picked;\n}\n","import { hexToHsl, hslToHex } from '../utils/color.js';\nimport type { DeltaSet } from './vocabulary.js';\n\nexport interface StubStats {\n hexMatches: number;\n hexChanged: number;\n hueShift: number;\n satShift: number;\n lightShift: number;\n sourcesApplied: string[];\n}\n\nexport interface StubResult {\n designMd: string;\n stats: StubStats;\n}\n\nconst HEX_RE = /#[0-9a-fA-F]{6}\\b/g;\nconst NEUTRAL_RE = /^#([0-9a-fA-F])\\1([0-9a-fA-F])\\2([0-9a-fA-F])\\3$/;\n\nconst STUB_HEADER = `<!-- omd:stub v=1 — color-only deterministic shift baseline. Limitations: only color hex codes are shifted (hue/saturation/lightness from delta_set); radius_px, typography.letter_spacing_em, spacing.scale_ratio, and all narrative are NOT shifted by the stub. Run the omd:init skill in an agent session to apply the full delta_set + produce a voice-preserved Hybrid variation. -->`;\n\nfunction isNeutral(hex: string): boolean {\n if (NEUTRAL_RE.test(hex)) return true;\n const [, s] = hexToHsl(hex);\n return s < 5;\n}\n\nfunction shiftHex(hex: string, dh: number, ds: number, dl: number): string {\n const [h, s, l] = hexToHsl(hex);\n const newH = ((h + dh) % 360 + 360) % 360;\n const newS = Math.max(0, Math.min(100, s + ds));\n const newL = Math.max(0, Math.min(100, l + dl));\n return hslToHex(newH, newS, newL);\n}\n\nexport function applyDeltaStub(\n referenceMd: string,\n delta: DeltaSet\n): StubResult {\n const dh = delta.axes['color.hue_deg']?.value ?? 0;\n const ds = delta.axes['color.saturation_pct']?.value ?? 0;\n const dl = delta.axes['color.lightness_pct']?.value ?? 0;\n\n const sourceSet = new Set<string>();\n for (const axis of ['color.hue_deg', 'color.saturation_pct', 'color.lightness_pct']) {\n for (const src of delta.axes[axis]?.sources ?? []) sourceSet.add(src);\n }\n const sources = [...sourceSet].sort();\n\n let hexMatches = 0;\n let hexChanged = 0;\n\n const shifted = referenceMd.replace(HEX_RE, (match) => {\n hexMatches++;\n if (dh === 0 && ds === 0 && dl === 0) return match;\n if (isNeutral(match)) return match; // preserve blacks/whites/grays\n const out = shiftHex(match, dh, ds, dl);\n if (out.toLowerCase() !== match.toLowerCase()) hexChanged++;\n return out;\n });\n\n const header = STUB_HEADER + '\\n\\n';\n return {\n designMd: header + shifted,\n stats: {\n hexMatches,\n hexChanged,\n hueShift: dh,\n satShift: ds,\n lightShift: dl,\n sourcesApplied: sources,\n },\n };\n}\n","import {\n existsSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n mkdirSync,\n} from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nexport interface DeprecateOptions {\n projectRoot: string;\n previousReference?: string;\n newReference: string;\n preferencesReplayed?: number;\n preferencesOrphaned?: number;\n orphanFile?: string;\n reason: string;\n now?: Date;\n}\n\nexport interface DeprecateResult {\n renamed: boolean;\n from: string;\n to: string;\n}\n\nfunction deprecationHeader(opts: DeprecateOptions): string {\n const now = (opts.now ?? new Date()).toISOString();\n const lines = [\n '<!--',\n 'omd:deprecated',\n ` deprecated_at: ${now}`,\n ];\n if (opts.previousReference)\n lines.push(` previous_reference: ${opts.previousReference}`);\n lines.push(` new_reference: ${opts.newReference}`);\n if (opts.preferencesReplayed !== undefined)\n lines.push(` preferences_replayed: ${opts.preferencesReplayed}`);\n if (opts.preferencesOrphaned !== undefined)\n lines.push(` preferences_orphaned: ${opts.preferencesOrphaned}`);\n if (opts.orphanFile) lines.push(` orphan_file: ${opts.orphanFile}`);\n lines.push(` reason: ${opts.reason}`);\n lines.push('-->', '', '');\n return lines.join('\\n');\n}\n\nexport function deprecateDesignMd(opts: DeprecateOptions): DeprecateResult {\n const from = join(opts.projectRoot, 'DESIGN.md');\n const baseTo = join(opts.projectRoot, 'DESIGN_DEPRECATED.md');\n\n if (!existsSync(from)) {\n return { renamed: false, from, to: baseTo };\n }\n\n let target = baseTo;\n if (existsSync(baseTo)) {\n const ts = (opts.now ?? new Date()).toISOString().replace(/[:.]/g, '-');\n target = join(opts.projectRoot, `DESIGN_DEPRECATED.${ts}.md`);\n }\n\n mkdirSync(dirname(target), { recursive: true });\n const prior = readFileSync(from, 'utf8');\n writeFileSync(target, deprecationHeader(opts) + prior, 'utf8');\n unlinkSync(from);\n\n return { renamed: true, from, to: target };\n}\n"],"mappings":"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","names":["isLight","readFileSync","join","dirname","fileURLToPath","__dirname","readFileSync","existsSync","dirname","join","readFileSync","writeFileSync","mkdirSync","existsSync","dirname","join","join","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","readFileSync","writeFileSync","mkdirSync","existsSync","dirname","join","existsSync","join","readFileSync","fileURLToPath","dirname","join","readFileSync","fileURLToPath","dirname","join","dirname","fileURLToPath","join","readFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","dirname","join"]}
|