@gemini-designer/mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/.prettierrc +9 -0
  2. package/dist/components/catalog.d.ts +24 -0
  3. package/dist/components/catalog.d.ts.map +1 -0
  4. package/dist/components/catalog.js +186 -0
  5. package/dist/components/catalog.js.map +1 -0
  6. package/dist/config/index.d.ts +60 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +199 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/context/builder.d.ts +32 -0
  11. package/dist/context/builder.d.ts.map +1 -0
  12. package/dist/context/builder.js +194 -0
  13. package/dist/context/builder.js.map +1 -0
  14. package/dist/context/filter.d.ts +28 -0
  15. package/dist/context/filter.d.ts.map +1 -0
  16. package/dist/context/filter.js +136 -0
  17. package/dist/context/filter.js.map +1 -0
  18. package/dist/context/grounding.d.ts +27 -0
  19. package/dist/context/grounding.d.ts.map +1 -0
  20. package/dist/context/grounding.js +162 -0
  21. package/dist/context/grounding.js.map +1 -0
  22. package/dist/context/guards.d.ts +31 -0
  23. package/dist/context/guards.d.ts.map +1 -0
  24. package/dist/context/guards.js +76 -0
  25. package/dist/context/guards.js.map +1 -0
  26. package/dist/context/repo-hints.d.ts +12 -0
  27. package/dist/context/repo-hints.d.ts.map +1 -0
  28. package/dist/context/repo-hints.js +40 -0
  29. package/dist/context/repo-hints.js.map +1 -0
  30. package/dist/generation/gemini-client.d.ts +27 -0
  31. package/dist/generation/gemini-client.d.ts.map +1 -0
  32. package/dist/generation/gemini-client.js +64 -0
  33. package/dist/generation/gemini-client.js.map +1 -0
  34. package/dist/generation/litellm-client.d.ts +16 -0
  35. package/dist/generation/litellm-client.d.ts.map +1 -0
  36. package/dist/generation/litellm-client.js +98 -0
  37. package/dist/generation/litellm-client.js.map +1 -0
  38. package/dist/generation/remote-client.d.ts +20 -0
  39. package/dist/generation/remote-client.d.ts.map +1 -0
  40. package/dist/generation/remote-client.js +69 -0
  41. package/dist/generation/remote-client.js.map +1 -0
  42. package/dist/index.d.ts +9 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +30 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/output/file-writer.d.ts +39 -0
  47. package/dist/output/file-writer.d.ts.map +1 -0
  48. package/dist/output/file-writer.js +153 -0
  49. package/dist/output/file-writer.js.map +1 -0
  50. package/dist/output/formatter.d.ts +26 -0
  51. package/dist/output/formatter.d.ts.map +1 -0
  52. package/dist/output/formatter.js +156 -0
  53. package/dist/output/formatter.js.map +1 -0
  54. package/dist/server.d.ts +9 -0
  55. package/dist/server.d.ts.map +1 -0
  56. package/dist/server.js +22 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/stack/detect.d.ts +49 -0
  59. package/dist/stack/detect.d.ts.map +1 -0
  60. package/dist/stack/detect.js +157 -0
  61. package/dist/stack/detect.js.map +1 -0
  62. package/dist/tokens/sync.d.ts +32 -0
  63. package/dist/tokens/sync.d.ts.map +1 -0
  64. package/dist/tokens/sync.js +188 -0
  65. package/dist/tokens/sync.js.map +1 -0
  66. package/dist/tools/analyze-screenshot-ui.d.ts +18 -0
  67. package/dist/tools/analyze-screenshot-ui.d.ts.map +1 -0
  68. package/dist/tools/analyze-screenshot-ui.js +133 -0
  69. package/dist/tools/analyze-screenshot-ui.js.map +1 -0
  70. package/dist/tools/analyze-tokens.d.ts +10 -0
  71. package/dist/tools/analyze-tokens.d.ts.map +1 -0
  72. package/dist/tools/analyze-tokens.js +107 -0
  73. package/dist/tools/analyze-tokens.js.map +1 -0
  74. package/dist/tools/catalog-components.d.ts +14 -0
  75. package/dist/tools/catalog-components.d.ts.map +1 -0
  76. package/dist/tools/catalog-components.js +85 -0
  77. package/dist/tools/catalog-components.js.map +1 -0
  78. package/dist/tools/create-ui.d.ts +10 -0
  79. package/dist/tools/create-ui.d.ts.map +1 -0
  80. package/dist/tools/create-ui.js +167 -0
  81. package/dist/tools/create-ui.js.map +1 -0
  82. package/dist/tools/detect-ui-stack.d.ts +15 -0
  83. package/dist/tools/detect-ui-stack.d.ts.map +1 -0
  84. package/dist/tools/detect-ui-stack.js +52 -0
  85. package/dist/tools/detect-ui-stack.js.map +1 -0
  86. package/dist/tools/generate-component-variants.d.ts +15 -0
  87. package/dist/tools/generate-component-variants.d.ts.map +1 -0
  88. package/dist/tools/generate-component-variants.js +199 -0
  89. package/dist/tools/generate-component-variants.js.map +1 -0
  90. package/dist/tools/generate-vibes.d.ts +10 -0
  91. package/dist/tools/generate-vibes.d.ts.map +1 -0
  92. package/dist/tools/generate-vibes.js +145 -0
  93. package/dist/tools/generate-vibes.js.map +1 -0
  94. package/dist/tools/index.d.ts +12 -0
  95. package/dist/tools/index.d.ts.map +1 -0
  96. package/dist/tools/index.js +36 -0
  97. package/dist/tools/index.js.map +1 -0
  98. package/dist/tools/modify-ui.d.ts +11 -0
  99. package/dist/tools/modify-ui.d.ts.map +1 -0
  100. package/dist/tools/modify-ui.js +207 -0
  101. package/dist/tools/modify-ui.js.map +1 -0
  102. package/dist/tools/scaffold-project.d.ts +10 -0
  103. package/dist/tools/scaffold-project.d.ts.map +1 -0
  104. package/dist/tools/scaffold-project.js +122 -0
  105. package/dist/tools/scaffold-project.js.map +1 -0
  106. package/dist/tools/snippet-ui.d.ts +11 -0
  107. package/dist/tools/snippet-ui.d.ts.map +1 -0
  108. package/dist/tools/snippet-ui.js +194 -0
  109. package/dist/tools/snippet-ui.js.map +1 -0
  110. package/dist/tools/sync-design-tokens.d.ts +14 -0
  111. package/dist/tools/sync-design-tokens.d.ts.map +1 -0
  112. package/dist/tools/sync-design-tokens.js +233 -0
  113. package/dist/tools/sync-design-tokens.js.map +1 -0
  114. package/dist/utils/walk.d.ts +15 -0
  115. package/dist/utils/walk.d.ts.map +1 -0
  116. package/dist/utils/walk.js +63 -0
  117. package/dist/utils/walk.js.map +1 -0
  118. package/eslint.config.js +37 -0
  119. package/package.json +56 -0
  120. package/src/__tests__/builder.test.ts +31 -0
  121. package/src/__tests__/config.test.ts +52 -0
  122. package/src/__tests__/filter.test.ts +109 -0
  123. package/src/components/catalog.ts +214 -0
  124. package/src/config/index.ts +237 -0
  125. package/src/context/builder.ts +233 -0
  126. package/src/context/filter.ts +164 -0
  127. package/src/context/grounding.ts +191 -0
  128. package/src/context/guards.ts +94 -0
  129. package/src/context/repo-hints.ts +43 -0
  130. package/src/generation/gemini-client.ts +94 -0
  131. package/src/generation/litellm-client.ts +121 -0
  132. package/src/generation/remote-client.ts +103 -0
  133. package/src/index.ts +36 -0
  134. package/src/output/file-writer.ts +181 -0
  135. package/src/output/formatter.ts +186 -0
  136. package/src/server.ts +28 -0
  137. package/src/stack/detect.ts +204 -0
  138. package/src/tokens/sync.ts +212 -0
  139. package/src/tools/analyze-screenshot-ui.ts +150 -0
  140. package/src/tools/analyze-tokens.ts +123 -0
  141. package/src/tools/catalog-components.ts +99 -0
  142. package/src/tools/create-ui.ts +194 -0
  143. package/src/tools/detect-ui-stack.ts +64 -0
  144. package/src/tools/generate-component-variants.ts +218 -0
  145. package/src/tools/generate-vibes.ts +177 -0
  146. package/src/tools/index.ts +42 -0
  147. package/src/tools/modify-ui.ts +230 -0
  148. package/src/tools/scaffold-project.ts +138 -0
  149. package/src/tools/snippet-ui.ts +222 -0
  150. package/src/tools/sync-design-tokens.ts +256 -0
  151. package/src/utils/walk.ts +75 -0
  152. package/tsconfig.json +34 -0
  153. package/vitest.config.ts +15 -0
@@ -0,0 +1,153 @@
1
+ /**
2
+ * File Writer
3
+ *
4
+ * Writes generated code to files with safety checks.
5
+ * Supports backup creation and git-aware operations.
6
+ */
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import { execSync } from 'node:child_process';
10
+ import { formatCode } from './formatter.js';
11
+ /**
12
+ * Write content to file with safety features
13
+ */
14
+ export async function writeFile(filePath, content, options = {}) {
15
+ const { backup = true, format = true, createDirs = true, gitAdd = false } = options;
16
+ const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
17
+ try {
18
+ // Create parent directories if needed
19
+ if (createDirs) {
20
+ const dir = path.dirname(absPath);
21
+ if (!fs.existsSync(dir)) {
22
+ fs.mkdirSync(dir, { recursive: true });
23
+ }
24
+ }
25
+ // Create backup if file exists
26
+ let backupPath;
27
+ if (backup && fs.existsSync(absPath)) {
28
+ backupPath = `${absPath}.bak`;
29
+ fs.copyFileSync(absPath, backupPath);
30
+ }
31
+ // Format content if requested
32
+ let finalContent = content;
33
+ if (format) {
34
+ try {
35
+ finalContent = await formatCode(content, { filePath: absPath });
36
+ }
37
+ catch {
38
+ // Keep original if formatting fails
39
+ }
40
+ }
41
+ // Write the file
42
+ fs.writeFileSync(absPath, finalContent, 'utf-8');
43
+ // Git add if requested and in a git repo
44
+ if (gitAdd && isGitRepo(absPath)) {
45
+ try {
46
+ execSync(`git add "${absPath}"`, { cwd: path.dirname(absPath), stdio: 'ignore' });
47
+ }
48
+ catch {
49
+ // Ignore git errors
50
+ }
51
+ }
52
+ return {
53
+ success: true,
54
+ filePath: absPath,
55
+ backupPath,
56
+ };
57
+ }
58
+ catch (error) {
59
+ return {
60
+ success: false,
61
+ filePath: absPath,
62
+ error: error instanceof Error ? error.message : 'Unknown error',
63
+ };
64
+ }
65
+ }
66
+ /**
67
+ * Restore file from backup
68
+ */
69
+ export function restoreFromBackup(filePath) {
70
+ const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
71
+ const backupPath = `${absPath}.bak`;
72
+ if (!fs.existsSync(backupPath)) {
73
+ return false;
74
+ }
75
+ try {
76
+ fs.copyFileSync(backupPath, absPath);
77
+ fs.unlinkSync(backupPath);
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ /**
85
+ * Check if path is in a git repository
86
+ */
87
+ function isGitRepo(filePath) {
88
+ try {
89
+ execSync('git rev-parse --git-dir', {
90
+ cwd: path.dirname(filePath),
91
+ stdio: 'ignore',
92
+ });
93
+ return true;
94
+ }
95
+ catch {
96
+ return false;
97
+ }
98
+ }
99
+ /**
100
+ * Get git status for a file
101
+ */
102
+ export function getGitStatus(filePath) {
103
+ const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
104
+ if (!isGitRepo(absPath)) {
105
+ return 'not-git';
106
+ }
107
+ try {
108
+ const status = execSync(`git status --porcelain "${absPath}"`, {
109
+ cwd: path.dirname(absPath),
110
+ encoding: 'utf-8',
111
+ }).trim();
112
+ if (!status)
113
+ return 'clean';
114
+ if (status.startsWith('??'))
115
+ return 'untracked';
116
+ return 'modified';
117
+ }
118
+ catch {
119
+ return 'not-git';
120
+ }
121
+ }
122
+ /**
123
+ * List all backup files in a directory
124
+ */
125
+ export function listBackups(directory) {
126
+ try {
127
+ const entries = fs.readdirSync(directory, { withFileTypes: true });
128
+ return entries
129
+ .filter((e) => e.isFile() && e.name.endsWith('.bak'))
130
+ .map((e) => path.join(directory, e.name));
131
+ }
132
+ catch {
133
+ return [];
134
+ }
135
+ }
136
+ /**
137
+ * Clean up old backup files
138
+ */
139
+ export function cleanBackups(directory) {
140
+ const backups = listBackups(directory);
141
+ let cleaned = 0;
142
+ for (const backup of backups) {
143
+ try {
144
+ fs.unlinkSync(backup);
145
+ cleaned++;
146
+ }
147
+ catch {
148
+ // Ignore errors
149
+ }
150
+ }
151
+ return cleaned;
152
+ }
153
+ //# sourceMappingURL=file-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-writer.js","sourceRoot":"","sources":["../../src/output/file-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Output Formatter
3
+ *
4
+ * Uses Prettier to format generated code for consistency.
5
+ * Auto-detects language from content or file extension.
6
+ */
7
+ export type SupportedLanguage = 'typescript' | 'javascript' | 'css' | 'html' | 'json' | 'markdown';
8
+ interface FormatOptions {
9
+ language?: SupportedLanguage;
10
+ filePath?: string;
11
+ printWidth?: number;
12
+ tabWidth?: number;
13
+ useTabs?: boolean;
14
+ semi?: boolean;
15
+ singleQuote?: boolean;
16
+ }
17
+ /**
18
+ * Format code using Prettier
19
+ */
20
+ export declare function formatCode(code: string, options?: FormatOptions): Promise<string>;
21
+ /**
22
+ * Extract code blocks from LLM response and format them
23
+ */
24
+ export declare function formatLLMResponse(response: string): Promise<string>;
25
+ export {};
26
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnG,UAAU,aAAa;IACnB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB3F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BzE"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Output Formatter
3
+ *
4
+ * Uses Prettier to format generated code for consistency.
5
+ * Auto-detects language from content or file extension.
6
+ */
7
+ import * as prettier from 'prettier';
8
+ /**
9
+ * Format code using Prettier
10
+ */
11
+ export async function formatCode(code, options = {}) {
12
+ const language = options.language || detectLanguage(code, options.filePath);
13
+ const parser = getParser(language);
14
+ try {
15
+ const formatted = await prettier.format(code, {
16
+ parser,
17
+ printWidth: options.printWidth ?? 100,
18
+ tabWidth: options.tabWidth ?? 2,
19
+ useTabs: options.useTabs ?? false,
20
+ semi: options.semi ?? true,
21
+ singleQuote: options.singleQuote ?? true,
22
+ trailingComma: 'es5',
23
+ bracketSpacing: true,
24
+ arrowParens: 'always',
25
+ });
26
+ return formatted;
27
+ }
28
+ catch (error) {
29
+ // If Prettier fails, return original code
30
+ console.error('[formatter] Prettier error, returning unformatted:', error);
31
+ return code;
32
+ }
33
+ }
34
+ /**
35
+ * Extract code blocks from LLM response and format them
36
+ */
37
+ export async function formatLLMResponse(response) {
38
+ // Match code blocks with language identifier
39
+ const codeBlockRegex = /```(\w+)?\n([\s\S]*?)```/g;
40
+ let result = response;
41
+ let match;
42
+ const replacements = [];
43
+ while ((match = codeBlockRegex.exec(response)) !== null) {
44
+ const [fullMatch, lang, code] = match;
45
+ const language = mapLanguageIdentifier(lang);
46
+ if (language) {
47
+ try {
48
+ const formatted = await formatCode(code.trim(), { language });
49
+ replacements.push({
50
+ original: fullMatch,
51
+ formatted: `\`\`\`${lang}\n${formatted}\`\`\``,
52
+ });
53
+ }
54
+ catch {
55
+ // Keep original if formatting fails
56
+ }
57
+ }
58
+ }
59
+ // Apply replacements
60
+ for (const { original, formatted } of replacements) {
61
+ result = result.replace(original, formatted);
62
+ }
63
+ return result;
64
+ }
65
+ /**
66
+ * Detect language from code content or file path
67
+ */
68
+ function detectLanguage(code, filePath) {
69
+ if (filePath) {
70
+ const ext = filePath.split('.').pop()?.toLowerCase();
71
+ switch (ext) {
72
+ case 'ts':
73
+ case 'tsx':
74
+ return 'typescript';
75
+ case 'js':
76
+ case 'jsx':
77
+ return 'javascript';
78
+ case 'css':
79
+ case 'scss':
80
+ case 'less':
81
+ return 'css';
82
+ case 'html':
83
+ return 'html';
84
+ case 'json':
85
+ return 'json';
86
+ case 'md':
87
+ return 'markdown';
88
+ }
89
+ }
90
+ // Detect from content
91
+ if (code.includes('import React') || code.includes('from "react"') || code.includes("from 'react'")) {
92
+ return code.includes(': React.') || code.includes('<') ? 'typescript' : 'javascript';
93
+ }
94
+ if (code.includes('interface ') || code.includes(': string') || code.includes(': number')) {
95
+ return 'typescript';
96
+ }
97
+ if (code.includes('function ') || code.includes('const ') || code.includes('let ')) {
98
+ return 'javascript';
99
+ }
100
+ if (code.includes('{') && (code.includes('color:') || code.includes('margin:') || code.includes('display:'))) {
101
+ return 'css';
102
+ }
103
+ if (code.startsWith('{') || code.startsWith('[')) {
104
+ try {
105
+ JSON.parse(code);
106
+ return 'json';
107
+ }
108
+ catch {
109
+ // Not JSON
110
+ }
111
+ }
112
+ if (code.includes('<html') || code.includes('<!DOCTYPE')) {
113
+ return 'html';
114
+ }
115
+ // Default to TypeScript for better JSX support
116
+ return 'typescript';
117
+ }
118
+ /**
119
+ * Get Prettier parser for language
120
+ */
121
+ function getParser(language) {
122
+ const parsers = {
123
+ typescript: 'typescript',
124
+ javascript: 'babel',
125
+ css: 'css',
126
+ html: 'html',
127
+ json: 'json',
128
+ markdown: 'markdown',
129
+ };
130
+ return parsers[language];
131
+ }
132
+ /**
133
+ * Map common language identifiers to supported types
134
+ */
135
+ function mapLanguageIdentifier(identifier) {
136
+ if (!identifier)
137
+ return null;
138
+ const lower = identifier.toLowerCase();
139
+ const mapping = {
140
+ ts: 'typescript',
141
+ tsx: 'typescript',
142
+ typescript: 'typescript',
143
+ js: 'javascript',
144
+ jsx: 'javascript',
145
+ javascript: 'javascript',
146
+ css: 'css',
147
+ scss: 'css',
148
+ less: 'css',
149
+ html: 'html',
150
+ json: 'json',
151
+ md: 'markdown',
152
+ markdown: 'markdown',
153
+ };
154
+ return mapping[lower] || null;
155
+ }
156
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAcrC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,UAAyB,EAAE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;YAC1C,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,GAAG;YACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;YAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACxC,aAAa,EAAE,KAAK;YACpB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,QAAQ;SACxB,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,0CAA0C;QAC1C,OAAO,CAAC,KAAK,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACpD,6CAA6C;IAC7C,MAAM,cAAc,GAAG,2BAA2B,CAAC;IACnD,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,IAAI,KAAK,CAAC;IAEV,MAAM,YAAY,GAAmD,EAAE,CAAC;IAExE,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;QACtC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC9D,YAAY,CAAC,IAAI,CAAC;oBACd,QAAQ,EAAE,SAAS;oBACnB,SAAS,EAAE,SAAS,IAAI,KAAK,SAAS,QAAQ;iBACjD,CAAC,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACL,oCAAoC;YACxC,CAAC;QACL,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,YAAY,EAAE,CAAC;QACjD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,QAAiB;IACnD,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;QACrD,QAAQ,GAAG,EAAE,CAAC;YACV,KAAK,IAAI,CAAC;YACV,KAAK,KAAK;gBACN,OAAO,YAAY,CAAC;YACxB,KAAK,IAAI,CAAC;YACV,KAAK,KAAK;gBACN,OAAO,YAAY,CAAC;YACxB,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM;gBACP,OAAO,KAAK,CAAC;YACjB,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB,KAAK,MAAM;gBACP,OAAO,MAAM,CAAC;YAClB,KAAK,IAAI;gBACL,OAAO,UAAU,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAClG,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IACzF,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxF,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjF,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC3G,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACL,WAAW;QACf,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,+CAA+C;IAC/C,OAAO,YAAY,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,QAA2B;IAC1C,MAAM,OAAO,GAAsC;QAC/C,UAAU,EAAE,YAAY;QACxB,UAAU,EAAE,OAAO;QACnB,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,UAAU;KACvB,CAAC;IAEF,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,UAAmB;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,OAAO,GAAsC;QAC/C,EAAE,EAAE,YAAY;QAChB,GAAG,EAAE,YAAY;QACjB,UAAU,EAAE,YAAY;QACxB,EAAE,EAAE,YAAY;QAChB,GAAG,EAAE,YAAY;QACjB,UAAU,EAAE,YAAY;QACxB,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,UAAU;QACd,QAAQ,EAAE,UAAU;KACvB,CAAC;IAEF,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAClC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Server Factory
3
+ *
4
+ * Creates and configures the MCP server with all tools registered.
5
+ */
6
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import { Config } from './config/index.js';
8
+ export declare function createServer(config: Config): Promise<McpServer>;
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,sBAgBhD"}
package/dist/server.js ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * MCP Server Factory
3
+ *
4
+ * Creates and configures the MCP server with all tools registered.
5
+ */
6
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
+ import { registerTools } from './tools/index.js';
9
+ export async function createServer(config) {
10
+ const server = new McpServer({
11
+ name: 'gemini-designer-mcp',
12
+ version: '0.1.0',
13
+ });
14
+ // Register all MCP tools
15
+ registerTools(server, config);
16
+ // Use stdio transport (standard for MCP)
17
+ const transport = new StdioServerTransport();
18
+ await server.connect(transport);
19
+ console.error('[gemini-designer-mcp] Server connected via stdio');
20
+ return server;
21
+ }
22
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC7C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QACzB,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;KACnB,CAAC,CAAC;IAEH,yBAAyB;IACzB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9B,yCAAyC;IACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAElE,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Stack Detection
3
+ *
4
+ * Deterministically detect the frontend stack of a project:
5
+ * - framework (next/react/vue/svelte)
6
+ * - styling approach (tailwind/css-modules/emotion/styled-components)
7
+ * - common component & icon libraries
8
+ * - presence of storybook, eslint, prettier
9
+ */
10
+ export interface StackDetectionResult {
11
+ root: string;
12
+ framework: {
13
+ name: 'nextjs' | 'react' | 'vue' | 'svelte' | 'unknown';
14
+ version?: string;
15
+ router?: 'app' | 'pages' | 'unknown';
16
+ };
17
+ language: {
18
+ typescript: boolean;
19
+ };
20
+ styling: {
21
+ primary: 'tailwind' | 'css-modules' | 'emotion' | 'styled-components' | 'sass' | 'vanilla' | 'unknown';
22
+ detected: string[];
23
+ };
24
+ uiLibraries: string[];
25
+ iconLibraries: string[];
26
+ tooling: {
27
+ storybook: boolean;
28
+ eslint: boolean;
29
+ prettier: boolean;
30
+ vitest: boolean;
31
+ jest: boolean;
32
+ };
33
+ conventions: {
34
+ srcDir: boolean;
35
+ hasAppDir: boolean;
36
+ hasPagesDir: boolean;
37
+ tsconfigPaths?: Record<string, string[]>;
38
+ };
39
+ files: {
40
+ packageJson?: string;
41
+ tsconfig?: string;
42
+ tailwindConfig?: string;
43
+ componentsJson?: string;
44
+ storybookDir?: string;
45
+ };
46
+ warnings: string[];
47
+ }
48
+ export declare function detectUiStack(rootDir: string): StackDetectionResult;
49
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/stack/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACP,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;QACxD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;KACxC,CAAC;IACF,QAAQ,EAAE;QACN,UAAU,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACL,OAAO,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,mBAAmB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;QACvG,QAAQ,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE;QACL,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,WAAW,EAAE;QACT,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KAC5C,CAAC;IACF,KAAK,EAAE;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAqBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAoInE"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Stack Detection
3
+ *
4
+ * Deterministically detect the frontend stack of a project:
5
+ * - framework (next/react/vue/svelte)
6
+ * - styling approach (tailwind/css-modules/emotion/styled-components)
7
+ * - common component & icon libraries
8
+ * - presence of storybook, eslint, prettier
9
+ */
10
+ import * as fs from 'node:fs';
11
+ import * as path from 'node:path';
12
+ function readJsonIfExists(filePath) {
13
+ if (!fs.existsSync(filePath))
14
+ return null;
15
+ try {
16
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function exists(root, ...parts) {
23
+ const p = path.join(root, ...parts);
24
+ return fs.existsSync(p) ? p : null;
25
+ }
26
+ function depVersion(pkg, name) {
27
+ const d = pkg?.dependencies?.[name] || pkg?.devDependencies?.[name] || pkg?.peerDependencies?.[name];
28
+ return typeof d === 'string' ? d : undefined;
29
+ }
30
+ export function detectUiStack(rootDir) {
31
+ const warnings = [];
32
+ const pkgPath = exists(rootDir, 'package.json');
33
+ const pkg = pkgPath ? readJsonIfExists(pkgPath) : null;
34
+ if (!pkg)
35
+ warnings.push('package.json not found or invalid JSON');
36
+ const hasTs = Boolean(exists(rootDir, 'tsconfig.json') ||
37
+ exists(rootDir, 'tsconfig.base.json') ||
38
+ exists(rootDir, 'tsconfig.app.json') ||
39
+ depVersion(pkg, 'typescript'));
40
+ // Framework detection
41
+ let framework = { name: 'unknown', router: 'unknown' };
42
+ if (depVersion(pkg, 'next')) {
43
+ framework = { name: 'nextjs', version: depVersion(pkg, 'next'), router: 'unknown' };
44
+ }
45
+ else if (depVersion(pkg, 'react')) {
46
+ framework = { name: 'react', version: depVersion(pkg, 'react'), router: 'unknown' };
47
+ }
48
+ else if (depVersion(pkg, 'vue')) {
49
+ framework = { name: 'vue', version: depVersion(pkg, 'vue'), router: 'unknown' };
50
+ }
51
+ else if (depVersion(pkg, 'svelte')) {
52
+ framework = { name: 'svelte', version: depVersion(pkg, 'svelte'), router: 'unknown' };
53
+ }
54
+ const srcDir = Boolean(exists(rootDir, 'src'));
55
+ const hasAppDir = Boolean(exists(rootDir, 'app') || exists(rootDir, 'src', 'app'));
56
+ const hasPagesDir = Boolean(exists(rootDir, 'pages') || exists(rootDir, 'src', 'pages'));
57
+ if (framework.name === 'nextjs') {
58
+ framework.router = hasAppDir ? 'app' : hasPagesDir ? 'pages' : 'unknown';
59
+ }
60
+ // Styling detection
61
+ const detectedStyling = [];
62
+ if (depVersion(pkg, 'tailwindcss') || exists(rootDir, 'tailwind.config.js') || exists(rootDir, 'tailwind.config.ts')) {
63
+ detectedStyling.push('tailwind');
64
+ }
65
+ if (depVersion(pkg, 'sass') || depVersion(pkg, 'node-sass'))
66
+ detectedStyling.push('sass');
67
+ if (depVersion(pkg, 'styled-components'))
68
+ detectedStyling.push('styled-components');
69
+ if (depVersion(pkg, '@emotion/react') || depVersion(pkg, '@emotion/styled'))
70
+ detectedStyling.push('emotion');
71
+ // CSS Modules: heuristic – Next and CRA often use .module.css. We can't scan whole tree here; mark as possible.
72
+ if (framework.name === 'nextjs')
73
+ detectedStyling.push('css-modules');
74
+ let primary = 'unknown';
75
+ if (detectedStyling.includes('tailwind'))
76
+ primary = 'tailwind';
77
+ else if (detectedStyling.includes('emotion'))
78
+ primary = 'emotion';
79
+ else if (detectedStyling.includes('styled-components'))
80
+ primary = 'styled-components';
81
+ else if (detectedStyling.includes('sass'))
82
+ primary = 'sass';
83
+ else if (framework.name !== 'unknown')
84
+ primary = 'vanilla';
85
+ // UI libraries (coarse)
86
+ const uiCandidates = [
87
+ '@mui/material',
88
+ 'antd',
89
+ '@chakra-ui/react',
90
+ '@radix-ui/react-dialog',
91
+ '@headlessui/react',
92
+ 'shadcn-ui',
93
+ 'lucide-react',
94
+ '@mantine/core',
95
+ '@nextui-org/react',
96
+ ];
97
+ const uiLibraries = uiCandidates.filter((n) => Boolean(depVersion(pkg, n)));
98
+ // Icon libraries
99
+ const iconCandidates = ['lucide-react', 'react-icons', '@heroicons/react', '@tabler/icons-react', '@phosphor-icons/react'];
100
+ const iconLibraries = iconCandidates.filter((n) => Boolean(depVersion(pkg, n)));
101
+ // Storybook / linting / formatting / tests
102
+ const hasStorybook = Boolean(exists(rootDir, '.storybook')) || Boolean(depVersion(pkg, 'storybook')) || Boolean(depVersion(pkg, '@storybook/react'));
103
+ const hasEslint = Boolean(depVersion(pkg, 'eslint')) || Boolean(exists(rootDir, '.eslintrc')) || Boolean(exists(rootDir, '.eslintrc.js'));
104
+ const hasPrettier = Boolean(depVersion(pkg, 'prettier')) || Boolean(exists(rootDir, '.prettierrc'));
105
+ const hasVitest = Boolean(depVersion(pkg, 'vitest'));
106
+ const hasJest = Boolean(depVersion(pkg, 'jest'));
107
+ // Shadcn detection
108
+ const componentsJson = exists(rootDir, 'components.json');
109
+ if (componentsJson) {
110
+ if (!uiLibraries.includes('shadcn-ui'))
111
+ uiLibraries.push('shadcn-ui');
112
+ }
113
+ // tsconfig paths
114
+ const tsconfigPath = exists(rootDir, 'tsconfig.json') || exists(rootDir, 'tsconfig.base.json');
115
+ let tsconfigPaths;
116
+ if (tsconfigPath) {
117
+ const tsconfig = readJsonIfExists(tsconfigPath);
118
+ const paths = tsconfig?.compilerOptions?.paths;
119
+ if (paths && typeof paths === 'object') {
120
+ tsconfigPaths = paths;
121
+ }
122
+ }
123
+ const tailwindConfig = exists(rootDir, 'tailwind.config.ts') ||
124
+ exists(rootDir, 'tailwind.config.js') ||
125
+ exists(rootDir, 'tailwind.config.cjs') ||
126
+ exists(rootDir, 'tailwind.config.mjs');
127
+ return {
128
+ root: rootDir,
129
+ framework,
130
+ language: { typescript: hasTs },
131
+ styling: { primary, detected: Array.from(new Set(detectedStyling)) },
132
+ uiLibraries: Array.from(new Set(uiLibraries)),
133
+ iconLibraries: Array.from(new Set(iconLibraries)),
134
+ tooling: {
135
+ storybook: hasStorybook,
136
+ eslint: hasEslint,
137
+ prettier: hasPrettier,
138
+ vitest: hasVitest,
139
+ jest: hasJest,
140
+ },
141
+ conventions: {
142
+ srcDir,
143
+ hasAppDir,
144
+ hasPagesDir,
145
+ tsconfigPaths,
146
+ },
147
+ files: {
148
+ packageJson: pkgPath || undefined,
149
+ tsconfig: tsconfigPath || undefined,
150
+ tailwindConfig: tailwindConfig || undefined,
151
+ componentsJson: componentsJson || undefined,
152
+ storybookDir: exists(rootDir, '.storybook') || undefined,
153
+ },
154
+ warnings,
155
+ };
156
+ }
157
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/stack/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAyClC,SAAS,gBAAgB,CAAC,QAAgB;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,GAAG,KAAe;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ,EAAE,IAAY;IACtC,MAAM,CAAC,GAAG,GAAG,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC;IACrG,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IACzC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,IAAI,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAElE,MAAM,KAAK,GAAG,OAAO,CACjB,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC;QAC5B,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC;QACrC,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC;QACpC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CACpC,CAAC;IAEF,sBAAsB;IACtB,IAAI,SAAS,GAAsC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE1F,IAAI,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1B,SAAS,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACxF,CAAC;SAAM,IAAI,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;QAClC,SAAS,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACxF,CAAC;SAAM,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QAChC,SAAS,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACpF,CAAC;SAAM,IAAI,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnC,SAAS,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzF,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,CAAC;IAED,oBAAoB;IACpB,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACnH,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC;QAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1F,IAAI,UAAU,CAAC,GAAG,EAAE,mBAAmB,CAAC;QAAE,eAAe,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpF,IAAI,UAAU,CAAC,GAAG,EAAE,gBAAgB,CAAC,IAAI,UAAU,CAAC,GAAG,EAAE,iBAAiB,CAAC;QAAE,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7G,gHAAgH;IAChH,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;QAAE,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAErE,IAAI,OAAO,GAA+C,SAAS,CAAC;IACpE,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,GAAG,UAAU,CAAC;SAC1D,IAAI,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,GAAG,SAAS,CAAC;SAC7D,IAAI,eAAe,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,GAAG,mBAAmB,CAAC;SACjF,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC;SACvD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,SAAS,CAAC;IAE3D,wBAAwB;IACxB,MAAM,YAAY,GAAG;QACjB,eAAe;QACf,MAAM;QACN,kBAAkB;QAClB,wBAAwB;QACxB,mBAAmB;QACnB,WAAW;QACX,cAAc;QACd,eAAe;QACf,mBAAmB;KACtB,CAAC;IAEF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,iBAAiB;IACjB,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;IAC3H,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhF,2CAA2C;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACrJ,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1I,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAEjD,mBAAmB;IACnB,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC1D,IAAI,cAAc,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC;IAED,iBAAiB;IACjB,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC/F,IAAI,aAAmD,CAAC;IACxD,IAAI,YAAY,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC;QAC/C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,aAAa,GAAG,KAAK,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAChB,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC;QACrC,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC;QACrC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACtC,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAE3C,OAAO;QACH,IAAI,EAAE,OAAO;QACb,SAAS;QACT,QAAQ,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;QAC/B,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE;QACpE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QACjD,OAAO,EAAE;YACL,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,OAAO;SAChB;QACD,WAAW,EAAE;YACT,MAAM;YACN,SAAS;YACT,WAAW;YACX,aAAa;SAChB;QACD,KAAK,EAAE;YACH,WAAW,EAAE,OAAO,IAAI,SAAS;YACjC,QAAQ,EAAE,YAAY,IAAI,SAAS;YACnC,cAAc,EAAE,cAAc,IAAI,SAAS;YAC3C,cAAc,EAAE,cAAc,IAAI,SAAS;YAC3C,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,SAAS;SAC3D;QACD,QAAQ;KACX,CAAC;AACN,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Token Sync Utilities
3
+ *
4
+ * Normalizes tokens into a small internal representation and can output:
5
+ * - CSS custom properties
6
+ * - Tailwind theme extension
7
+ * - Tokens Studio JSON
8
+ * - Style Dictionary JSON
9
+ */
10
+ export type TokenType = 'color' | 'dimension' | 'fontFamily' | 'fontWeight' | 'number' | 'string' | 'shadow' | 'duration' | 'easing';
11
+ export interface Token {
12
+ name: string;
13
+ value: string;
14
+ type: TokenType;
15
+ description?: string;
16
+ source?: {
17
+ file?: string;
18
+ originalName?: string;
19
+ };
20
+ }
21
+ export interface TokenParseResult {
22
+ tokens: Token[];
23
+ warnings: string[];
24
+ }
25
+ export declare function parseCssVars(content: string, sourceFile?: string): TokenParseResult;
26
+ export declare function tokensToCssVars(tokens: Token[], options?: {
27
+ selector?: string;
28
+ }): string;
29
+ export declare function tokensToTailwindTheme(tokens: Token[]): string;
30
+ export declare function tokensToTokensStudio(tokens: Token[]): string;
31
+ export declare function tokensToStyleDictionary(tokens: Token[]): string;
32
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/tokens/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAErI,MAAM,WAAW,KAAK;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACL;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAuDD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAiCnF;AA2BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CASxF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAkC7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAS5D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAU/D"}