@ryndesign/cli 0.1.1 → 0.1.2

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/dist/bin.cjs CHANGED
@@ -389,12 +389,14 @@ var init_generate = __esm({
389
389
  description: "Generate design system files for target platforms"
390
390
  },
391
391
  args: {
392
- platforms: {
392
+ platform: {
393
393
  type: "string",
394
+ alias: "p",
394
395
  description: "Comma-separated list of platforms to generate"
395
396
  },
396
397
  watch: {
397
398
  type: "boolean",
399
+ alias: "w",
398
400
  description: "Watch for changes and regenerate",
399
401
  default: false
400
402
  },
@@ -410,6 +412,7 @@ var init_generate = __esm({
410
412
  },
411
413
  config: {
412
414
  type: "string",
415
+ alias: "c",
413
416
  description: "Path to config file",
414
417
  default: "ryndesign.config.ts"
415
418
  }
@@ -442,8 +445,8 @@ var init_generate = __esm({
442
445
  console.log(import_picocolors2.default.green(`\u2713 Resolved themes: ${Object.keys(tokenSet.themes.themes).join(", ")}`));
443
446
  }
444
447
  let generators = config.generators ?? [];
445
- if (args.platforms) {
446
- const targetPlatforms = args.platforms.split(",").map((s) => s.trim());
448
+ if (args.platform) {
449
+ const targetPlatforms = args.platform.split(",").map((s) => s.trim());
447
450
  generators = generators.filter((g) => targetPlatforms.includes(g.name));
448
451
  }
449
452
  if (generators.length === 0) {
@@ -582,6 +585,7 @@ var init_validate = __esm({
582
585
  import_citty3 = require("citty");
583
586
  import_picocolors3 = __toESM(require("picocolors"), 1);
584
587
  import_core2 = require("@ryndesign/core");
588
+ init_config();
585
589
  validate_default = (0, import_citty3.defineCommand)({
586
590
  meta: {
587
591
  name: "validate",
@@ -593,6 +597,12 @@ var init_validate = __esm({
593
597
  description: "Path to token file(s)",
594
598
  required: false
595
599
  },
600
+ config: {
601
+ type: "string",
602
+ alias: "c",
603
+ description: "Path to config file",
604
+ default: "ryndesign.config.ts"
605
+ },
596
606
  strict: {
597
607
  type: "boolean",
598
608
  description: "Treat warnings as errors",
@@ -601,7 +611,8 @@ var init_validate = __esm({
601
611
  },
602
612
  async run({ args }) {
603
613
  console.log(import_picocolors3.default.cyan(" RynDesign Validate\n"));
604
- const patterns = args.path ? [args.path] : ["tokens/**/*.tokens.json"];
614
+ const config = await loadConfig(args.config);
615
+ const patterns = args.path ? [args.path] : config?.tokens ?? ["tokens/**/*.tokens.json"];
605
616
  try {
606
617
  const tree = await (0, import_core2.readAndMergeTokenFiles)(patterns);
607
618
  (0, import_core2.validateTree)(tree);
@@ -673,16 +684,22 @@ var init_preview = __esm({
673
684
  "use strict";
674
685
  import_citty4 = require("citty");
675
686
  import_picocolors4 = __toESM(require("picocolors"), 1);
687
+ init_config();
676
688
  preview_default = (0, import_citty4.defineCommand)({
677
689
  meta: {
678
690
  name: "preview",
679
691
  description: "Start the design system preview server"
680
692
  },
681
693
  args: {
694
+ config: {
695
+ type: "string",
696
+ alias: "c",
697
+ description: "Path to config file",
698
+ default: "ryndesign.config.ts"
699
+ },
682
700
  port: {
683
701
  type: "string",
684
- description: "Port to run the preview server on",
685
- default: "4400"
702
+ description: "Port to run the preview server on"
686
703
  },
687
704
  open: {
688
705
  type: "boolean",
@@ -692,10 +709,12 @@ var init_preview = __esm({
692
709
  },
693
710
  async run({ args }) {
694
711
  console.log(import_picocolors4.default.cyan("\u{1F5A5} RynDesign Preview\n"));
712
+ const config = await loadConfig(args.config);
713
+ const port = args.port ? parseInt(args.port, 10) : config?.preview?.port ?? 4400;
695
714
  try {
696
715
  const { startPreviewServer } = await import("@ryndesign/preview");
697
716
  await startPreviewServer({
698
- port: parseInt(args.port, 10),
717
+ port,
699
718
  open: args.open
700
719
  });
701
720
  } catch {
@@ -862,9 +881,16 @@ var init_figma_pull = __esm({
862
881
  },
863
882
  config: {
864
883
  type: "string",
884
+ alias: "c",
865
885
  description: "Path to config file",
866
886
  default: "ryndesign.config.ts"
867
887
  },
888
+ output: {
889
+ type: "string",
890
+ alias: "o",
891
+ description: "Output file path",
892
+ default: "tokens/figma.tokens.json"
893
+ },
868
894
  merge: {
869
895
  type: "boolean",
870
896
  description: "Merge with existing local tokens instead of overwriting",
@@ -928,7 +954,7 @@ var init_figma_pull = __esm({
928
954
  console.log(import_picocolors6.default.green(` \u2713 Written ${filePath}`));
929
955
  }
930
956
  } else {
931
- const outPath = import_node_path5.default.resolve(cwd, "tokens/figma.tokens.json");
957
+ const outPath = import_node_path5.default.resolve(cwd, args.output);
932
958
  await import_promises5.default.mkdir(import_node_path5.default.dirname(outPath), { recursive: true });
933
959
  if (shouldMerge) {
934
960
  const existing = await readJsonSafe(outPath);
package/dist/bin.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/init.ts","../src/config.ts","../src/commands/generate.ts","../src/commands/validate.ts","../src/commands/preview.ts","../src/commands/add.ts","../src/commands/figma-pull.ts","../src/commands/figma-push.ts","../src/commands/figma-diff.ts","../src/commands/figma.ts","../src/commands/eject.ts","../src/bin.ts","../src/commands/main.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new RynDesign project',\n },\n args: {\n template: {\n type: 'string',\n description: 'Template to use (minimal or full)',\n default: 'minimal',\n },\n platforms: {\n type: 'string',\n description: 'Comma-separated list of target platforms',\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(' RynDesign Init ')));\n\n const template = args.template || await p.select({\n message: 'Choose a template:',\n options: [\n { value: 'minimal', label: 'Minimal', hint: 'Basic color, spacing, typography tokens' },\n { value: 'full', label: 'Full', hint: 'Complete token set with shadows, borders, gradients' },\n ],\n }) as string;\n\n if (p.isCancel(template)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platformsInput = args.platforms || await p.multiselect({\n message: 'Select target platforms:',\n initialValues: ['react', 'swiftui'],\n options: [\n { value: 'react', label: 'React', hint: 'recommended' },\n { value: 'swiftui', label: 'SwiftUI', hint: 'recommended' },\n { value: 'vue', label: 'Vue' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'rails', label: 'Rails' },\n { value: 'uikit', label: 'UIKit' },\n { value: 'compose', label: 'Jetpack Compose' },\n { value: 'android-view', label: 'Android View' },\n ],\n required: true,\n }) as string[];\n\n if (p.isCancel(platformsInput)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platforms = Array.isArray(platformsInput)\n ? platformsInput\n : (platformsInput as string).split(',').map(s => s.trim());\n\n const darkMode = await p.confirm({\n message: 'Enable dark mode support?',\n initialValue: true,\n });\n\n if (p.isCancel(darkMode)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start('Creating project files...');\n\n const cwd = process.cwd();\n\n // Create directories\n await fs.mkdir(path.join(cwd, 'tokens'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'components'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'generated'), { recursive: true });\n\n // Copy template tokens\n // ESM-compatible path resolution\n const templateDir = path.resolve(\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, '../../templates')\n : path.resolve(new URL('.', import.meta.url).pathname, '../../templates')\n );\n const templateFile = template === 'full' ? 'full.tokens.json' : 'minimal.tokens.json';\n\n try {\n const templateContent = await fs.readFile(\n path.join(templateDir, templateFile),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n templateContent\n );\n } catch {\n // If templates not found, create a basic one inline\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n JSON.stringify(getDefaultTokens(), null, 2)\n );\n }\n\n // Create semantic tokens\n await fs.writeFile(\n path.join(cwd, 'tokens', 'semantic.tokens.json'),\n JSON.stringify(getSemanticTokens(), null, 2)\n );\n\n // Create dark theme if enabled\n if (darkMode) {\n try {\n const darkContent = await fs.readFile(\n path.join(templateDir, 'dark.tokens.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n darkContent\n );\n } catch {\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n JSON.stringify(getDarkTokens(), null, 2)\n );\n }\n }\n\n // Create config file\n const configContent = generateConfig(platforms, darkMode as boolean);\n await fs.writeFile(path.join(cwd, 'ryndesign.config.ts'), configContent);\n\n // Copy button component\n try {\n const buttonComp = await fs.readFile(\n path.join(templateDir, '../components/button.component.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'components', 'button.component.json'),\n buttonComp\n );\n } catch {\n // Skip if not found\n }\n\n // Add generated/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n let gitignore = '';\n try {\n gitignore = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet\n }\n if (!gitignore.includes('generated/')) {\n gitignore += (gitignore.endsWith('\\n') || gitignore === '' ? '' : '\\n') + 'generated/\\n';\n await fs.writeFile(gitignorePath, gitignore);\n }\n } catch {\n // Skip if can't write .gitignore\n }\n\n // Add scripts to package.json if it exists\n try {\n const pkgJsonPath = path.join(cwd, 'package.json');\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n if (!pkg.scripts) pkg.scripts = {};\n if (!pkg.scripts['generate']) pkg.scripts['generate'] = 'ryndesign generate';\n if (!pkg.scripts['preview']) pkg.scripts['preview'] = 'ryndesign preview';\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n } catch {\n // Skip if no package.json or can't modify\n }\n\n s.stop('Project files created!');\n\n p.note(\n [\n `${pc.green('tokens/')} - Your design tokens`,\n `${pc.green('components/')} - Component definitions`,\n `${pc.green('generated/')} - Generated output (gitignored)`,\n `${pc.green('ryndesign.config.ts')} - Configuration`,\n ].join('\\n'),\n 'Project structure'\n );\n\n p.outro(pc.green('Run `ryndesign generate` to generate your design system!'));\n },\n});\n\nfunction generateConfig(platforms: string[], darkMode: boolean): string {\n const imports: string[] = [];\n const generators: string[] = [];\n\n for (const platform of platforms) {\n const pkgName = `@ryndesign/generator-${platform}`;\n const varName = platform.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n imports.push(`import ${varName} from '${pkgName}';`);\n\n if (['react', 'vue', 'svelte'].includes(platform)) {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n cssStrategy: 'css-variables',\n typescript: true,${darkMode ? \"\\n darkMode: 'media+class',\" : ''}\n })`);\n } else {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n })`);\n }\n }\n\n return `import { defineConfig } from '@ryndesign/cli';\n${imports.join('\\n')}\n\nexport default defineConfig({\n tokens: ['tokens/**/*.tokens.json'],\n components: ['components/**/*.component.json'],\n outDir: 'generated',\n${darkMode ? `\n themes: {\n default: 'light',\n dark: { file: 'tokens/dark.tokens.json' },\n },\n` : ''}\n generators: [\n${generators.join(',\\n')}\n ],\n\n preview: { port: 4400, open: true },\n});\n`;\n}\n\nfunction getDefaultTokens() {\n return {\n color: {\n $type: 'color',\n primary: { $value: '#3B82F6' },\n white: { $value: '#FFFFFF' },\n black: { $value: '#000000' },\n gray: {\n 50: { $value: '#F9FAFB' },\n 900: { $value: '#111827' },\n },\n },\n spacing: {\n $type: 'dimension',\n sm: { $value: '8px' },\n md: { $value: '16px' },\n lg: { $value: '24px' },\n },\n };\n}\n\nfunction getSemanticTokens() {\n return {\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.white}' },\n secondary: { $value: '{color.gray.50}' },\n },\n text: {\n primary: { $value: '{color.gray.900}' },\n },\n },\n };\n}\n\nfunction getDarkTokens() {\n return {\n $description: 'Dark theme overrides',\n $extensions: { 'com.ryndesign.theme': { name: 'dark', extends: 'default' } },\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.gray.900}' },\n secondary: { $value: '{color.gray.800}' },\n },\n text: {\n primary: { $value: '{color.gray.50}' },\n },\n },\n };\n}\n","import type { RynDesignConfig } from '@ryndesign/plugin-api';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\n\nconst CONFIG_NAMES = [\n 'ryndesign.config.ts',\n 'ryndesign.config.js',\n 'ryndesign.config.mjs',\n 'ryndesign.config.json',\n];\n\nexport async function loadConfig(configPath?: string): Promise<RynDesignConfig | null> {\n const cwd = process.cwd();\n\n // If explicit path provided, try only that\n if (configPath) {\n return loadConfigFile(path.resolve(cwd, configPath));\n }\n\n // Try each config name in order\n for (const name of CONFIG_NAMES) {\n const absolutePath = path.resolve(cwd, name);\n try {\n await fs.access(absolutePath);\n return loadConfigFile(absolutePath);\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nasync function loadConfigFile(absolutePath: string): Promise<RynDesignConfig | null> {\n try {\n await fs.access(absolutePath);\n } catch {\n return null;\n }\n\n // JSON config\n if (absolutePath.endsWith('.json')) {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n const config = JSON.parse(content) as RynDesignConfig;\n return validateConfig(config, absolutePath);\n } catch (err) {\n throw new Error(`Failed to parse config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n\n // JS/TS config\n try {\n const { createJiti } = await import('jiti');\n const loader = createJiti(absolutePath, {\n interopDefault: true,\n });\n const config = await loader.import(absolutePath) as Record<string, unknown>;\n const resolved = (config.default ?? config) as RynDesignConfig;\n return validateConfig(resolved, absolutePath);\n } catch (err) {\n // Fallback: try dynamic import\n try {\n const mod = await import(absolutePath);\n const resolved = mod.default ?? mod;\n return validateConfig(resolved, absolutePath);\n } catch {\n throw new Error(`Failed to load config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction validateConfig(config: RynDesignConfig, filePath: string): RynDesignConfig {\n if (!config.tokens || !Array.isArray(config.tokens) || config.tokens.length === 0) {\n throw new Error(`Invalid config in ${filePath}: \"tokens\" must be a non-empty array of glob patterns`);\n }\n\n if (config.components && !Array.isArray(config.components)) {\n throw new Error(`Invalid config in ${filePath}: \"components\" must be an array of glob patterns`);\n }\n\n if (config.generators && !Array.isArray(config.generators)) {\n throw new Error(`Invalid config in ${filePath}: \"generators\" must be an array`);\n }\n\n return config;\n}\n\n// Re-export defineConfig for convenience\nexport { defineConfig } from '@ryndesign/plugin-api';\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platforms: {\n type: 'string',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platforms) {\n const targetPlatforms = (args.platforms as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const patterns = args.path ? [args.path as string] : ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n default: '4400',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port: parseInt(args.port as string, 10),\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst AVAILABLE_COMPONENTS = ['button', 'input', 'card', 'checkbox', 'toggle', 'badge', 'avatar'];\n\n// Token dependencies for each component\nconst COMPONENT_TOKENS: Record<string, Record<string, any>> = {\n button: {\n 'component.button': {\n $type: 'color',\n primary: {\n background: { $value: '{color.primary}' },\n text: { $value: '{color.white}' },\n hover: { background: { $value: '{color.primary}' } },\n pressed: { background: { $value: '{color.primary}' } },\n },\n secondary: {\n background: { $value: '{color.secondary}' },\n text: { $value: '{color.white}' },\n },\n borderRadius: { $type: 'dimension', $value: '8px' },\n sm: { paddingX: { $type: 'dimension', $value: '12px' }, paddingY: { $type: 'dimension', $value: '6px' }, fontSize: { $type: 'dimension', $value: '14px' } },\n md: { paddingX: { $type: 'dimension', $value: '16px' }, paddingY: { $type: 'dimension', $value: '10px' }, fontSize: { $type: 'dimension', $value: '16px' } },\n lg: { paddingX: { $type: 'dimension', $value: '24px' }, paddingY: { $type: 'dimension', $value: '14px' }, fontSize: { $type: 'dimension', $value: '18px' } },\n disabled: { background: { $value: '{color.gray.300}' } },\n },\n },\n};\n\nexport default defineCommand({\n meta: {\n name: 'add',\n description: 'Add a component definition',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Component name to add',\n required: false,\n },\n 'with-tokens': {\n type: 'boolean',\n description: 'Also scaffold component tokens',\n default: false,\n },\n },\n async run({ args }) {\n const name = args.name as string || await p.select({\n message: 'Choose a component to add:',\n options: AVAILABLE_COMPONENTS.map(c => ({\n value: c,\n label: c.charAt(0).toUpperCase() + c.slice(1),\n })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const cwd = process.cwd();\n const componentsDir = path.join(cwd, 'components');\n await fs.mkdir(componentsDir, { recursive: true });\n\n const destPath = path.join(componentsDir, `${name}.component.json`);\n\n // Check if already exists\n try {\n await fs.access(destPath);\n console.log(pc.yellow(`Component ${name} already exists at ${destPath}`));\n return;\n } catch {\n // Doesn't exist, proceed\n }\n\n // Try to copy from bundled components\n let copied = false;\n const searchPaths = [\n path.resolve(__dirname, `../../components/${name}.component.json`),\n // ESM fallback\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, `../../components/${name}.component.json`)\n : path.resolve(new URL('.', import.meta.url).pathname, `../../components/${name}.component.json`),\n ];\n\n for (const srcPath of searchPaths) {\n try {\n const content = await fs.readFile(srcPath, 'utf-8');\n await fs.writeFile(destPath, content);\n console.log(pc.green(` Added ${name} component to ${destPath}`));\n copied = true;\n break;\n } catch {\n continue;\n }\n }\n\n if (!copied) {\n console.error(pc.red(`Component \"${name}\" not found in available components.`));\n console.log(pc.gray(`Available: ${AVAILABLE_COMPONENTS.join(', ')}`));\n return;\n }\n\n // Scaffold component tokens if requested\n const withTokens = args['with-tokens'] as boolean;\n if (withTokens && COMPONENT_TOKENS[name]) {\n const tokensDir = path.join(cwd, 'tokens');\n await fs.mkdir(tokensDir, { recursive: true });\n const tokenFile = path.join(tokensDir, `${name}.tokens.json`);\n\n try {\n await fs.access(tokenFile);\n console.log(pc.yellow(` Token file already exists: ${tokenFile}`));\n } catch {\n await fs.writeFile(tokenFile, JSON.stringify(COMPONENT_TOKENS[name], null, 2));\n console.log(pc.green(` Created component tokens: ${tokenFile}`));\n }\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, 'tokens/figma.tokens.json');\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'push',\n description: 'Push design tokens to Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📤 Figma Push\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { pushVariablesToFigma } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n console.log(pc.gray('Building token set...'));\n\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n console.log(pc.gray('Pushing to Figma...'));\n\n const darkTokens = tokenSet.themes.themes['dark']?.tokens;\n\n await pushVariablesToFigma({\n fileKey,\n personalAccessToken: pat,\n tokens: tokenSet.tokens,\n darkTokens,\n });\n\n console.log(pc.green('\\n✓ Figma push complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'diff',\n description: 'Compare local tokens with Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🔍 Figma Diff\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, diffFigmaTokens } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n\n // Build local tokens\n console.log(pc.gray('Building local token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n // Fetch remote tokens\n console.log(pc.gray('Fetching Figma variables...'));\n const remoteTokens = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n // Diff\n const result = diffFigmaTokens(tokenSet.tokens, remoteTokens);\n\n // Display results\n if (result.added.length > 0) {\n console.log(pc.green(`\\n+ Added (local only): ${result.added.length}`));\n for (const entry of result.added) {\n console.log(pc.green(` + ${entry.path}: ${JSON.stringify(entry.local)}`));\n }\n }\n\n if (result.removed.length > 0) {\n console.log(pc.red(`\\n- Removed (Figma only): ${result.removed.length}`));\n for (const entry of result.removed) {\n console.log(pc.red(` - ${entry.path}: ${JSON.stringify(entry.remote)}`));\n }\n }\n\n if (result.modified.length > 0) {\n console.log(pc.yellow(`\\n~ Modified: ${result.modified.length}`));\n for (const entry of result.modified) {\n console.log(pc.yellow(` ~ ${entry.path}: ${JSON.stringify(entry.local)} ← ${JSON.stringify(entry.remote)}`));\n }\n }\n\n console.log(pc.gray(`\\n Unchanged: ${result.unchanged}`));\n\n const total = result.added.length + result.removed.length + result.modified.length;\n if (total === 0) {\n console.log(pc.green('\\n✓ Local and Figma tokens are in sync!'));\n } else {\n console.log(pc.yellow(`\\n${total} difference(s) found.`));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'figma',\n description: 'Figma integration commands',\n },\n subCommands: {\n pull: () => import('./figma-pull.js').then(m => m.default),\n push: () => import('./figma-push.js').then(m => m.default),\n diff: () => import('./figma-diff.js').then(m => m.default),\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst GENERATORS = ['react', 'vue', 'svelte', 'rails', 'swiftui', 'uikit', 'compose', 'android-view'];\n\nexport default defineCommand({\n meta: {\n name: 'eject',\n description: 'Eject a generator for customization',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Generator name to eject',\n required: false,\n },\n },\n async run({ args }) {\n p.intro(pc.bgYellow(pc.black(' RynDesign Eject ')));\n\n const name = args.name as string || await p.select({\n message: 'Select a generator to eject:',\n options: GENERATORS.map(g => ({ value: g, label: `@ryndesign/generator-${g}` })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n if (!GENERATORS.includes(name)) {\n console.error(pc.red(`Unknown generator: ${name}`));\n console.log(pc.gray(`Available: ${GENERATORS.join(', ')}`));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const destDir = path.join(cwd, 'generators', name);\n\n // Check if already ejected\n try {\n await fs.access(destDir);\n console.error(pc.yellow(`Generator \"${name}\" already ejected at generators/${name}/`));\n process.exit(0);\n } catch {\n // Doesn't exist, proceed\n }\n\n const confirm = await p.confirm({\n message: `Eject @ryndesign/generator-${name} to generators/${name}/?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start(`Ejecting generator-${name}...`);\n\n try {\n // Find the installed package source\n const pkgPath = require.resolve(`@ryndesign/generator-${name}/package.json`, {\n paths: [cwd],\n });\n const pkgDir = path.dirname(pkgPath);\n const srcDir = path.join(pkgDir, 'src');\n\n // Check if source exists; if not, copy dist\n let sourceDir: string;\n try {\n await fs.access(srcDir);\n sourceDir = srcDir;\n } catch {\n // Fallback to dist\n sourceDir = path.join(pkgDir, 'dist');\n }\n\n // Create destination\n await fs.mkdir(destDir, { recursive: true });\n\n // Copy files\n await copyDir(sourceDir, destDir);\n\n s.stop(`Generator ejected!`);\n\n p.note(\n [\n `Files copied to: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Update your ryndesign.config.ts:',\n pc.gray(` import customGenerator from './generators/${name}/index.js';`),\n '',\n 'Replace the original generator with your custom one.',\n ].join('\\n'),\n 'Next steps'\n );\n } catch (err) {\n s.stop('Eject failed');\n console.error(pc.red(`Error: ${(err as Error).message}`));\n\n // Fallback: create a skeleton generator\n s.start('Creating skeleton generator...');\n await createSkeletonGenerator(destDir, name);\n s.stop('Skeleton generator created!');\n\n p.note(\n [\n `Skeleton created at: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Customize the generator files and update your config.',\n ].join('\\n'),\n 'Next steps'\n );\n }\n\n p.outro(pc.green('Done!'));\n },\n});\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nasync function createSkeletonGenerator(dir: string, name: string): Promise<void> {\n const pascalName = name.charAt(0).toUpperCase() + name.slice(1).replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n\n const indexContent = `import type { GeneratorPlugin, GeneratorContext, GeneratedFile, ResolvedComponent } from '@ryndesign/plugin-api';\n\nexport default function ${name.replace(/-/g, '')}Generator(options = {}): GeneratorPlugin {\n return {\n name: '${name}',\n displayName: '${pascalName}',\n platform: 'web',\n outputExtensions: ['.ts', '.css'],\n\n async generateTokens(ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement token generation\n return [];\n },\n\n async generateComponent(comp: ResolvedComponent, ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement component generation\n return [];\n },\n };\n}\n`;\n\n await fs.writeFile(path.join(dir, 'index.ts'), indexContent, 'utf-8');\n}\n","#!/usr/bin/env node\nimport { runMain } from 'citty';\nimport { main } from './commands/main.js';\n\nrunMain(main);\n","import { defineCommand } from 'citty';\n\nexport const main = defineCommand({\n meta: {\n name: 'ryndesign',\n version: '0.1.0',\n description: 'Multi-platform design system generator',\n },\n subCommands: {\n init: () => import('./init.js').then(m => m.default),\n generate: () => import('./generate.js').then(m => m.default),\n validate: () => import('./validate.js').then(m => m.default),\n preview: () => import('./preview.js').then(m => m.default),\n add: () => import('./add.js').then(m => m.default),\n figma: () => import('./figma.js').then(m => m.default),\n eject: () => import('./eject.js').then(m => m.default),\n },\n});\n"],"mappings":"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","names":["pc","s","fs","path","path","fs","import_node_path","import_promises","import_citty","import_picocolors","import_node_path","import_promises","pc","path","fs","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","pc","import_citty","p","import_picocolors","import_promises","import_node_path","import_meta","path","fs","pc","fs","import_citty","import_picocolors","import_promises","import_node_path","pc","path","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_node_path","import_promises","fs","path","import_citty","p","import_picocolors","import_promises","import_node_path","pc","confirm","import_citty","import_citty"]}
1
+ {"version":3,"sources":["../src/commands/init.ts","../src/config.ts","../src/commands/generate.ts","../src/commands/validate.ts","../src/commands/preview.ts","../src/commands/add.ts","../src/commands/figma-pull.ts","../src/commands/figma-push.ts","../src/commands/figma-diff.ts","../src/commands/figma.ts","../src/commands/eject.ts","../src/bin.ts","../src/commands/main.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new RynDesign project',\n },\n args: {\n template: {\n type: 'string',\n description: 'Template to use (minimal or full)',\n default: 'minimal',\n },\n platforms: {\n type: 'string',\n description: 'Comma-separated list of target platforms',\n },\n },\n async run({ args }) {\n p.intro(pc.bgCyan(pc.black(' RynDesign Init ')));\n\n const template = args.template || await p.select({\n message: 'Choose a template:',\n options: [\n { value: 'minimal', label: 'Minimal', hint: 'Basic color, spacing, typography tokens' },\n { value: 'full', label: 'Full', hint: 'Complete token set with shadows, borders, gradients' },\n ],\n }) as string;\n\n if (p.isCancel(template)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platformsInput = args.platforms || await p.multiselect({\n message: 'Select target platforms:',\n initialValues: ['react', 'swiftui'],\n options: [\n { value: 'react', label: 'React', hint: 'recommended' },\n { value: 'swiftui', label: 'SwiftUI', hint: 'recommended' },\n { value: 'vue', label: 'Vue' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'rails', label: 'Rails' },\n { value: 'uikit', label: 'UIKit' },\n { value: 'compose', label: 'Jetpack Compose' },\n { value: 'android-view', label: 'Android View' },\n ],\n required: true,\n }) as string[];\n\n if (p.isCancel(platformsInput)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const platforms = Array.isArray(platformsInput)\n ? platformsInput\n : (platformsInput as string).split(',').map(s => s.trim());\n\n const darkMode = await p.confirm({\n message: 'Enable dark mode support?',\n initialValue: true,\n });\n\n if (p.isCancel(darkMode)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start('Creating project files...');\n\n const cwd = process.cwd();\n\n // Create directories\n await fs.mkdir(path.join(cwd, 'tokens'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'components'), { recursive: true });\n await fs.mkdir(path.join(cwd, 'generated'), { recursive: true });\n\n // Copy template tokens\n // ESM-compatible path resolution\n const templateDir = path.resolve(\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, '../../templates')\n : path.resolve(new URL('.', import.meta.url).pathname, '../../templates')\n );\n const templateFile = template === 'full' ? 'full.tokens.json' : 'minimal.tokens.json';\n\n try {\n const templateContent = await fs.readFile(\n path.join(templateDir, templateFile),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n templateContent\n );\n } catch {\n // If templates not found, create a basic one inline\n await fs.writeFile(\n path.join(cwd, 'tokens', 'base.tokens.json'),\n JSON.stringify(getDefaultTokens(), null, 2)\n );\n }\n\n // Create semantic tokens\n await fs.writeFile(\n path.join(cwd, 'tokens', 'semantic.tokens.json'),\n JSON.stringify(getSemanticTokens(), null, 2)\n );\n\n // Create dark theme if enabled\n if (darkMode) {\n try {\n const darkContent = await fs.readFile(\n path.join(templateDir, 'dark.tokens.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n darkContent\n );\n } catch {\n await fs.writeFile(\n path.join(cwd, 'tokens', 'dark.tokens.json'),\n JSON.stringify(getDarkTokens(), null, 2)\n );\n }\n }\n\n // Create config file\n const configContent = generateConfig(platforms, darkMode as boolean);\n await fs.writeFile(path.join(cwd, 'ryndesign.config.ts'), configContent);\n\n // Copy button component\n try {\n const buttonComp = await fs.readFile(\n path.join(templateDir, '../components/button.component.json'),\n 'utf-8'\n );\n await fs.writeFile(\n path.join(cwd, 'components', 'button.component.json'),\n buttonComp\n );\n } catch {\n // Skip if not found\n }\n\n // Add generated/ to .gitignore\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n let gitignore = '';\n try {\n gitignore = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet\n }\n if (!gitignore.includes('generated/')) {\n gitignore += (gitignore.endsWith('\\n') || gitignore === '' ? '' : '\\n') + 'generated/\\n';\n await fs.writeFile(gitignorePath, gitignore);\n }\n } catch {\n // Skip if can't write .gitignore\n }\n\n // Add scripts to package.json if it exists\n try {\n const pkgJsonPath = path.join(cwd, 'package.json');\n const pkgContent = await fs.readFile(pkgJsonPath, 'utf-8');\n const pkg = JSON.parse(pkgContent);\n if (!pkg.scripts) pkg.scripts = {};\n if (!pkg.scripts['generate']) pkg.scripts['generate'] = 'ryndesign generate';\n if (!pkg.scripts['preview']) pkg.scripts['preview'] = 'ryndesign preview';\n await fs.writeFile(pkgJsonPath, JSON.stringify(pkg, null, 2) + '\\n');\n } catch {\n // Skip if no package.json or can't modify\n }\n\n s.stop('Project files created!');\n\n p.note(\n [\n `${pc.green('tokens/')} - Your design tokens`,\n `${pc.green('components/')} - Component definitions`,\n `${pc.green('generated/')} - Generated output (gitignored)`,\n `${pc.green('ryndesign.config.ts')} - Configuration`,\n ].join('\\n'),\n 'Project structure'\n );\n\n p.outro(pc.green('Run `ryndesign generate` to generate your design system!'));\n },\n});\n\nfunction generateConfig(platforms: string[], darkMode: boolean): string {\n const imports: string[] = [];\n const generators: string[] = [];\n\n for (const platform of platforms) {\n const pkgName = `@ryndesign/generator-${platform}`;\n const varName = platform.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n imports.push(`import ${varName} from '${pkgName}';`);\n\n if (['react', 'vue', 'svelte'].includes(platform)) {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n cssStrategy: 'css-variables',\n typescript: true,${darkMode ? \"\\n darkMode: 'media+class',\" : ''}\n })`);\n } else {\n generators.push(` ${varName}({\n outDir: 'generated/${platform}',\n })`);\n }\n }\n\n return `import { defineConfig } from '@ryndesign/cli';\n${imports.join('\\n')}\n\nexport default defineConfig({\n tokens: ['tokens/**/*.tokens.json'],\n components: ['components/**/*.component.json'],\n outDir: 'generated',\n${darkMode ? `\n themes: {\n default: 'light',\n dark: { file: 'tokens/dark.tokens.json' },\n },\n` : ''}\n generators: [\n${generators.join(',\\n')}\n ],\n\n preview: { port: 4400, open: true },\n});\n`;\n}\n\nfunction getDefaultTokens() {\n return {\n color: {\n $type: 'color',\n primary: { $value: '#3B82F6' },\n white: { $value: '#FFFFFF' },\n black: { $value: '#000000' },\n gray: {\n 50: { $value: '#F9FAFB' },\n 900: { $value: '#111827' },\n },\n },\n spacing: {\n $type: 'dimension',\n sm: { $value: '8px' },\n md: { $value: '16px' },\n lg: { $value: '24px' },\n },\n };\n}\n\nfunction getSemanticTokens() {\n return {\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.white}' },\n secondary: { $value: '{color.gray.50}' },\n },\n text: {\n primary: { $value: '{color.gray.900}' },\n },\n },\n };\n}\n\nfunction getDarkTokens() {\n return {\n $description: 'Dark theme overrides',\n $extensions: { 'com.ryndesign.theme': { name: 'dark', extends: 'default' } },\n color: {\n $type: 'color',\n background: {\n primary: { $value: '{color.gray.900}' },\n secondary: { $value: '{color.gray.800}' },\n },\n text: {\n primary: { $value: '{color.gray.50}' },\n },\n },\n };\n}\n","import type { RynDesignConfig } from '@ryndesign/plugin-api';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\n\nconst CONFIG_NAMES = [\n 'ryndesign.config.ts',\n 'ryndesign.config.js',\n 'ryndesign.config.mjs',\n 'ryndesign.config.json',\n];\n\nexport async function loadConfig(configPath?: string): Promise<RynDesignConfig | null> {\n const cwd = process.cwd();\n\n // If explicit path provided, try only that\n if (configPath) {\n return loadConfigFile(path.resolve(cwd, configPath));\n }\n\n // Try each config name in order\n for (const name of CONFIG_NAMES) {\n const absolutePath = path.resolve(cwd, name);\n try {\n await fs.access(absolutePath);\n return loadConfigFile(absolutePath);\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nasync function loadConfigFile(absolutePath: string): Promise<RynDesignConfig | null> {\n try {\n await fs.access(absolutePath);\n } catch {\n return null;\n }\n\n // JSON config\n if (absolutePath.endsWith('.json')) {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n const config = JSON.parse(content) as RynDesignConfig;\n return validateConfig(config, absolutePath);\n } catch (err) {\n throw new Error(`Failed to parse config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n\n // JS/TS config\n try {\n const { createJiti } = await import('jiti');\n const loader = createJiti(absolutePath, {\n interopDefault: true,\n });\n const config = await loader.import(absolutePath) as Record<string, unknown>;\n const resolved = (config.default ?? config) as RynDesignConfig;\n return validateConfig(resolved, absolutePath);\n } catch (err) {\n // Fallback: try dynamic import\n try {\n const mod = await import(absolutePath);\n const resolved = mod.default ?? mod;\n return validateConfig(resolved, absolutePath);\n } catch {\n throw new Error(`Failed to load config ${absolutePath}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction validateConfig(config: RynDesignConfig, filePath: string): RynDesignConfig {\n if (!config.tokens || !Array.isArray(config.tokens) || config.tokens.length === 0) {\n throw new Error(`Invalid config in ${filePath}: \"tokens\" must be a non-empty array of glob patterns`);\n }\n\n if (config.components && !Array.isArray(config.components)) {\n throw new Error(`Invalid config in ${filePath}: \"components\" must be an array of glob patterns`);\n }\n\n if (config.generators && !Array.isArray(config.generators)) {\n throw new Error(`Invalid config in ${filePath}: \"generators\" must be an array`);\n }\n\n return config;\n}\n\n// Re-export defineConfig for convenience\nexport { defineConfig } from '@ryndesign/plugin-api';\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platform: {\n type: 'string',\n alias: 'p',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n alias: 'w',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platform) {\n const targetPlatforms = (args.platform as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const config = await loadConfig(args.config as string);\n const patterns = args.path\n ? [args.path as string]\n : config?.tokens ?? ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n const config = await loadConfig(args.config as string);\n const port = args.port\n ? parseInt(args.port as string, 10)\n : config?.preview?.port ?? 4400;\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port,\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst AVAILABLE_COMPONENTS = ['button', 'input', 'card', 'checkbox', 'toggle', 'badge', 'avatar'];\n\n// Token dependencies for each component\nconst COMPONENT_TOKENS: Record<string, Record<string, any>> = {\n button: {\n 'component.button': {\n $type: 'color',\n primary: {\n background: { $value: '{color.primary}' },\n text: { $value: '{color.white}' },\n hover: { background: { $value: '{color.primary}' } },\n pressed: { background: { $value: '{color.primary}' } },\n },\n secondary: {\n background: { $value: '{color.secondary}' },\n text: { $value: '{color.white}' },\n },\n borderRadius: { $type: 'dimension', $value: '8px' },\n sm: { paddingX: { $type: 'dimension', $value: '12px' }, paddingY: { $type: 'dimension', $value: '6px' }, fontSize: { $type: 'dimension', $value: '14px' } },\n md: { paddingX: { $type: 'dimension', $value: '16px' }, paddingY: { $type: 'dimension', $value: '10px' }, fontSize: { $type: 'dimension', $value: '16px' } },\n lg: { paddingX: { $type: 'dimension', $value: '24px' }, paddingY: { $type: 'dimension', $value: '14px' }, fontSize: { $type: 'dimension', $value: '18px' } },\n disabled: { background: { $value: '{color.gray.300}' } },\n },\n },\n};\n\nexport default defineCommand({\n meta: {\n name: 'add',\n description: 'Add a component definition',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Component name to add',\n required: false,\n },\n 'with-tokens': {\n type: 'boolean',\n description: 'Also scaffold component tokens',\n default: false,\n },\n },\n async run({ args }) {\n const name = args.name as string || await p.select({\n message: 'Choose a component to add:',\n options: AVAILABLE_COMPONENTS.map(c => ({\n value: c,\n label: c.charAt(0).toUpperCase() + c.slice(1),\n })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const cwd = process.cwd();\n const componentsDir = path.join(cwd, 'components');\n await fs.mkdir(componentsDir, { recursive: true });\n\n const destPath = path.join(componentsDir, `${name}.component.json`);\n\n // Check if already exists\n try {\n await fs.access(destPath);\n console.log(pc.yellow(`Component ${name} already exists at ${destPath}`));\n return;\n } catch {\n // Doesn't exist, proceed\n }\n\n // Try to copy from bundled components\n let copied = false;\n const searchPaths = [\n path.resolve(__dirname, `../../components/${name}.component.json`),\n // ESM fallback\n typeof __dirname !== 'undefined'\n ? path.resolve(__dirname, `../../components/${name}.component.json`)\n : path.resolve(new URL('.', import.meta.url).pathname, `../../components/${name}.component.json`),\n ];\n\n for (const srcPath of searchPaths) {\n try {\n const content = await fs.readFile(srcPath, 'utf-8');\n await fs.writeFile(destPath, content);\n console.log(pc.green(` Added ${name} component to ${destPath}`));\n copied = true;\n break;\n } catch {\n continue;\n }\n }\n\n if (!copied) {\n console.error(pc.red(`Component \"${name}\" not found in available components.`));\n console.log(pc.gray(`Available: ${AVAILABLE_COMPONENTS.join(', ')}`));\n return;\n }\n\n // Scaffold component tokens if requested\n const withTokens = args['with-tokens'] as boolean;\n if (withTokens && COMPONENT_TOKENS[name]) {\n const tokensDir = path.join(cwd, 'tokens');\n await fs.mkdir(tokensDir, { recursive: true });\n const tokenFile = path.join(tokensDir, `${name}.tokens.json`);\n\n try {\n await fs.access(tokenFile);\n console.log(pc.yellow(` Token file already exists: ${tokenFile}`));\n } catch {\n await fs.writeFile(tokenFile, JSON.stringify(COMPONENT_TOKENS[name], null, 2));\n console.log(pc.green(` Created component tokens: ${tokenFile}`));\n }\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n output: {\n type: 'string',\n alias: 'o',\n description: 'Output file path',\n default: 'tokens/figma.tokens.json',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, args.output as string);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'push',\n description: 'Push design tokens to Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📤 Figma Push\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { pushVariablesToFigma } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n console.log(pc.gray('Building token set...'));\n\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n console.log(pc.gray('Pushing to Figma...'));\n\n const darkTokens = tokenSet.themes.themes['dark']?.tokens;\n\n await pushVariablesToFigma({\n fileKey,\n personalAccessToken: pat,\n tokens: tokenSet.tokens,\n darkTokens,\n });\n\n console.log(pc.green('\\n✓ Figma push complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { buildTokenSet } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'diff',\n description: 'Compare local tokens with Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🔍 Figma Diff\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, diffFigmaTokens } = await import('@ryndesign/figma');\n\n const cwd = process.cwd();\n\n // Build local tokens\n console.log(pc.gray('Building local token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config?.tokens ?? ['tokens/**/*.tokens.json'],\n basePath: cwd,\n themes: config?.themes as any,\n });\n\n // Fetch remote tokens\n console.log(pc.gray('Fetching Figma variables...'));\n const remoteTokens = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n // Diff\n const result = diffFigmaTokens(tokenSet.tokens, remoteTokens);\n\n // Display results\n if (result.added.length > 0) {\n console.log(pc.green(`\\n+ Added (local only): ${result.added.length}`));\n for (const entry of result.added) {\n console.log(pc.green(` + ${entry.path}: ${JSON.stringify(entry.local)}`));\n }\n }\n\n if (result.removed.length > 0) {\n console.log(pc.red(`\\n- Removed (Figma only): ${result.removed.length}`));\n for (const entry of result.removed) {\n console.log(pc.red(` - ${entry.path}: ${JSON.stringify(entry.remote)}`));\n }\n }\n\n if (result.modified.length > 0) {\n console.log(pc.yellow(`\\n~ Modified: ${result.modified.length}`));\n for (const entry of result.modified) {\n console.log(pc.yellow(` ~ ${entry.path}: ${JSON.stringify(entry.local)} ← ${JSON.stringify(entry.remote)}`));\n }\n }\n\n console.log(pc.gray(`\\n Unchanged: ${result.unchanged}`));\n\n const total = result.added.length + result.removed.length + result.modified.length;\n if (total === 0) {\n console.log(pc.green('\\n✓ Local and Figma tokens are in sync!'));\n } else {\n console.log(pc.yellow(`\\n${total} difference(s) found.`));\n }\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'figma',\n description: 'Figma integration commands',\n },\n subCommands: {\n pull: () => import('./figma-pull.js').then(m => m.default),\n push: () => import('./figma-push.js').then(m => m.default),\n diff: () => import('./figma-diff.js').then(m => m.default),\n },\n});\n","import { defineCommand } from 'citty';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst GENERATORS = ['react', 'vue', 'svelte', 'rails', 'swiftui', 'uikit', 'compose', 'android-view'];\n\nexport default defineCommand({\n meta: {\n name: 'eject',\n description: 'Eject a generator for customization',\n },\n args: {\n name: {\n type: 'positional',\n description: 'Generator name to eject',\n required: false,\n },\n },\n async run({ args }) {\n p.intro(pc.bgYellow(pc.black(' RynDesign Eject ')));\n\n const name = args.name as string || await p.select({\n message: 'Select a generator to eject:',\n options: GENERATORS.map(g => ({ value: g, label: `@ryndesign/generator-${g}` })),\n }) as string;\n\n if (p.isCancel(name)) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n if (!GENERATORS.includes(name)) {\n console.error(pc.red(`Unknown generator: ${name}`));\n console.log(pc.gray(`Available: ${GENERATORS.join(', ')}`));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const destDir = path.join(cwd, 'generators', name);\n\n // Check if already ejected\n try {\n await fs.access(destDir);\n console.error(pc.yellow(`Generator \"${name}\" already ejected at generators/${name}/`));\n process.exit(0);\n } catch {\n // Doesn't exist, proceed\n }\n\n const confirm = await p.confirm({\n message: `Eject @ryndesign/generator-${name} to generators/${name}/?`,\n initialValue: true,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start(`Ejecting generator-${name}...`);\n\n try {\n // Find the installed package source\n const pkgPath = require.resolve(`@ryndesign/generator-${name}/package.json`, {\n paths: [cwd],\n });\n const pkgDir = path.dirname(pkgPath);\n const srcDir = path.join(pkgDir, 'src');\n\n // Check if source exists; if not, copy dist\n let sourceDir: string;\n try {\n await fs.access(srcDir);\n sourceDir = srcDir;\n } catch {\n // Fallback to dist\n sourceDir = path.join(pkgDir, 'dist');\n }\n\n // Create destination\n await fs.mkdir(destDir, { recursive: true });\n\n // Copy files\n await copyDir(sourceDir, destDir);\n\n s.stop(`Generator ejected!`);\n\n p.note(\n [\n `Files copied to: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Update your ryndesign.config.ts:',\n pc.gray(` import customGenerator from './generators/${name}/index.js';`),\n '',\n 'Replace the original generator with your custom one.',\n ].join('\\n'),\n 'Next steps'\n );\n } catch (err) {\n s.stop('Eject failed');\n console.error(pc.red(`Error: ${(err as Error).message}`));\n\n // Fallback: create a skeleton generator\n s.start('Creating skeleton generator...');\n await createSkeletonGenerator(destDir, name);\n s.stop('Skeleton generator created!');\n\n p.note(\n [\n `Skeleton created at: ${pc.green(`generators/${name}/`)}`,\n '',\n 'Customize the generator files and update your config.',\n ].join('\\n'),\n 'Next steps'\n );\n }\n\n p.outro(pc.green('Done!'));\n },\n});\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\nasync function createSkeletonGenerator(dir: string, name: string): Promise<void> {\n const pascalName = name.charAt(0).toUpperCase() + name.slice(1).replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n\n const indexContent = `import type { GeneratorPlugin, GeneratorContext, GeneratedFile, ResolvedComponent } from '@ryndesign/plugin-api';\n\nexport default function ${name.replace(/-/g, '')}Generator(options = {}): GeneratorPlugin {\n return {\n name: '${name}',\n displayName: '${pascalName}',\n platform: 'web',\n outputExtensions: ['.ts', '.css'],\n\n async generateTokens(ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement token generation\n return [];\n },\n\n async generateComponent(comp: ResolvedComponent, ctx: GeneratorContext): Promise<GeneratedFile[]> {\n // TODO: Implement component generation\n return [];\n },\n };\n}\n`;\n\n await fs.writeFile(path.join(dir, 'index.ts'), indexContent, 'utf-8');\n}\n","#!/usr/bin/env node\nimport { runMain } from 'citty';\nimport { main } from './commands/main.js';\n\nrunMain(main);\n","import { defineCommand } from 'citty';\n\nexport const main = defineCommand({\n meta: {\n name: 'ryndesign',\n version: '0.1.0',\n description: 'Multi-platform design system generator',\n },\n subCommands: {\n init: () => import('./init.js').then(m => m.default),\n generate: () => import('./generate.js').then(m => m.default),\n validate: () => import('./validate.js').then(m => m.default),\n preview: () => import('./preview.js').then(m => m.default),\n add: () => import('./add.js').then(m => m.default),\n figma: () => import('./figma.js').then(m => m.default),\n eject: () => import('./eject.js').then(m => m.default),\n },\n});\n"],"mappings":"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","names":["pc","s","fs","path","path","fs","import_node_path","import_promises","import_citty","import_picocolors","import_node_path","import_promises","pc","path","fs","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","pc","import_citty","p","import_picocolors","import_promises","import_node_path","import_meta","path","fs","pc","fs","import_citty","import_picocolors","import_promises","import_node_path","pc","path","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_core","pc","import_citty","import_picocolors","import_node_path","import_promises","fs","path","import_citty","p","import_picocolors","import_promises","import_node_path","pc","confirm","import_citty","import_citty"]}
package/dist/bin.js CHANGED
@@ -14,11 +14,11 @@ var main = defineCommand({
14
14
  },
15
15
  subCommands: {
16
16
  init: () => import("./init-AIT7XEQS.js").then((m) => m.default),
17
- generate: () => import("./generate-LES4SXIM.js").then((m) => m.default),
18
- validate: () => import("./validate-RGTQQSUE.js").then((m) => m.default),
19
- preview: () => import("./preview-AXCPYQ53.js").then((m) => m.default),
17
+ generate: () => import("./generate-KMAQLQTY.js").then((m) => m.default),
18
+ validate: () => import("./validate-DNJX65QZ.js").then((m) => m.default),
19
+ preview: () => import("./preview-2A5EQQWG.js").then((m) => m.default),
20
20
  add: () => import("./add-ZYIVP5Z5.js").then((m) => m.default),
21
- figma: () => import("./figma-VTZWLYWQ.js").then((m) => m.default),
21
+ figma: () => import("./figma-CNDSVB36.js").then((m) => m.default),
22
22
  eject: () => import("./eject-WIEISNL6.js").then((m) => m.default)
23
23
  }
24
24
  });
@@ -12,7 +12,7 @@ var figma_default = defineCommand({
12
12
  description: "Figma integration commands"
13
13
  },
14
14
  subCommands: {
15
- pull: () => import("./figma-pull-RCRG6D5G.js").then((m) => m.default),
15
+ pull: () => import("./figma-pull-4GFVG5YD.js").then((m) => m.default),
16
16
  push: () => import("./figma-push-X4PSMN62.js").then((m) => m.default),
17
17
  diff: () => import("./figma-diff-SNSMOAZX.js").then((m) => m.default)
18
18
  }
@@ -20,4 +20,4 @@ var figma_default = defineCommand({
20
20
  export {
21
21
  figma_default as default
22
22
  };
23
- //# sourceMappingURL=figma-VTZWLYWQ.js.map
23
+ //# sourceMappingURL=figma-CNDSVB36.js.map
@@ -24,9 +24,16 @@ var figma_pull_default = defineCommand({
24
24
  },
25
25
  config: {
26
26
  type: "string",
27
+ alias: "c",
27
28
  description: "Path to config file",
28
29
  default: "ryndesign.config.ts"
29
30
  },
31
+ output: {
32
+ type: "string",
33
+ alias: "o",
34
+ description: "Output file path",
35
+ default: "tokens/figma.tokens.json"
36
+ },
30
37
  merge: {
31
38
  type: "boolean",
32
39
  description: "Merge with existing local tokens instead of overwriting",
@@ -90,7 +97,7 @@ var figma_pull_default = defineCommand({
90
97
  console.log(pc.green(` \u2713 Written ${filePath}`));
91
98
  }
92
99
  } else {
93
- const outPath = path.resolve(cwd, "tokens/figma.tokens.json");
100
+ const outPath = path.resolve(cwd, args.output);
94
101
  await fs.mkdir(path.dirname(outPath), { recursive: true });
95
102
  if (shouldMerge) {
96
103
  const existing = await readJsonSafe(outPath);
@@ -127,4 +134,4 @@ async function readJsonSafe(absolutePath) {
127
134
  export {
128
135
  figma_pull_default as default
129
136
  };
130
- //# sourceMappingURL=figma-pull-RCRG6D5G.js.map
137
+ //# sourceMappingURL=figma-pull-4GFVG5YD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/figma-pull.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n output: {\n type: 'string',\n alias: 'o',\n description: 'Output file path',\n default: 'tokens/figma.tokens.json',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, args.output as string);\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -15,12 +15,14 @@ var generate_default = defineCommand({
15
15
  description: "Generate design system files for target platforms"
16
16
  },
17
17
  args: {
18
- platforms: {
18
+ platform: {
19
19
  type: "string",
20
+ alias: "p",
20
21
  description: "Comma-separated list of platforms to generate"
21
22
  },
22
23
  watch: {
23
24
  type: "boolean",
25
+ alias: "w",
24
26
  description: "Watch for changes and regenerate",
25
27
  default: false
26
28
  },
@@ -36,6 +38,7 @@ var generate_default = defineCommand({
36
38
  },
37
39
  config: {
38
40
  type: "string",
41
+ alias: "c",
39
42
  description: "Path to config file",
40
43
  default: "ryndesign.config.ts"
41
44
  }
@@ -68,8 +71,8 @@ var generate_default = defineCommand({
68
71
  console.log(pc.green(`\u2713 Resolved themes: ${Object.keys(tokenSet.themes.themes).join(", ")}`));
69
72
  }
70
73
  let generators = config.generators ?? [];
71
- if (args.platforms) {
72
- const targetPlatforms = args.platforms.split(",").map((s) => s.trim());
74
+ if (args.platform) {
75
+ const targetPlatforms = args.platform.split(",").map((s) => s.trim());
73
76
  generators = generators.filter((g) => targetPlatforms.includes(g.name));
74
77
  }
75
78
  if (generators.length === 0) {
@@ -196,4 +199,4 @@ File changed: ${changedPath}`));
196
199
  export {
197
200
  generate_default as default
198
201
  };
199
- //# sourceMappingURL=generate-LES4SXIM.js.map
202
+ //# sourceMappingURL=generate-KMAQLQTY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platform: {\n type: 'string',\n alias: 'p',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n alias: 'w',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platform) {\n const targetPlatforms = (args.platform as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n"],"mappings":"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","names":[]}
@@ -1,3 +1,6 @@
1
+ import {
2
+ loadConfig
3
+ } from "./chunk-TU5AB45W.js";
1
4
  import "./chunk-DGUM43GV.js";
2
5
 
3
6
  // src/commands/preview.ts
@@ -9,10 +12,15 @@ var preview_default = defineCommand({
9
12
  description: "Start the design system preview server"
10
13
  },
11
14
  args: {
15
+ config: {
16
+ type: "string",
17
+ alias: "c",
18
+ description: "Path to config file",
19
+ default: "ryndesign.config.ts"
20
+ },
12
21
  port: {
13
22
  type: "string",
14
- description: "Port to run the preview server on",
15
- default: "4400"
23
+ description: "Port to run the preview server on"
16
24
  },
17
25
  open: {
18
26
  type: "boolean",
@@ -22,10 +30,12 @@ var preview_default = defineCommand({
22
30
  },
23
31
  async run({ args }) {
24
32
  console.log(pc.cyan("\u{1F5A5} RynDesign Preview\n"));
33
+ const config = await loadConfig(args.config);
34
+ const port = args.port ? parseInt(args.port, 10) : config?.preview?.port ?? 4400;
25
35
  try {
26
36
  const { startPreviewServer } = await import("@ryndesign/preview");
27
37
  await startPreviewServer({
28
- port: parseInt(args.port, 10),
38
+ port,
29
39
  open: args.open
30
40
  });
31
41
  } catch {
@@ -37,4 +47,4 @@ var preview_default = defineCommand({
37
47
  export {
38
48
  preview_default as default
39
49
  };
40
- //# sourceMappingURL=preview-AXCPYQ53.js.map
50
+ //# sourceMappingURL=preview-2A5EQQWG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/preview.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n const config = await loadConfig(args.config as string);\n const port = args.port\n ? parseInt(args.port as string, 10)\n : config?.preview?.port ?? 4400;\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port,\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n"],"mappings":";;;;;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AAGf,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAQ,IAAI,GAAG,KAAK,gCAAyB,CAAC;AAE9C,UAAM,SAAS,MAAM,WAAW,KAAK,MAAgB;AACrD,UAAM,OAAO,KAAK,OACd,SAAS,KAAK,MAAgB,EAAE,IAChC,QAAQ,SAAS,QAAQ;AAE7B,QAAI;AACF,YAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,oBAAoB;AAChE,YAAM,mBAAmB;AAAA,QACvB;AAAA,QACA,MAAM,KAAK;AAAA,MACb,CAAC;AAAA,IACH,QAAQ;AACN,cAAQ,IAAI,GAAG,OAAO,uDAAuD,CAAC;AAC9E,cAAQ,IAAI,GAAG,KAAK,+BAA+B,CAAC;AAAA,IACtD;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1,3 +1,6 @@
1
+ import {
2
+ loadConfig
3
+ } from "./chunk-TU5AB45W.js";
1
4
  import "./chunk-DGUM43GV.js";
2
5
 
3
6
  // src/commands/validate.ts
@@ -15,6 +18,12 @@ var validate_default = defineCommand({
15
18
  description: "Path to token file(s)",
16
19
  required: false
17
20
  },
21
+ config: {
22
+ type: "string",
23
+ alias: "c",
24
+ description: "Path to config file",
25
+ default: "ryndesign.config.ts"
26
+ },
18
27
  strict: {
19
28
  type: "boolean",
20
29
  description: "Treat warnings as errors",
@@ -23,7 +32,8 @@ var validate_default = defineCommand({
23
32
  },
24
33
  async run({ args }) {
25
34
  console.log(pc.cyan(" RynDesign Validate\n"));
26
- const patterns = args.path ? [args.path] : ["tokens/**/*.tokens.json"];
35
+ const config = await loadConfig(args.config);
36
+ const patterns = args.path ? [args.path] : config?.tokens ?? ["tokens/**/*.tokens.json"];
27
37
  try {
28
38
  const tree = await readAndMergeTokenFiles(patterns);
29
39
  validateTree(tree);
@@ -84,4 +94,4 @@ var validate_default = defineCommand({
84
94
  export {
85
95
  validate_default as default
86
96
  };
87
- //# sourceMappingURL=validate-RGTQQSUE.js.map
97
+ //# sourceMappingURL=validate-DNJX65QZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/validate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n config: {\n type: 'string',\n alias: 'c',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const config = await loadConfig(args.config as string);\n const patterns = args.path\n ? [args.path as string]\n : config?.tokens ?? ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryndesign/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "CLI for RynDesign design system generator",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/figma-pull.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadConfig } from '../config.js';\n\nexport default defineCommand({\n meta: {\n name: 'pull',\n description: 'Pull design tokens from Figma',\n },\n args: {\n 'file-key': {\n type: 'string',\n description: 'Figma file key',\n },\n token: {\n type: 'string',\n description: 'Figma personal access token',\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n merge: {\n type: 'boolean',\n description: 'Merge with existing local tokens instead of overwriting',\n default: false,\n },\n strategy: {\n type: 'string',\n description: 'Merge strategy: prefer-remote, prefer-local, remote-only-new',\n default: 'prefer-remote',\n },\n },\n async run({ args }) {\n console.log(pc.cyan('📥 Figma Pull\\n'));\n\n const config = await loadConfig(args.config as string);\n const fileKey = (args['file-key'] as string) || config?.figma?.fileKey;\n const pat = (args.token as string) || config?.figma?.personalAccessToken || process.env.FIGMA_TOKEN;\n\n if (!fileKey) {\n console.error(pc.red('Missing Figma file key. Use --file-key or set in config.'));\n process.exit(1);\n }\n if (!pat) {\n console.error(pc.red('Missing Figma token. Use --token, set FIGMA_TOKEN env var, or configure in ryndesign.config.ts'));\n process.exit(1);\n }\n\n const shouldMerge = args.merge as boolean;\n const strategy = args.strategy as string;\n const validStrategies = ['prefer-remote', 'prefer-local', 'remote-only-new'];\n if (shouldMerge && !validStrategies.includes(strategy)) {\n console.error(pc.red(`Invalid merge strategy \"${strategy}\". Use: ${validStrategies.join(', ')}`));\n process.exit(1);\n }\n\n try {\n const { fetchFigmaVariables, mapFigmaToTokens, resolveFigmaModes, mergeTokens } = await import('@ryndesign/figma');\n\n console.log(pc.gray('Fetching variables from Figma...'));\n\n const variables = await fetchFigmaVariables({\n fileKey,\n personalAccessToken: pat,\n });\n\n console.log(pc.green(`✓ Fetched ${variables.length} variables`));\n\n const cwd = process.cwd();\n const modeMapping = config?.figma?.modeMapping;\n\n if (modeMapping) {\n // Resolve modes into separate files\n const modeFiles = resolveFigmaModes(variables, modeMapping);\n\n for (const [filePath, tree] of Object.entries(modeFiles)) {\n const absolutePath = path.resolve(cwd, filePath);\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(absolutePath);\n if (existing) {\n // For mode files, filter tokens belonging to this mode\n const modeTokens = variables.filter(t => {\n const modeName = Object.keys(modeMapping).find(m => modeMapping[m] === filePath);\n return modeName && t.modes[modeName] !== undefined;\n });\n\n const result = mergeTokens(existing, modeTokens, { strategy: strategy as any });\n await fs.writeFile(absolutePath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged ${filePath}`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n continue;\n }\n }\n\n await fs.writeFile(absolutePath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written ${filePath}`));\n }\n } else {\n // Write all to single file\n const outPath = path.resolve(cwd, 'tokens/figma.tokens.json');\n await fs.mkdir(path.dirname(outPath), { recursive: true });\n\n if (shouldMerge) {\n const existing = await readJsonSafe(outPath);\n if (existing) {\n const result = mergeTokens(existing, variables, { strategy: strategy as any });\n await fs.writeFile(outPath, JSON.stringify(result.merged, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Merged tokens/figma.tokens.json`) + pc.gray(` (+${result.stats.added} new, ${result.stats.updated} updated, ${result.stats.kept} kept)`));\n } else {\n // No existing file, write fresh\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n } else {\n const tree = mapFigmaToTokens(variables);\n await fs.writeFile(outPath, JSON.stringify(tree, null, 2), 'utf-8');\n console.log(pc.green(` ✓ Written tokens/figma.tokens.json`));\n }\n }\n\n console.log(pc.green('\\n✓ Figma pull complete!'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n process.exit(1);\n }\n },\n});\n\nasync function readJsonSafe(absolutePath: string): Promise<Record<string, unknown> | null> {\n try {\n const content = await fs.readFile(absolutePath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { buildTokenSet, loadComponents, resolveComponent, createGeneratorHelpers } from '@ryndesign/core';\nimport { loadConfig } from '../config.js';\nimport type { GeneratedFile, GeneratorPlugin } from '@ryndesign/plugin-api';\n\nexport default defineCommand({\n meta: {\n name: 'generate',\n description: 'Generate design system files for target platforms',\n },\n args: {\n platforms: {\n type: 'string',\n description: 'Comma-separated list of platforms to generate',\n },\n watch: {\n type: 'boolean',\n description: 'Watch for changes and regenerate',\n default: false,\n },\n clean: {\n type: 'boolean',\n description: 'Clean output directory before generating',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be generated without writing files',\n default: false,\n },\n config: {\n type: 'string',\n description: 'Path to config file',\n default: 'ryndesign.config.ts',\n },\n },\n async run({ args }) {\n const dryRun = args['dry-run'] as boolean;\n console.log(pc.cyan(`⚡ RynDesign Generate${dryRun ? ' (dry run)' : ''}\\n`));\n\n const config = await loadConfig(args.config);\n if (!config) {\n console.error(pc.red('Config file not found. Run `ryndesign init` first.'));\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Clean output directory if requested\n if (args.clean && config.outDir) {\n const outDir = path.resolve(cwd, config.outDir);\n await fs.rm(outDir, { recursive: true, force: true });\n await fs.mkdir(outDir, { recursive: true });\n console.log(pc.yellow(`Cleaned ${config.outDir}/`));\n }\n\n // Build token set\n console.log(pc.gray('Building token set...'));\n const tokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n name: 'design-system',\n });\n\n console.log(pc.green(`✓ Resolved ${tokenSet.tokens.length} tokens`));\n if (Object.keys(tokenSet.themes.themes).length > 0) {\n console.log(pc.green(`✓ Resolved themes: ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n // Filter generators by platform if specified\n let generators = config.generators ?? [];\n if (args.platforms) {\n const targetPlatforms = (args.platforms as string).split(',').map(s => s.trim());\n generators = generators.filter(g => targetPlatforms.includes(g.name));\n }\n\n if (generators.length === 0) {\n console.log(pc.yellow('No generators configured. Add generators to your ryndesign.config.ts'));\n return;\n }\n\n // Load and resolve components\n const components = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n\n if (components.length > 0) {\n console.log(pc.green(`✓ Loaded ${components.length} component(s)`));\n }\n\n // Resolve all components\n const resolvedComponents = components.map(compDef => resolveComponent(compDef, tokenSet));\n\n // Run generators\n const allFiles: GeneratedFile[] = [];\n const summary: { name: string; files: number; bytes: number }[] = [];\n\n for (const generator of generators) {\n console.log(pc.gray(`\\nGenerating ${generator.displayName}...`));\n let genFiles = 0;\n let genBytes = 0;\n\n const ctx = {\n tokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: resolvedComponents,\n };\n\n try {\n // Generate tokens\n const tokenFiles = await generator.generateTokens(ctx);\n allFiles.push(...tokenFiles);\n\n for (const file of tokenFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n\n // Generate components\n for (const resolvedComp of resolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n allFiles.push(...compFiles);\n\n for (const file of compFiles) {\n genFiles++;\n genBytes += Buffer.byteLength(file.content, 'utf-8');\n if (!dryRun) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n }\n\n console.log(pc.green(` ✓ ${genFiles} files generated for ${generator.displayName}`));\n summary.push({ name: generator.displayName, files: genFiles, bytes: genBytes });\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName} failed: ${(err as Error).message}`));\n }\n }\n\n // Summary table\n if (summary.length > 0) {\n console.log(pc.gray('\\n Platform Files Size'));\n console.log(pc.gray(' ─────────────────────────────────'));\n for (const s of summary) {\n const sizeStr = s.bytes < 1024 ? `${s.bytes} B` : `${(s.bytes / 1024).toFixed(1)} KB`;\n console.log(` ${s.name.padEnd(18)} ${String(s.files).padStart(5)} ${sizeStr}`);\n }\n }\n\n // Run hooks\n if (config.hooks?.['generate:complete']) {\n await config.hooks['generate:complete'](allFiles);\n }\n\n console.log(pc.green(`\\n✓ Generation complete! ${allFiles.length} files ${dryRun ? 'would be written' : 'written'}.`));\n\n // Watch mode\n if (args.watch) {\n console.log(pc.cyan('\\nWatching for changes...'));\n const { watch } = await import('chokidar');\n const watchPatterns = [...config.tokens, ...(config.components ?? [])];\n const watcher = watch(watchPatterns, {\n cwd,\n ignoreInitial: true,\n });\n\n watcher.on('change', async (changedPath) => {\n console.log(pc.gray(`\\nFile changed: ${changedPath}`));\n try {\n const newTokenSet = await buildTokenSet({\n tokens: config.tokens,\n basePath: cwd,\n themes: config.themes as any,\n });\n\n // Reload components\n const newComponents = config.components\n ? await loadComponents(config.components, cwd)\n : [];\n const newResolvedComponents = newComponents.map(c => resolveComponent(c, newTokenSet));\n\n // Re-run generators\n for (const generator of generators) {\n try {\n const ctx = {\n tokenSet: newTokenSet,\n config: { outDir: config.outDir ?? 'generated', ...generator },\n outputDir: path.resolve(cwd, config.outDir ?? 'generated'),\n helpers: createGeneratorHelpers(),\n components: newResolvedComponents,\n };\n\n const tokenFiles = await generator.generateTokens(ctx);\n for (const file of tokenFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n\n for (const resolvedComp of newResolvedComponents) {\n const compFiles = await generator.generateComponent(resolvedComp, ctx);\n for (const file of compFiles) {\n const filePath = path.resolve(ctx.outputDir, file.path);\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, file.content, 'utf-8');\n }\n }\n } catch (err) {\n console.error(pc.red(` ✗ ${generator.displayName}: ${(err as Error).message}`));\n }\n }\n console.log(pc.green('✓ Rebuilt and regenerated'));\n } catch (err) {\n console.error(pc.red(`Error: ${(err as Error).message}`));\n }\n });\n }\n },\n});\n\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/preview.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\n\nexport default defineCommand({\n meta: {\n name: 'preview',\n description: 'Start the design system preview server',\n },\n args: {\n port: {\n type: 'string',\n description: 'Port to run the preview server on',\n default: '4400',\n },\n open: {\n type: 'boolean',\n description: 'Open browser automatically',\n default: true,\n },\n },\n async run({ args }) {\n console.log(pc.cyan('🖥 RynDesign Preview\\n'));\n\n try {\n const { startPreviewServer } = await import('@ryndesign/preview');\n await startPreviewServer({\n port: parseInt(args.port as string, 10),\n open: args.open as boolean,\n });\n } catch {\n console.log(pc.yellow('Preview package not found. Install @ryndesign/preview'));\n console.log(pc.gray(' pnpm add @ryndesign/preview'));\n }\n },\n});\n"],"mappings":";;;AAAA,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AAEf,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAQ,IAAI,GAAG,KAAK,gCAAyB,CAAC;AAE9C,QAAI;AACF,YAAM,EAAE,mBAAmB,IAAI,MAAM,OAAO,oBAAoB;AAChE,YAAM,mBAAmB;AAAA,QACvB,MAAM,SAAS,KAAK,MAAgB,EAAE;AAAA,QACtC,MAAM,KAAK;AAAA,MACb,CAAC;AAAA,IACH,QAAQ;AACN,cAAQ,IAAI,GAAG,OAAO,uDAAuD,CAAC;AAC9E,cAAQ,IAAI,GAAG,KAAK,+BAA+B,CAAC;AAAA,IACtD;AAAA,EACF;AACF,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/validate.ts"],"sourcesContent":["import { defineCommand } from 'citty';\nimport pc from 'picocolors';\nimport { readAndMergeTokenFiles, validateTree, buildTokenSet, postValidate, TokenValidationError } from '@ryndesign/core';\n\nexport default defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate design token files',\n },\n args: {\n path: {\n type: 'positional',\n description: 'Path to token file(s)',\n required: false,\n },\n strict: {\n type: 'boolean',\n description: 'Treat warnings as errors',\n default: false,\n },\n },\n async run({ args }) {\n console.log(pc.cyan(' RynDesign Validate\\n'));\n\n const patterns = args.path ? [args.path as string] : ['tokens/**/*.tokens.json'];\n\n try {\n // Step 1: Parse and validate structure\n const tree = await readAndMergeTokenFiles(patterns);\n validateTree(tree);\n\n // Step 2: Build full token set for post-validation\n const tokenSet = await buildTokenSet({\n tokens: patterns,\n basePath: process.cwd(),\n });\n\n // Step 3: Post-resolution validation\n const issues = postValidate(tokenSet.tokens, tokenSet.themes);\n const errors = issues.filter(i => i.severity === 'error');\n const warnings = issues.filter(i => i.severity === 'warning');\n\n // Summary\n console.log(pc.green(` ${tokenSet.tokens.length} tokens resolved`));\n console.log(pc.green(` ${tokenSet.groups.length} groups`));\n const themeCount = Object.keys(tokenSet.themes.themes).length;\n if (themeCount > 0) {\n console.log(pc.green(` ${themeCount} theme(s): ${Object.keys(tokenSet.themes.themes).join(', ')}`));\n }\n\n if (errors.length > 0) {\n console.error(pc.red(`\\n ${errors.length} error(s):\\n`));\n for (const issue of errors) {\n console.error(` ${pc.red('x')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s):\\n`));\n for (const issue of warnings) {\n console.log(` ${pc.yellow('!')} ${issue.path}: ${issue.message}`);\n }\n }\n\n if (errors.length === 0 && warnings.length === 0) {\n console.log(pc.green('\\n All tokens are valid!'));\n } else if (errors.length === 0) {\n console.log(pc.green('\\n Tokens are valid (with warnings)'));\n }\n\n // --strict: exit with error if any warnings\n if (args.strict && (errors.length > 0 || warnings.length > 0)) {\n process.exit(1);\n }\n if (errors.length > 0) {\n process.exit(1);\n }\n } catch (err) {\n if (err instanceof TokenValidationError) {\n console.error(pc.red(` Validation failed with ${err.errors.length} issue(s):\\n`));\n for (const issue of err.errors) {\n const icon = issue.severity === 'error' ? pc.red('x') : pc.yellow('!');\n console.error(` ${icon} ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n throw err;\n }\n },\n});\n"],"mappings":"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","names":[]}